设置键的过期时间
- 使用
EXPIRE
或者PEXPIRE
命令,经过指定的秒/毫秒数之后,服务器会自动删除过期的键。
- Redis通过一个过期字典来保存所有键的过期时间,它的键为指向某个键的指针,它的值为该键的过期时间(一个毫秒精度的时间戳,为long long类型的整数)。
- 通过过期字典,可以得知给定的键是否存在于过期字典,如果存在,可知其过期时间是否在当前UNIX时间戳之前,从而判断键是否过期。
过期键删除策略
- 定时删除:设置键过期时间的同时设置一个定时器,定时器会在键过期的同时触发对键的删除操作。
- 惰性删除:放任过期的键不管,当获取键时会检查该键是否过期,如果过期则删除该键。
- 定期删除:每隔一段时间就对数据库中的键进行一次抽查,删除其中过期的键。
- 定时删除会占用大量的CPU时间,影响服务器的响应时间和吞吐量;惰性删除会浪费太多内存;定期删除是前两者的折中。Redis实际采用的是惰性删除和定期删除相结合的策略。
内存淘汰策略
- 惰性删除和定期删除只能删除部分过期的键,当缓存的数据超过设定的最大内存时,需要借助内存淘汰策略清理无效的键。Redis中有以下8种淘汰策略:
volatile-lru
:从配置了过期时间的键中,删除最久未使用的键;
volatile-lfu
:从配置了过期时间的键中,删除使用频率最少的键;
volatile-ttl
:从配置了过期时间的键中,删除即将要过期的键;
volatile-random
:从配置了过期时间的键中,随机删除;
allkeys-lru
:从所有键中,删除最久未使用的键;
allkeys-lfu
:从所有键中,删除使用频率最少的键;
allkeys-random
:从所有键中,随机删除;
noeviction
:超过内存时报错,不会删除任何键。
- Redis的LRU是近似LRU,通过比较当前时间戳与键的时间戳之差来得到最久未使用的键,目的是节省内存、提高性能。