过期策略
Redis允许对键设置过期时间,到期后键会自动删除。设置过期时间的主要命令有:
- EXPIRE key seconds:设置键在指定秒数后过期。
- PEXPIRE key milliseconds:设置键在指定毫秒数后过期。
- EXPIREAT key timestamp:设置键在指定的UNIX时间戳(秒)过期。
设置键在指定的UNIX时间戳(秒)过期,意思是让Redis中的某个键在特定的时刻自动删除。这个时刻是用UNIX时间戳表示的,UNIX时间戳是自1970年1月1日00:00:00 UTC起的秒数。通过这种方式,你可以精确地控制键在未来的某个具体时间点过期。
- PEXPIREAT key milliseconds-timestamp:设置键在指定的UNIX时间戳(毫秒)过期。
- TTL key:查看键的剩余生存时间(秒)。
- PTTL key:查看键的剩余生存时间(毫秒)。
Redis过期键的删除方式有三种:
- 定时删除:在设置过期时间时,创建一个定时器,到期立即删除键。这种方式内存友好,但对CPU不友好,因为需要为每个过期键创建定时器。
- 惰性删除:访问键时检查是否过期,如果过期则删除。这种方式CPU友好,但可能会占用不必要的内存,因为过期键不会立即删除。
- 定期删除:每隔一段时间随机检查部分键,删除过期的键。这种方式是定时删除和惰性删除的折中,既不占用过多内存,也不会对CPU产生过大负担。
内存淘汰机制
当Redis内存达到限制时,触发内存淘汰机制。Redis的内存淘汰策略有多种,可以通过配置maxmemory-policy参数设置。以下是几种常见的淘汰策略:
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,不会淘汰任何数据。这是默认策略。
- allkeys-lru:使用最近最少使用(LRU)算法,淘汰所有键空间中最近最少使用的键。
- volatile-lru:使用LRU算法,淘汰设置了过期时间的键空间中最近最少使用的键。
- allkeys-random:在所有键空间中随机淘汰键。
- volatile-random:在设置了过期时间的键空间中随机淘汰键。
- volatile-ttl:在设置了过期时间的键空间中,优先淘汰存活时间(TTL)最短的键。
- allkeys-lfu:使用最近最少使用(LFU)算法,淘汰所有键空间中最近最不常使用的键。
- volatile-lfu:使用LFU算法,淘汰设置了过期时间的键空间中最近最不常使用的键。
选择合适的淘汰策略
选择合适的淘汰策略取决于具体的应用场景:
- 需要严格控制内存使用并保证写操作不会失败:选择allkeys-lru或allkeys-lfu,以确保内存使用在限制范围内,并且删除最近最少使用或最不常使用的键。
- 大多数键都有过期时间,并且希望优先淘汰那些即将过期的键:选择volatile-lru或volatile-ttl。
- 需要随机淘汰一些键,以减少淘汰算法的开销:选择allkeys-random或volatile-random。
- 希望写操作在内存不足时直接失败:保持默认策略noeviction。