最近在看<<redis实现与分析>>这本书,在学习redis之前,学长就建议我可以学习一下redis的淘汰策略 LRU 和 LFU 策略
LRU策略:使用和操作系统中的LRU近似的一种说法,在所有的key中找到一部分,找出其中距离现在访问最迟的key,并且淘汰
LRU行为配置参数:
maxmemory , 缓存数据占用的内存限制,如果缓存的数据消耗的内存超过这个数值的限制的话,会触发数据淘汰
maxmemory_policy 淘汰策略,定义参与淘汰的数据的类型和属性
maxmemory_samples 随机采样的精度,配置越大,越接近LRU
Redis维护了24位时钟,每隔一段时间会更新这个时钟,每个key对象内部维护了一个24位的时钟,新增的话会把系统的时钟赋值给这个内部对象时钟.我现在进行LRU,首先拿到当前的全局时钟,之后找出距离全局时钟距离时间最久的进行淘汰,全局时钟只有24位,key可能会超过24位,这个时候就把系统时钟和内部对象时钟相加,值最大的被淘汰
struct redisServer
{
....
unsigned lruclock:LRU_BITS;
...
};
typedef struct object
{
...
lru:LRU_BITS;
....
};
该计数器调用getLRUClock获取当前系统的毫秒数,作为LRU时间数,该计数器占用了24位,但是在这里如果超出24位就是超出194天之后,会重新赋值,
Redis 中还有一个缓冲池的概念,当每一轮移除Key的idle time , 如果它的idle time 比pool 里面idle time 最大的,并且 : pool 里面的key