Redis 过期策略和内存淘汰机制「建议收藏」

Redis 过期策略和内存淘汰机制「建议收藏」在Redis中我们知道,我们可以给key设置一个expire time 时间,当key的过期时间到了之后,Redis就会删除掉这个key。

大家好,欢迎来到IT知识分享网。

过期策略

  在Redis中我们知道,我们可以给key设置一个expire time 时间,当key的过期时间到了之后,Redis就会删除掉这个key。

  那Redis是如何根据过期时间来删除掉这些key呢?定期删除+惰性删除。

  为什么是定期删除呢,为什么不用定时删除,我设置一个时间点在该时间点到了之后就删除过期的key这不好吗?

  为什么不使用定时删除?假设现在有一批key过期了,在这个时间点准备要删除这些key,但如果这些key数目非常之多,是不是挺消耗系统CPU资源的,而且缓存中一下子删除掉这么多key,是不是后面查询就不走缓存了,直接走数据持久层了。

定期删除+惰性删除  

   定期删除顾名思义,每隔一段时间我就删除。也就是说,Redis默认设置每100ms就检查是否有过期的key,有过期的key就删除。但是,Redis不是把所有的过期的key全部检查并全部删除(要是检查所有过期的key这一步操作就已经很耗资源了,你还全部删除。。)。

  Redis只是随机抽取一部分过期的key来进行删除,比如:Redis现在有1000个key都已经过期了,而Redis每100ms抽取一次,每次抽取了一部分100个,我把100个都删除了。但是不是其中还有900个过期的key未被删除,这就是定期删除导致的问题,还存在未被删除的key。

  于是就有惰性删除。惰性删除指的是当你查找某个key时,Redis先判断你这个key是否过期,如果过期,我给你这个key删除。还是上面那900个key举例:现在有900个key还未删除,此时有多个查找请求过来,是查900个key中的100个key,嗯,Redis先判断这个key是否过期,发现100个key都已过期,好我把它删除。但这样是不是还有一个问题,还有800个key未被删除这就是惰性删除的问题,因为你是查找某个key的时候判断是否过期,那么要是查找的key都不是过期的key或者查找的请求不多呢?

  那么就应该采用内存淘汰机制。

内存淘汰机制

  在redis.conf有一行配置

maxmemory-policy volatile-lru

IT知识分享网

  该配置就是配内存淘汰策略的:

  1) volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

  2) volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

  3) volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  4) allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

  5) allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  6) no-enviction(驱逐):禁止驱逐数据,新写入操作会报错

  如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

  

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6146.html

(0)
上一篇 2022-12-18 08:00
下一篇 2022-12-18 08:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信