Redis过期与缓存淘汰策略

redis过期策略

redis 过期策略是:定期删除+惰性删除。

所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。假设 redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上的灾难。实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?

所以就是惰性删除了。这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。

但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,这个时候就需要缓存淘汰策略

为什么需要缓存淘汰策略

Redis是以内存为基础的存储中间件,内存空间是有限的且昂贵,在我们数据大到占满内存时,我们就需要考虑增加机器内存或者采取一定的淘汰策略来保证存储空间可用
在Redis的配置文件redis.conf中,配置maxmemory的大小


maxmemory 4gb
# 使用以下命令配置 maxmemory
CONFIG SET maxmemory 4gb

缓存淘汰策略

倘若实际的存储中超过了Redis的配置参数大小,Redis中有淘汰策略,把需要淘汰的key给淘汰掉

不进行数据淘汰的策略

  • noeviction 当内存不足以容纳新写入的数据时,新写入数据会报错

在设置了过期时间的数据进行淘汰

  • volatile-lru 当内存不足时,在设置了过期的键空间中,移除最近最少使用的key
  • volatile-ttl 当内存不足时,在设置了过期的键空间中,移除较快过期的健
  • volatile-random 当内存不足时,从设置了过期时间的键中随机淘汰
  • volatile-lfu 从设置了过期时间的键中,淘汰访问最近频率最低的数据

在所有数据中进行淘汰

  • allkeys-lru 在所有数据中移除最近最少使用的key
  • allkeys-random 在所有数据中,随机淘汰
  • allkeys-lfu 在所有数据中,淘汰访问最近频率最低的数据

redis中,默认是不删除,no-enviction,内存满了返回error

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值