Redis六种淘汰策略

将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据。默认情况下 memcached就是这就方式。

LRU是Redis唯一支持的回收算法,本文讲解限制最大内存使用量的maxmemory指令,并深入讲解Redis所使用的近似LRU算法。

Maxmemory用于指定Redis能使用的最大内存。既可以在redis.conf文件中设置,也可以在运行过程中通过CONFIG SET命令动态修改。

如:CONFIG SET maxmemory 200mb

比如,要设置100MB的内存限制,可以在redis.conf中设置

limit for maxmemory so that there is some free RAM on the system for replica

maxmemory 100mb

将Maxmemory设置为0,则表示不进行内存限制。

当内存使用达到最大限制时,如果需要存储新数据,根据配置的策略的不同,Redis可能直接返回错误信息,或者删除部分老的数据。根据Maxmemory-policy配置的策略,来决定具体的行为。redis.conf配置如下:

according to the eviction policy selected (see maxmemory-policy).

maxmemory-policy noeviction

策略包括:
noeviction:不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息。大多数写命令都会导致占用更多的内存。

allkeys-lru:所有key通用;优先删除最少(less recently used, LRU)使用的key

volatile-lru:只限于设置了expire的部分;优先删除最近最少使用的key。

allkeys-random:所有key通用;随机删除一部分key.

volatile-random:只限于设置了expire的部分;随机删除一部分key

volatile-ttl:只限于设置了expire的部分;优先删除剩余时间(time to live, TTL)短的key

如果没有设置expire的key,不满足先决条件;则volatile-lru、volatile-random、volatile-ttl策略的行为和noeviction基本一致

设置淘汰策略时需要根据系统的特征选择合适的策略,在运行时也可以通过命令动态设置驱逐策略,并通过INFO命令监控缓存的Miss和hit来进行调优。

一般来说:
(1)如果分为热数据与冷数据,推荐使用allkey-lru策略。也就是,其中一部分key经常被读写。如果不确定具体的业务特征,那么allkeys-lru时一个很好的选择。

(2)如果需要循环读写所有的key,或者各个key的访问频率差不多,可以使用allkeys-random策略,即读写所有元素的概率差不多。

(3)假如要让Redis根据TTL来筛选需要删除的key,使用volatile-ttl策略

volatile-lru和volatile-random策略只要应用场景是:既有缓存,又有持久key的实例中。

驱逐的内部实现

驱逐过程可以理解为:
客户端执行一个命令,导致Redis中的数据增加,占用更多内存。
Redis检查内存使用量,如果超出Maxmemory限制,根据策略清除部分key
继续执行下一条命令,以此类推。

近似LRU算法

Redis使用的并不是完全LRU算法。自动驱逐的key,并不一定是最满足LRU特征的那个。而是通过近似LRU算法,抽取少量的key样本,然后删除其中访问时间最老的那个key。
在Redis中可以通过修改redis.conf文件中的如下配置,修改样本数量来调优算法精度。

maxmemory-samples 5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值