微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2021-09-23

Redis之淘汰策略
Redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。

Redis 提供了 6 种数据淘汰策略:

  1. volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。

  2. volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。

  3. volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。

  4. allkeys-lru:从数据集中挑选最近最少使用的数据淘汰。

  5. allkeys-random:从数据集中任意选择数据淘汰,当内存达到限制的时候,对所有数据集挑选随机淘汰,可写入新的数据集。

  6. no-enviction:当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。

  7. allkeys-lfu 从数据集(server.db[i].dict)中挑选使用频率最小的数据淘汰,该策略要淘汰的key面向的是全体key集合,而非过期的key集合。

  8. volatile-lfu 从设置过期时间的数据集(server.db[i].expires)中挑选出使用频率最小的数据淘汰。没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失

如何配置:

我们通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能

maxmemory

值得注意的是,maxmemory为0的时候表示我们对Redis的内存使用没有限制。

根据应用场景,选择淘汰策略

maxmemory-policy noeviction

设置最大内存
config set maxmemory 100000
设置淘汰策略
config set maxmemory-policy noeviction
三、如何选择淘汰策略

下面看看几种策略的适用场景

allkeys-lru:如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。

allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。

另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。

备注:

1) 在64bit系统下,maxmemory设置为0表示不限制Redis内存使用,在32bit系统下,maxmemory隐式不能超过3GB。当Redis内存使用达到指定的限制时,就需要选择一个置换的策略

2)置换策略是如何工作的

理解置换策略的执行方式是非常重要的,比如:

客户端执行一条新命令,导致数据库需要增加数据(比如set key value)

Redis会检查内存使用,如果内存使用超过maxmemory,就会按照置换策略删除一些key

新的命令执行成功

3) 在Redis 4.x版本以后支持le LFU策略,最少频率使用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐