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高级/
作者
Su Rourou
发布于
2025年3月29日
许可协议