Java-Redis:Redis高级
Redis
高级篇
分布式缓存
Redis持久化
- RDB:数据快照,fork子进程
- AOF:追加文件(命令日志文件)
- 混合持久化(Redis 4.0+)
Redis主从
- 全量同步:RDB
- 增量同步:repl_backlog(环形数组)
Redis哨兵
- 监控:每隔一秒ping,主观下线、客观下线
- 自动故障恢复:
- 选择master依据:slave与master断开时间长短、slave-priority(小)、offset(大)、运行id(小)
- 切换:slaveof no one
- 通知:Redis客户端
Redis分片集群
分片集群:多个master,互相ping
散列插槽:key和插槽绑定,16384个
集群伸缩:add-node(需要转移插槽)
故障转移:
- 自动故障转移:提升slave为master
- 手动故障转移:cluster failover
多级缓存
最佳实践
原理篇
Redis数据结构
数据结构
动态字符串SDS:动态扩容、内存预分配
intset:升序、唯一、二分查找
Dict:
- 字典、哈希表、哈希节点
- ht[0]平常用,ht[1]rehash(渐进式)
- 伸缩
ZipList:连续内存“双向链表”、连锁更新问题
QuickList:节点为ZipList的双端链表
SkipList:双向链表,score、ele排序,多层指针
RedisObject
数据类型 编码方式 OBJ_STRING int、embstr、raw OBJ_LIST LinkedList和ZipList(3.2以前)、QuickList(3.2以后) OBJ_SET intset、HT OBJ_ZSET ZipList、HT、SkipList OBJ_HASH ZipList、HT
Redis数据类型
String:embstr(小于44字节)、raw、int(整数)
List:
- 3.2前:ZipList(数量<512,大小<64字节),LinkedList
- 3.2后:QuickList
Set:
- intSet:数量<set-max-intset-entries
- Dict:key存元素、value为null
Zset:
- ZipList:数量<zset_max_ziplist_entries(128),大小<zset_max_ziplist_value(64)字节,element(前)和score(后)紧挨,按score升序排序
- Dict
- SkipList
Hash:
ZipList:数量<hash-max-ziplist-entries(512),
大小<hash-max-ziplist-value(64)
Dict
Redis网络模型
进程的寻址空间划分成两部分:内核空间、用户空间

5中网络模型对比:

Redis通信协议-RESP协议
过期key处理
惰性清理:查找key时判断
定期清理:逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
SLOW(initServer):执行频率默认为10,每次不超过25ms
FAST(beforeSleep):执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
内存淘汰
- noeviction: 不淘汰任何key,内存满时不允许写入新数据,默认。
- volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
- allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选
- volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。
- allkeys-lru: 对全体key,基于LRU算法进行淘汰
- volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
- allkeys-lfu: 对全体key,基于LFU算法进行淘汰
- volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰
Java-Redis:Redis高级
http://surourou8.github.io/2025/03/29/Java-Redis:Redis高级/