欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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分支。