Redis Object的Idle Time
程序员文章站
2022-05-06 13:00:24
...
1. 获取object的idletime的算法
if (server.lruclock >= o->lru) {
return (server.lruclock - o->lru) * REDIS_LRU_CLOCK_RESOLUTION;
} else {
return ((REDIS_LRU_CLOCK_MAX - o->lru) + server.lruclock) *
REDIS_LRU_CLOCK_RESOLUTION;
}
2.redis每隔 REDIS_LRU_CLOCK_RESOLUTION更新一次server.lruclock,REDIS_LRU_CLOCK_RESOLUTION默认为10
server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) & REDIS_LRU_CLOCK_MAX;
3.#define REDIS_LRU_CLOCK_MAX ((1<<21)-1)
4.Redis为了节省内存,采取了一个折中的方案,采用21bit(redis中的comment说到是22bit,从上面来看应该是21bit)再乘以10s的方案,每隔10s更新一下server.lruclock,2^22能保存到时间间隔也只有1.5年左右,如果超过1.5年怎么办?算法1为了解决这个问题,提供了两个if分支,第一种是常见情况,object在读写以后更新lru,而系统每隔10s更新一次,假设一段时间内这个object没有被访问过那么就会有server.lruclock >= o->lru。第二种情况,如果超过1.5年server.lruclock就有可能变成一个较小的值,使得某些object的lru,大于server.lruclock,于是就有第二个if分支。
下一篇: Redis的Aof被阻塞原因调查