七、Redis源码之LRU、LFU算法基本定义

内存资源对Redis来说是弥足珍贵的,有效的减少Redis的内存使用问题从而达到系统优化的目的。

一、LRU算法的基本原理

LRU算法:最近最少使用-Least Recently Used

从基本原理上来说,LRU算法会使用一个链表来维护缓存中每一个数据的访问情况,并根据数的实时访问,调整数据在链表中的位置,然后通过数据在链中位置,来表示数据是最近访问的,还是已经有一段时间没有访问了。

LRU算法会把链表的头部和尾部分别设置为MRU-most recently used端和LRU端。

LRU算法的执行,分为3种情况:

1、当有新数据插入时,LRU算法把该数据插入到链表头部,同时把原理链表头部的数据及其后的数据,都想尾部移动一位。

2、当有数据刚被访问一次之后,LRU算法会把该数据从它在链表中的当前位置,移动到链表头部,同时把原理链表头部的数据及其后的数据,都想尾部移动一位。

3、当链表长度无法再容纳更多数据时,若再有新数据插入,LRU算法就会去除链表尾部的数据,相当于数据从缓存中去除淘汰掉。

Redis并非严格按照LRU算法基本原理实现的,一个近似LRU算法的实现。

 

二、LFU算法基本原理

LFU算法:最不频繁使用-Least Frequently Used

从基本原理上来说,LFU算法是根据数据访问的频率来选择被淘汰数据的,访问次数和访问频率不能完全等同,访问频率是指在一定时间内的访问次数。

LFU算法的实现分3部分:

1、键值对访问频率

2、键值对访问频率初始化和更新

3、LFU算法淘汰数据

 

三、LRU和LFU入口函数相同

 

 

 

核心的参数配置在redis.conf文件中:

 

# maxmemory <bytes> 最大内存容量,一旦实际内存容量超过这个阈值时,根据maxmemory_policy配置项定义的策略,执行内存淘汰操作

# MAXMEMORY POLICY: 5大类淘汰策略(8种)

# volatile-lru -> Evict using approximated LRU among the keys with an expire set. 设置了过期时间的键值对
# allkeys-lru -> Evict any key using approximated LRU. 所有的键值对
#
volatile-lfu -> Evict using approximated LFU among the keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU.
#
volatile-random -> Remove a random key among the ones with an expire set. # allkeys-random -> Remove a random key, any key.
#
volatile-ttl -> Remove the key with the nearest expire time (minor TTL) 移除过期时间最近的
# noeviction
-> Don't evict anything, just return an error on write operations. 对于写请求不再提供服务,返回错误

 

惰性删除,核心配置项在redis.conf文件中:

############################# LAZY FREEING ####################################
异步释放内存
lazyfree-lazy-eviction(收回) no 对应缓存淘汰策略时的数据删除场景
lazyfree-lazy-expire no 对应过期key的删除场景
lazyfree-lazy-server-del no 对应隐式进行删除操作的server命令执行场景
replica-lazy-flush no 对应节点完成全量同步后,删除原有旧数据的场景

了解一下redis的缓存算法就好了,想深入了解可能要花点时间了,谢谢

 Redis 6种淘汰机制,看看你知道哪些? (qq.com)

posted @ 2022-09-12 00:13  chch213  阅读(362)  评论(0编辑  收藏  举报