Redis系列:
对于Redis的一些基本知识,在之前的博客Redis——初识Redis中简单的介绍了。最近打算了解下Redis的一些底层内容,买了本书《Redis设计与实现》,这本书才看,也不好评价好坏。之所以选择这个本,是因为看到说这本书讲的是Redis的一些底层内容。
Redis对象
redis源码里面的结构体:
1 | typedef struct redisObject { |
LRU
在 LRU 模式下,lru 字段存储的是 Redis 时钟 server.lruclock。Redis 时钟是一个 24bit 的整数,默认是 Unix 时间戳对 2^24 取模的结果,大约 97 天清零一次。当某个 key 被访问一次,它的对象头的 lru 字段值就会被更新为 server.lruclock。
默认 Redis 时钟值每毫秒更新一次,在定时任务 serverCron 里主动设置。Redis 的很多定时任务都是在 serverCron 里面完成的,比如大型 hash 表的渐进式迁移、过期 key 的主动淘汰、触发 bgsave、bgaofrewrite 等等。
如果 server.lruclock 没有折返 (对 2^24 取模),它就是一直递增的,这意味着对象的 LRU 字段不会超过 server.lruclock 的值。如果超过了,说明 server.lruclock 折返了。通过这个逻辑就可以精准计算出对象多长时间没有被访问——对象的空闲时间。