Redis学习拓展篇-----LRU算法

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淘汰算法

猜你喜欢

转载自blog.csdn.net/alvin_666/article/details/91357073