内存资源对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)