RDB优缺点
优点:恢复快,可以压缩
缺点:
间隔时间太长
AOF开启
修改redis.conf配置文件
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
Redis主从
数据同步:
主写数据从能看到:
全量同步是主从第一次同步:
主需要判断是不是第一次同步,如果是第一次,先发数据版本信息,方便以后版本控制
第二 主执行bgsave,实行rdb文件,从节点清空本地数据,加载文件
主有一个缓冲区记录发送过程中产生的新数据
最后主发送缓冲区
主如何知道从是第一次来:如果是第一次来,主会把id给从,id不一致就是第一次
从做数据同步之前要跟主说自己的id,偏移量
增量同步是指从重启后同步,在这个过程中丢失的数据同步名叫增量同步,也是有一个缓冲区,会存从重启阶段主产生的数据(尚未同步的数据)
如果尚未同步的数据太多了,被覆盖了,就无法在进行增量同步,需要做全量同步
数据同步原理
主从节点的局限性,从节点挂掉一个还有其他节点,主节点只有一个,一旦挂了,整个集群不具备写的能力
主节点宕机解决:把从变成主(因为从一直在同步主的数据),当故障修复后也以新的为主,用哨兵监控
哨兵集群:
会不断检查主和从是否按照要求工作,并作主从切换
哨兵工作原理:
每隔一秒发送命令,主观下线和客观下线类似于投票,一个人认为下线是主观,大多数(可以配置)人认为下线是客观
选举新的主原理:根据断开时间长短,然后判断偏移量,越小越高,还可以根据id,offset最重要
新的选举出来后:哨兵会给新的主发,然后告诉其他节点新的主id
然后将故障的主标记为从,告诉新的主的id’
注意的点是:
集成哨兵机制步骤
- 引依赖
- 配置Redis地址
- 配置读写分离
分片集群
可以解决两个问题:海量数据存储问题,高并发写的问题
特征:有多个主(写),每个主保存不同数据,每个主都可以有多个从结点
不需要有哨兵,主节点互相监控
插槽
插槽的计算: {}是有效部分,如果{}里面有内容,如果不包含{},整个key都是有效部分,比如
集群模式下,一定要加 -c 例如
Redis如何判断某个key应该在哪个实例?
- 将16384个插槽分配到不同的实例
- 根据key的有效部分计算哈希值,对16384取余
- 余数作为插槽,寻找插槽所在实例即可
如何将同一类数据固定的保存在同一个Redis实例?
- 这一类数据使用相同的有效部分,例如key都以{typeId}为前缀
为什么radis可以动态扩容:
因为数据是跟着插槽走的
集群伸缩
添加节点:
生下来就是奴隶,可以指定主
故障转移(一般不问)
自动:
主节点宕机,自动提升一个slave(从)为新的master(主),之前的主就会变自动变成奴
手动:(有目的的迁移)
在新的主节点执行,告诉旧的主被替换,旧的会拒绝一切请求,旧的主会与新的主确定数据是否一致,新的主标记为主告诉其他子节点,旧的主变为奴(也可以直接停用)
RedisTemplate访问分片集群
1)引入redis的starter依赖
2)配置分片集群地址
3)配置读写分离
与哨兵模式相比,其中只有分片集群的配置方式略有差异