原作者:周电 越测越开森 (微信)
Redis(Remote Dictionary Server ),字面意思远程字典服务,是一种key-value型数据库。
相比于Oracle/mysql这种针对于磁盘操作的关系型数据库,redis是针对于内存的操作,所以redis的读写速度很快,是比较适合读写频繁但是数据量不大的场景。
同时相比于memcache这种只支持kv简单存储,redis支持string、list、hash、set、zset,同时还支持数据持久化。
一.redis的一些基础配置
(1)bind: 指定接受哪个ip的请求,如果配置成下面这个,那就是只有本机才能连上redis,一般这个配置可以注释掉
bind 127.0.0.1
(2)redis的监听端口:port 6379
(3)是否开启守护者模式:no是不开启,redis不能后台运行;一般最好是yes开启
daemonize yes
(4)rdb持久化的配置
如果60秒内有1w个key有变化或者300秒有10个key有变化或者是900秒有1个key有变化,会写一次rdb快照。
这里简单介绍一下redis持久化,redis因为数据是写在内存,如果发生故障和重启的话,内存的数据肯定就没了。redis的持久化机制就是把数据备份到磁盘上,如果有数据丢失可以从这些磁盘文件恢复数据。
redis有两种持久化的方法,一种是rdb一种是aof,rdb是写磁盘快照的方式,可以通过手动执行save和bgsave的方式手动执行,区别在于save是会阻塞redis服务,bgsave是异步执行;还有一种方式是自动执行就是通过下面三个配置达到对应的条件就触发一次bgsave。aof持久化类似将redis的操作当作日志记录下来,然后恢复的时候照着执行一次,感觉跟mysql使用binlog回滚数据有点类似。
save 900 1
save 300 10
save 60 10000
(5)rdb快照文件名称,如果redis有多个节点的话最好加上端口号进行区分,比如dump-6379.rdb
dbfilename dump.rdb
(6)redis存放数据的目录,比如之前说的rdb和aof文件存放的目录
dir /User/dian/redis
(7)重命名一个命令,比如FLUSHALL和KEYS这种很危险的命令,线上要禁止使用,就可以把这些命令重命名为空,或者重命名成一个复杂的字符
rename-command FLUSHALL ""
(8)aof持久化方式存储的文件名
appendfilename "appendonly.aof"
(9)下面三个是aof持久化的方式,always是每次写入都同步到磁盘;everysec是每秒同步一次;no是不同步
appendfsync always
appendfsync everysec
appendfsync no
还有其他redis配置限于篇幅就不一一列举了。
既然说到了redis配置,如果redis启动了以后还想要改怎么办,如果改完配置文件再重启是比较麻烦的,可以使用config get查看配置然后使用config set直接修改配置
二.redis集群模式
随着数据的增多,一台redis机器的内存不够,需要多个redis实例一起部署成一个集群。这里先简单介绍一下redis solt,redis一共有16384个solt,所有的key要存储到redis,首先要对这个key进行CRC16算法然后再模16384得出的结果就是这个key是存储在redis的对应的solt槽位上,redis集群会把所有solt平均分配到每台redis实例上,查询key的时候可以根据key所在的槽位去对应的redis实例上查询即可。除了redis cluster还有Twemproxy这种模式可以代理redis实例,客户端不需要关心具体连接哪个redis实例直接通过代理的方式访问redis,还可以减少redis实例的连接数量
下面简单说下如何新建一个redis cluster集群,比如说6个节点3主3从,端口号从6379到6384
(1)首先每个实例都需要新建一个配置文件,有几个关键配置必须修改
如果开始持久化,rdb和aof的存储文件名称建议改成每个节点独有的名称
dbfilename dump-6379.rdb
appendfilename "appendonly-6379.aof"
(2)然后端口号port改成各自实例的端口,daemonize改成yes后台启动
cluster-enabled 改成yes,支持集群模式
下面这两个改成各自端口的文件名
pidfile /var/run/redis_6379.pid
cluster-config-file nodes-6379.conf
(3)然后先通过配置文件的方式启动各个节点
redis-server redis-6379.conf ;redis-server redis-6380.conf.....
redis 5.x以前的版本可以使用
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384来创建集群
5.x版本建议使用
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
--cluster-replicas 1参数的意思是每个主节点的从节点个数,如果0的话就全部都是主节点,这里传1就是1主对1从
创建完成以后,随便进入一个节点,使用cluster nodes查看集群情况,途中红框就是表示这个主节点分到的solt槽位
我们随便set一个值试试,提示(error) MOVED 6918 127.0.0.1:6380,就是说这个key应该是分配到6380这个节点上
到6380节点上测试一下
集群主从切换:
redis cluster可以在从节点执行 CLUSTER FAILOVER来进行主从切换,切换完成后可以看到6384变成了master,对应原来的master 6379变成了slave
redis cluster在主节点挂掉的情况下,超时一段时间以后,会自动进行主从切换
先kill掉6384节点,查看集群信息6384已经disconnected
再过一段时间(超过cluster-node-timeout节点超时时限配置的时间)后,6379节点自动切换成主节点
三.redis5.0的一个新数据类型
redis除了之前的5种数据类型,在5.0新增了一个stream类型,这个跟kafka消息队列比较相似,可以有生产者产生消息,消费者消费消息
下面简单了解一下,xadd是增加消息,命令格式如下
xadd key ID field string [field string ...]
ID传*表示redis自动生成序列id ,field string [field string ...]就是消息内容
然后可以通过xread的方式消费消息
当然还可以通过xgroup create创建消费组然后用xreadgroup来消费消息,这里就不再继续展开了。