• Redis中的定期删除缓存和惰性删除缓存策略哪个比较好?
  • 发布于 2个月前
  • 302 热度
    0 评论
  • Scys
  • 5 粉丝 39 篇博客
  •   
在使用redis缓存数据的时候,大多数情况下,我们都会对缓存的数据设置一个过期时间。当超过这个过期时间,缓存数据会失效,此时,redis会删除过期数据以节省内存。问题来了,redis是如何删除缓存数据的?删除过期数据的策略有哪些呢?首先说结论:redis里面使用定期删除和惰性删除两种策略

一 定期删除
Redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。这个100ms是如何来的呢?在redis的配置文件redis.conf中,有这么一个配置选项:hz

这个选项的作用,文档里面说得很清楚:Redis里面执行后台任务的时间间隔,默认就是10,表示1s内执行10次后台任务,比如关闭超时的客户端连接,删除过期时间的key等。这个选项的范围值是1到500,建议这个值的设置最好不要超过100,因为需要耗费更多的CPU。

另外还需要说明的是,这种抽取是随机的。为什么是随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载。同样的,这里的随机抽取一些,这个“一些”是多少呢?在redis的配置文件redis.conf中,由maxmemory-samples属性决定的,默认为5。

由于定期删除只是随机抽取部分key来检测,这样就会出现大量已经过期的key并没有被删除,这也就导致,有时候虽然有大量的key已经过了失效时间,但是redis的内存还是被大量占用。为了解决这个问题,Redis又引入了惰性删除。

二 惰性删除
惰性删除不是去主动删除,而是在你要获取某个key 的时候,redis会首先去检测一下这个key是否已经过期,如果没有过期则返回给你对应的值;如果过期了,那么redis会删除这个key,不会返回给你。

三  策略对比

惰性删除:
1.内存占用严重
2.延时执行,CPU利用率高
3.空间换时间
定期删除:
1.内存定期随机处理
2.每秒花费固定CPU资源维护内存
3.随机抽查,重点抽查

用户评论