第一步:
官网:redis.io
命令文档:http://redisdoc.com
远程:redisdesktop.com
下载redis到 usr/local/
查找jar包: search.maven.org
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz $ tar xzf redis-5.0.5.tar.gz $ cd redis-5.0.5 $ make
make后会报2个错,需要 yum install gcc -y 安装gcc
make的时候最好加上sudo,有些文件需要root权限
清零上一次make后产生的文件: make distclean
make install: 可以在任意usr/bin下执行redis/usr/下的可执行文件
第二步:
启动的几种方式:
1.$ src/redis-server
默认端口:6379
早期版本好像成为前台启动,Ctrl+C后或者退出窗口后就会结束
但是在5.05版本退出之后也在启动,并未终止
2 ./redis-server &
后台启动并输出日志到nohup.out
nohup.out /usr/local/redis/src/redis-server
关闭: src/redis-cli shutdown
报错:ERR Errors trying to SHUTDOWN. Check logs.
日志文件路径错误,找到redis下redis.conf
sudo vi redis.conf
找到 logfile "" , dir ./
修改为: logfile /usr/local/redis/redis_log/redis_log.log
如果/usr/local/redis 下面没有相应的文件夹和文件对应创建且 赋予读写权限
使用指令: sudo chmod 777 redis_log.log
改 redis.conf
logfile "/usr/local/redis-5.0.5/redis_log/redis_log.log"
dir /usr/local/redis-5.0.5/redis_dbfile/
改了配置文件后还未生效,所以得kill -9 端口号 之后 启动redis 再试下shutdown
3.3中客户端:
1.命令行客户端:redis-cli
2.redis远程客户端:
命令:
切换库:select 5
删除库内所有数据: flushall
删除本库所有数据: flushdb
获取redis的所有配置项: config get *
退出redis客户端: exit
查看key的数目:DBSIZE
查看redis服务器的统计信息:info
列出所有key:keys *
存在key:exists key
将当前库中的key移动到给定的库中:move key db
设置key的过期时间:expire key seconds
查看key过期时间:ttl key
查看数据类型:type key
删除key:del key
数据类型5种:
1.字符串String:放在内存里面,速度非常快,甚至可以存图片,将图片base64后就可以存放。
操作:set,get,
incr:将数字加1 如果key不存在,会初始化0后再加1
decr:将数字减1 如果key不存在,会初始化0后再减1
setex:设置key,过期时间,value
setnx:如果存在就不设置
getset:设置key的值 并返回之前的value
STRLEN:获取key的value的长度
append:如果key有值,则加到value,如果没有,则设置为value
incrby:每次增加步长
decrby:每次减少步长
getrange:取一个范围的值
setrange:从第几个下标替换为新的字符串
mset:同时赋值一个或多个key的值
mget:同时获取一个或多个key的值
哈希类型hash:
hset:key: key value设置一个hash值 也可以设置多个啊
hget:根据Key获取值
hmset: key: field:value field:value
hmget:获取1个key的多个key值
hgetall:获取所有key的值或域
hdel:删除key中的指定的1个或多个field
hkeys:查看key的所有的字段
hvals:查看key的所有的值
hlen:获取hash表中Key中的个数
hexists:查看hash表给定field是否存在 存在返回1 不存在返回0
hincrby:给field的value加值
hincrybyfloat:给field的value加浮点值
hsetnx:当field不存在的时候会设置成功
列表类型list
lpush:插入列表左边
rpush:插入列表右边
lrange:查看范围内的数据
lpop:把列表左边数据剔除
rpop:把列表右边数据剔除
lindex:获取下标为指定位置的元素
llen:获取长度
lrem:删除key中指定长度的与value值相等的数据
ltrim:删除位置以外的数据
lset:将指定位置的value换掉
linsert:在key的value之前或之后插入数据
集合类型Set
sadd:将1个或多个member加入到集合key中,即集合中不出现重复数据
smembers:获取集合Key中的所有成员元素
sismeber:判断member是否是集合key的成员
scard:获取集合里面的元素个数
screm:删除集合key的一个或多个member元素
srandmember:随机返回集合一个元素
spop:随机删除集合一个元素
smove:将member元素从一个集合移动到另一个集合
有序集合类型zst
zadd:将1个或多个member元素及其score值加入到有序集合key中
zrem:删除有序集合key中的1个或多个成员
zcard:获取有序集合中key的元素的个数
zrank:获取有序集合中成员member的排名,有序集合按score值从小到大排序
zrevrank:获取有序集和key中member的排名,有序集合按score值从大到小排序
zrangebyscore:获取有序集合key中,score介于最小值到最大值之间的成员
zrevrangebyscore:获取有序集合key中,score介于最大值到最小值之间的成员
zcount:获取有序集合中,score介于最大值和最小值之间的个数
zrange:获取key中按score从小到大排序
zrevrange:获取key中按score从大到小排序
第四布:
java操作redis
1.新建一个maven项目 加入依赖:
2.连接redis
Jedis jedis=new Jedis("192.168.152.133",6379);
System.out.println(jedis.ping());
重启后有可能远程连接不能用,可能是默认开启防火墙,
查看防火墙: systemctl status firewalld.service
停止开机启动防火墙: systemctl disable firewalld.service
redis发布订阅:
发送者发送消息,订阅者接收消息
发布订阅也叫生产消费者模式,是实现消息队列的一种
命令: SUBSCRIBE channel(这个是发布者和订阅者约定的频道,订阅者接收频道)
PUBLISH channel(发布者发布频道)
redis事务:
1.正常情况:
MULTI:用MULTI告诉redis,接下来执行的命令你先不要执行,而是要把他们存起来(开启事务)
SADD “user1” 2第一条命令进入等待队列(命令入队)
SADD “user2” 1第一条命令进入等待队列(命令入队)
EXEC 告知redis执行前面发送的两条命令(提交事务)
2.错误情况:
MULTI
SADD “user1” 2
set k4
EXEC 会直接报错不执行
3.例外情况:
MULTI
SADD "user1" valu
incr user1
EXEC
4.放弃情况:
discard
5.复杂情况:
悲观锁:每次拿数据都认为别人会修改该数据,所以每次拿上数据都会上锁,这样别人拿数据就会block阻塞直到拿到锁。传统的关系型数据库里边就用了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁,让别人无法操作该数据
乐观锁:就是很乐观,拿数据的时候认为别人不会修改数据,所以不会上锁,但是在更新的时候会检查下最初的数据和被修改时数据是否一致,如果不一致,则不会修改,一般使用版本号机制进行判断,如果提交的版本大于当前版本,则予以更新,否则会认为是过期数据,不与更新。
版本号机制:数据表会添加一个version字段来实现读取数据,之后更新时对此版本号加1,此时将提交的版本号与数据库表对应的当前版本进行对比,如果提交的数据版本号大于数据库表当前版本,则予以更新,否则不与更新
watch机制:
watch k1
redis持久化:
1.RDB方式:redis database 就是在指定时间内将内存的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存
是在redis.conf中配置
配置格式:
save 900 1
save 300 10
save 60 10000
dbfilename:设置RDB的文件名,默认名是dump.rdb
dir:指定RDB和AOF文件的目录
2.AOF方式:Append-only File Redis每次接收到一次改变数据的命令时,它将该命令写到一个AOF文件中(只记录写操作,读操作不记录),当Redis重启时,他通过执行AOF文件中所有的命令来恢复数据
是在redis.conf中配置:
配置格式:
appendonly:默认是no,开启yes即开启了aof持久化
appendfilename:指定aof文件名,默认文件名是appendonly.aof
appendfsync:
no 不主动进行同步操作,而是根据系统来做,即每30秒一次,比较快但不是很安全
always:每次执行写入都会执行同步,慢一些但是比较安全
everysec:每秒执行一次同步操作,比较平衡,介于安全和速度之间
auto-aof-rewrite-percentage:当目前aof文件大小超过上一次重写的aof文件大小的百分之多少时会再次进行重写,如果没有重写,则以启动时的aof文件大小为依据
auto-aof-rewite-min-size:允许重写的最小的AOF文件大小
aof是完整保存方案
默认先加载aof文件
redis集群和高可用哨兵模式:
主从复制(master/slave):
一主多从:主主要是写,从主要是读,从不能写,会报错,如果主挂了,需手动将别的从改成主,等之前主启动了再配到新的主下,也就是冷处理。
更改配置文件:
主服务器:
include /usr/local/redis-5.0.5/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
从服务器:
include /usr/local/redis-5.0.9/redis.conf
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 127.0.0.1 6380
如果master宕机了 主服务器挂了之后,需要把从变为主,命令是:
slaveof no one
再把其他从服务器挂到这台服务器下,命令是:
slaveof 主机ip地址
等宕机的这台主机恢复后,再把这台主机也配到新的主服务器就行。
总结: 1个master有多个slave,slave挂掉后读处理变慢 master下线后,无法读权限
故障转移需要手动操作,要实现自动化就得用Sentine哨兵,实现故障自动转移
高可用哨兵模式:
复制3份sentinel.conf,为sentinel26380.conf,sentinel26381.conf,sentinel26382.conf
修改Port:26380,26381,26382
修改sentinel monitor mymaster 127.0.0.1 6380 2
执行以下命令:
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26381.conf
./redis-sentinel ../sentinel26382.conf
监控3个redis-server
会自动执行故障转移操作,提升slave为master
redis安全问题:
设置密码:在redis.conf下 requirepass 123456
客户端连接需 AUTH 123456
绑定ip: 把 bind 127.0.0.1 改成允许访问redis的ip地址
命令禁止: rename-command FLUSHALL 重命名命令
rename-command FLUSHDB ""禁止用FLUSHALL命令
rename-command FLUSHALL ""禁止用FLUSHALL命令
rename-command CONFIG 重命名命令
rename-command CONFIG ""禁止CONFIG命令
修改端口
特点:redis足够简单稳定
支持多种数据类型
内存存储读写性能优秀
提供持久化的支持
支持部分事务支持操作