内存淘汰:就是当redis内存达到设置的阈值时,主动挑选部分key删除以释放内存
可以分为两个问题:
1,redis什么时候去检查内存够还是不够?
2,怎么来决定删除哪些key?(淘汰策略)
1,如果配置了内存上限,redis在任何命令执行之前都会进行内存的检查,如果内存不够的话执行淘汰策略
int processCommand(client *C) { //如果服务器设置了server . maxmemory属性,并且并未有执行lua脚本 if (server .maxmemory && ! server . Aua_ timedout) { //尝试进行内存淘汰per formEvictions int out_of_memory = (performEvictions() == EVICT_ FAIL) ; if (out_ of_ memory && reject_ cmd_on_ oom) { rejectCommand(C,shared. oomerr) ; return C_ _OK; } // .... } }
2,redis的八种内存淘汰策略
◆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算法进行淘汰
比较容易混淆的有两个:
LRU (Least Recent Use) : 最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU (Least Frequent Use) :最少频率使用,会统计key的访问呢频率,值越小淘汰优先级越高。
Redis的数据都会被封装为RedisObject结构,根据所配置的淘汰策略,按需记录不同的值。
LFU的访问次数之所以叫逻辑访问次数,是因为并不是每次key被访问都计数,因为记录次数的只有八位,最多只能记录255次,所以是记录运算出的逻辑访问次数:
(1)生成0-1之间的一个随机数R
(2)计算1/ (旧次数*lfu_log_factor +1),记录为p,lfu_log_factor默认为10
(3)如果R<P,则计数+1,且最大不超过255
(4)访问次数会随时间衰减,记录上一次访问时间间隔lfu_decay_time分钟(默认1),计数器-1
标签:Redis,lfu,访问,内存,key,TTL,淘汰 From: https://www.cnblogs.com/tyleaf/p/17113468.html