为什么选择集群
- 性能
- 扩展
- 可用性 高可用
1. 主从复制
脱离集群 slaveof no one
加入集群 slaveof ip port
查看集群信息 info replication
从节点不可以写数据。
- 加入集群
- 从节点中定时任务,1s执行一次,确认socket连接
- 首次全量复制,master bgsave生成rdb(repli-timeout 60s),发送给slave,缓冲区
- 命令传播
合并数据包,减少带宽,增加了延迟。
缺点
- 无法自动切换master
2. Sentinel 哨兵 提供高可用 2.8+
sentinel中每个节点都是平等的
- 主节点连接超时 默认30s
- 标记下线 – 主观下线
- 客观下线 – 超过半数
- 选举 – 遍历所有节点,根据master名称返回主节点
3. redis cluster
三主三从,在服务端实现分片
- 启动六个服务
- client-cli --cluster
- redis提供预制方案
Raft算法
- 先到先得
- 少数服从多数
150ms -300ms
收到leader发送的心跳包,则重新计时,防止无为选举
分布数据方案
- hash(key)% n
- 一致性hash,hash环,2^32-1, 虚拟节点解决数据倾斜,使数据分布均匀
- 虚拟槽slot,key经过crc16算法,然后取模
cluster keyslot bobo
set a{bo}a 1
指定到同一个节点redis-cli -c -p 6379
-c 集群- 客户端需要支持 smart client
- 集成replication,sentinel
客户端通信原理
TCP ,默认6379
pipeline
分布式锁
- 互斥
- 死锁
- 只有自己到锁才能释放
数据一致性
- 先更新数据库,再删redis
- 先删除redis,再删除数据库
- 多个线程并发导致数据不一致
- 延时双删 更新后删除redis
热点数据发现
- monitor
缓存雪崩
热点数据同时失效,导致数据库压力太大
- random
- 永不过期
- 预更新
缓存穿透
布隆过滤器
- 离线数据加载到布隆过滤器
- 布隆过滤器查询
- 过滤器中不存在,直接返回
- 过滤器中存在,cache不存在,请求数据库
- 数据库返回结果