ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-09-12 00:33:34  阅读:204  来源: 互联网

标签:链表 Redis LFU 访问 算法 源码 LRU 数据


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

标签:链表,Redis,LFU,访问,算法,源码,LRU,数据
来源: https://www.cnblogs.com/chch213/p/16275170.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有