LRU产生的原因:解决Redis内存超出物理内存限制时,内存和磁盘产生频繁交换,导致Redis性能下降
在生产环境中不允许出现交换行为,为了限制使用最大使用内存,Redis提供配置参数maxmemory用于限制内存超出期望大小
实际内存超出maxmemory时Redis提供的可选策略:
- noeviction:不会继续服务写请求(del除外),不影响读请求,好处保证数据不丢失。默认的淘汰策略
- volatile-lru:尝试淘汰设置了过期时间的key,最少使用的key被优先淘汰,没有设置的不会被淘汰
- volatile-ttl:和上一条几乎一样,不过淘汰策略不是lru,而是比较key的剩余寿命ttl的值,越小越优先淘汰
- volatile-random:和上面的几乎一样,不过淘汰的key是过期key集合中随机的key
- allkeys-lru:区别于volatile-lru,这个策略要淘汰的key对象是全体key集合,而不是过期key集合
- allkeys-random:也是淘汰所有的key集合,只是key是随机
volatile-xxx只是会针对带过去时间的key
allkeys策略是针对所有的key进行淘汰
将Redis用作缓存时使用allkeys-xxx策略
如果Redis中的数据需要持久化时,使用volatile-xxx策略
1、LRU算法
实现LRU算法:
- 需要key/value字典
- 一个附加链表,链表中的元素按照一定的顺序进行排列
- 空间满时会踢掉链表尾部的元素
- 当元素被访问时,会将元素的位置移动到链表头部
链表的元素排列顺序就是最近被访问的时间顺序
2、近似LRU算法
Redis中使用的是一种近似LRU算法和LRU算法有区别。
不直接使用LRU算法的原因:需要消耗大量额外内存,并且需要对现有的数据结构进行较大改造
近似LRU算法:在现有的数据结构的基础上使用随机采样法来淘汰元素,在Redis中为了实现给每一个key增加了一个额外的小字段,长度是24个bit,即最后访问的时间戳
LRU算法在删除时用的策略是:懒惰删除,在redis进行写操作时进行内存检测,然后执行LRU淘汰算法
标签:Redis,算法,LRU,内存,key,淘汰 来源: https://blog.csdn.net/alvin_666/article/details/91357073
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。