目录
Redis数据过期策略
Redis使用一种基于过期策略来处理键的过期和自动失效。这种策略可以确保不再需要的数据被自动删除,以释放内存并避免数据过期后仍然在缓存中存留。
Redis的过期删除策略主要有两种:
-
惰性删除(Lazy Expiration):只在访问key的时候判断是否过期,如果过期就删除,不会主动检查。
-
优点:对CPU友好,只在使用的时候检查是否过期。
-
缺点:对内存不友好,即使过期了的Key也不会被删除,会浪费内存。
-
-
定期删除(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.
-
noeviction:不淘汰任何key,当内存满时不允许写入新数据。这是默认策略。(内存不足会报错的)
-
volatile-ttl:对设置了TTL的key,计算剩余TTL值,越小的先被淘汰。
-
volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰。
-
allkeys-lru:对所有的key,基于LRU算法进行淘汰。
-
volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰。
-
allkeys-lfu:对所有的key,基于LFU算法进行淘汰。
-
volatile-random:对设置了TTL的key,随机淘汰。
-
allkeys-random:对所有的key,随机淘汰。
使用建议:
-
业务对缓存的数据有冷热数据区分的时候,建议使用allkeys-lru删除最久未被访问的key的策略。
-
业务没有冷热数据区分,使用allkeys-random就行。
-
业务中有置顶要求,可以设置volatile-lru,对置顶数据不设过期时间,这些数据就会一直保留。
-
业务中有频率要求,可以使用volatile-lfu或者allkeys-lfu策略。