Redis03-过期策略和淘汰策略

目录

Redis数据过期策略

Redis数据淘汰策略


Redis03-过期策略和淘汰策略_第1张图片

Redis数据过期策略

Redis使用一种基于过期策略来处理键的过期和自动失效。这种策略可以确保不再需要的数据被自动删除,以释放内存并避免数据过期后仍然在缓存中存留。

Redis的过期删除策略主要有两种:

  1. 惰性删除(Lazy Expiration):只在访问key的时候判断是否过期,如果过期就删除,不会主动检查。

    • 优点:对CPU友好,只在使用的时候检查是否过期。

    • 缺点:对内存不友好,即使过期了的Key也不会被删除,会浪费内存。

  2. 定期删除(TTL-Based Expiration):一段时间对数据库中的一些key进行检查,删除其中过期的key。

    定期删除有两种模式:

    SLOW模式是定时任务,执行频率是10hz(1秒10次),每次不超过25ms,可以通过redis.conf设置hz配置。

    FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms。

    • 优点:可以通过限制频率和时长减少删除操作对CPU的影响,定期删除也可以减少内存的占用。

    • 缺点:删除操作的频率和时长难以确定,短了消耗CPU,长了和惰性删除差不多,浪费内存。

Redis数据淘汰策略

Redis支持多种数据淘汰策略,用于管理内存中的数据,以便在内存不足时删除部分数据。

LRU(Least Recently Used,最近最少使用):当内存不足时,Redis会优先删除最久未被访问的键。

LFU(Least Frequently Used,最不经常使用):Redis会在内存不足时删除访问频率最低的键。

TTL(Time To Live,生存时间):当键的生存时间过期时,Redis会自动删除该键。

以下是Redis中常见的8种数据淘汰策略:

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select one from the following behaviors:
#
# volatile-lru -> Evict using approximated LRU, only keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key having 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 evict anything, just return an error on write operations.
  1. noeviction:不淘汰任何key,当内存满时不允许写入新数据。这是默认策略。(内存不足会报错的)

  2. volatile-ttl:对设置了TTL的key,计算剩余TTL值,越小的先被淘汰。

  3. volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰。

  4. allkeys-lru:对所有的key,基于LRU算法进行淘汰。

  5. volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰。

  6. allkeys-lfu:对所有的key,基于LFU算法进行淘汰。

  7. volatile-random:对设置了TTL的key,随机淘汰。

  8. allkeys-random:对所有的key,随机淘汰。

使用建议:

  • 业务对缓存的数据有冷热数据区分的时候,建议使用allkeys-lru删除最久未被访问的key的策略。

  • 业务没有冷热数据区分,使用allkeys-random就行。

  • 业务中有置顶要求,可以设置volatile-lru,对置顶数据不设过期时间,这些数据就会一直保留。

  • 业务中有频率要求,可以使用volatile-lfu或者allkeys-lfu策略。

你可能感兴趣的:(面试攻略,redis,数据库)