Redis设置过期以及内存淘汰策略

一 Redis设置过期时间

Redis有一个很实用的功能,可以为数据库的值设置过期时间。这在很多场景下都有用,例如一定时限内有效的验证码,一些登录信息。每次set key的时候,都可以使用expire time设置过期时间

二 Redis过期回收机制

那么Redis是如何回收过期的值的?有两种方式:定期删除和惰性删除

  • 定期删除

    默认每隔100ms就抽取一些设置了过期时间的值检查,如果过期就删除
  • 惰性删除

    设置了过期时间的值如果过期了,手动检查这些值才会被redis删除,这是一种比较懒的方式,所以叫惰性删除
  • 为什么不直接删除所有过期值

    在高并发场景下,一瞬间可能产生很多值,想要删除所有过期值,就得遍历一遍所有设置了过期时间的值,这显然不可取,遍历几万甚至几十万几百万个值是很耗时的

三 Redis过期回收机制的问题

我们可以从回收机制的方式中看出来,随机抽取设置了过期时间的值判断是否删除,那肯定会有漏网之鱼,如果一瞬间数据量庞大,那么漏网之鱼会更多,那些没有被回收的过期值就这么堆积起来,堆积到一定数量就会导致内存不足了

四 解决Redis过期回收机制的问题(内存淘汰)

那我们如果解决上述问题呢?Redis引入了内存淘汰机制,提供了六种机制可供选择。从大类上主要分为最近最少删除和随机删除。
所谓内存淘汰,即在内存不足时,我们应该删除一部分可能用不到的值,把他们的空间腾出来给最新的值,这是因为在很多业务中,最新最热的操作或者用户总是优先级较高的

内存淘汰策略

  • volatile-lru

    在已设置过期时间的值里删除最近最少使用的值
  • volatile-ttl

    在已设置过期时间的值里删除将要过期的值
  • volatile-random

    在已设置过期时间的值里随机删除值
  • allkey-lru

    所有值里删除最近最少是使用的值
  • allkey-random

    所有值里随机删除值
  • no-eviction

    如果内存不够就不准写入值
    4.0版本之后增加了两种:
  • volatile-lfu

    在已设置过期时间的值里删除最不经常使用的值
  • allkey-lfu

    所有值里移除最不经常使用的key

猜你喜欢

转载自blog.csdn.net/weixin_44062399/article/details/123764908
今日推荐