Redis的数据过期清除策略、内存淘汰策略(8种)

在使用Redis时,我们一般会为Redis的缓存空间设置一个大小,不会让数据无限制地放入Redis缓存中。可以使用下面命令来设定缓存的大小,比如设置为4GB:

CONFIG SET maxmemory 4gb

既然 Redis 设置了缓存的容量大小,那缓存被写满就是不可避免的。当缓存被写满时,我们需要考虑下面两个问题:决定淘汰哪些数据,如何处理那些被淘汰的数据。

1. Redis的数据过期清除策略:定期删除 + 惰性删除

如果我们设置了Redis的key-value的过期时间,当缓存中的数据过期之后,Redis就需要将这些数据进行清除,释放占用的内存空间。Redis中主要使用定期删除 + 惰性删除两种数据过期清除策略。

1、过期策略:定期删除+惰性删除:

  • 定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载。

为什么不用定时删除策略呢?
定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略。

  • 惰性删除:定期删除可能导致很多过期的key 到了时间并没有被删除掉。这时就要使用到惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且过期了,是的话就删除。

2、定期删除+惰性删除存在的问题:
如果某个key过期后,定期删除没删除成功,然后也没再次去请求key,也就是说惰性删除也没生效。这时,如果大量过期的key堆积在内存中,redis的内存会越来越高,导致redis的内存块耗尽。那么就应该采用内存淘汰机制。

2. Redis的缓存淘汰策略

Redis共提供了8中缓存淘汰策略,其中 volatile-lfu 和 allkeys-lfu 是Redis 4.0版本新增的。默认是noeviction(禁止驱逐)

  • noeviction:不进行淘汰数据。一旦缓存被写满,再有写请求进来,Redis就不再提供服务,而是直接返回错误。Redis 用作缓存时,实际的数据集通常都是大于缓存容量的,总会有新的数据要写入缓存,这个策略本身不淘汰数据,也就不会腾出新的缓存空间,我们不把它用在 Redis 缓存中。
  • volatile-ttl:在设置了过期时间的键值对中,移除即将过期的键值对。
  • volatile-random:在设置了过期时间的键值对中,随机移除某个键值对。
  • volatile-lru:在设置了过期时间的键值对中,移除最近最少使用的键值对。
  • volatile-lfu:在设置了过期时间的键值对中,移除最近最不频繁使用的键值对
  • allkeys-random:随机删除一个key
  • allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。
  • allkeys-lfu:在所有的键值对中,移除最近最不频繁使用的键值对

源文件相关配置(不同的版本可能有差异,重要的说明项已提供翻译):

# WARNING: not setting maxmemory will cause Redis to terminate with an
# out-of-memory exception if the heap limit is reached. 
# 警告:未设置maxmemory将导致Redis在达到堆限制时发生内存不足异常

# maxmemory <bytes>
# 设置最大内存,默认单位是byte,即字节

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
# 最大内存策略:当达到最大内存时,Redis如何选择删除什么。您可以选择五种行为:
#
# volatile-lru -> remove the key with an expire set using an LRU algorithm :使用LRU算法删除具有过期集的密钥
# allkeys-lru -> remove any key according to the LRU algorithm :根据LRU算法删除任何密钥
# volatile-random -> remove a random key with an expire set :删除带有过期集的随机密钥
# allkeys-random -> remove a random key, any key :删除一个随机密钥,任何密钥
# volatile-ttl -> remove the key with the nearest expire time (minor TTL) :删除具有最近过期时间的密钥
# noeviction -> don't expire at all, just return an error on write operations :完全不过期,只是在写操作上返回一个错误
#
# 默认的是:最大内存策略:不清除
# The default is:
# maxmemory-policy noeviction

3. Redis中的LRU和LFU算法

Redis的数据过期清除策略 与 内存淘汰策略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值