Redis - 扩展 - LRU

1、当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,将使Redis性能急剧下降。但是在生产上时不允许出现这样的情况的,为了限制最大的使用内存,Redis提供了配置参数maxmemory来限制内存,当实际内存超出maxmemory时,Redis提供了几种可选策略来腾出新的空间

1)noeviction 不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。

2)volatile-lru 尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。

3)volatile-ttl 跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。

4)volatile-random 跟上面一样,不过淘汰的 key 是过期 key 集合中随机的 key。

5)allkeys-lru 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。

6)allkeys-random 跟上面一样,不过淘汰的策略是随机的 key。

2、LRU算法

LRU算法需要key/value以及一个链表,链表内的元素按照访问时间进行排序,即刚刚访问的元素会排到首部,如果列表满了,将尾部的元素删除

3、近似LRU算法

Redis采用近似LRU算法,其规则比较简单,在现有数据结构的基础上使用随机采样法来淘汰元素,Redis为了实现近似采样法,给每个key增肌了个额外的小字段,最后被访问的时间戳。

LRU淘汰的处理方式只有懒惰处理,当Redis执行写操作,发现内存超出maxmemory,会执行一次淘汰,这个算法是随机采样出5个key(可以配置),然后淘汰掉最旧的key,如果淘汰完,还是超出maxmemory,继续淘汰,直到内存低于maxmemory为止。

如何淘汰根据maxmemory-policy配置,采样的大小可以根据maxmemory_samples的配置。

Redis3.0算法中增加淘汰池,提升了LRU的算法效果,没次淘汰循环中,新随机出来的key列表和淘汰池中的key列表进行融合,淘汰掉最旧的一个key,保留剩余较旧的key列表放入淘汰池中留待下次循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值