0%

redis过期删除

redis过期删除

redis的键可以设置过期时间,但是并不是每个键一到过期时间就会立即删除,redis不可能给每个设置过期时间的key上添加一个定时器来监视是否过期,CPU根本承受不了如此多的定时线程

注意:我使用的版本是6.0.10,不同版本可能略有差别

redis采用的策略是定期删除+惰性删除

定期删除是指每个一段时间去检查是否有过期的key,如果有则删除

惰性删除是指在获取key的时候检查一下这个key是否过期

定期删除的配置是hz(默认是10,即每秒十次扫描)

首先客户端在尝试访问某个key的时候,redis会检查是否过期,如果过期则删除,但是有些key是不会被访问到的,redis的定期删除则会进行扫描并删除过期的key

  1. 从过期字典里随机抽取20个key
  2. 删除这20个key中已经过期的key
  3. 如果过期的比例超过25%,则重复步骤一

过期的key过多会导致循环抽取删除,为防止过度循环,增加了扫描的上限,默认不超过25ms

应该避免同一时刻大量key同时过期

淘汰机制

由于使用定期删除+惰性删除机制,但是也可能很多过期的没有被删除掉导致内存不足的情况,所以redis存在淘汰机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#设置了过期时间的键,选取最近最少使用的键抛弃(Least Recently Used)
# volatile-lru -> Evict using approximated LRU, only keys with an expire set.
#对于所有的键,选取最近最少使用的键抛弃(Least Recently Used)
# allkeys-lru -> Evict any key using approximated LRU.
#设置了过期时间的键,选取最少频率使用的键抛弃(Least Frequently Used)
# volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
#对于所有的键,选取最少频率使用的键抛弃(Least Frequently Used)
# 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.