过期策略
Redis 会把设置了过期时间的 key 放入一个独立的字典里,在 key 过期时并不会立刻删除它。
Redis 会通过如下两种策略,来删除过期的key:
- 惰性删除
- 客户端访问某个 key 时,Redis 会检查该 key 是否过期,若过期则删除
- 定期扫描
Redis 默认每秒执行 10 次过期扫描(配置hz选项),扫描策略如下:
1. 从过期字典中随机选择 20 个 key; 2. 删除这 20 个 key 中已过期的 key; 3. 如果过期的 key 的比例超过 25%,则重复步骤 1;
淘汰策略
当 Redis 占用内存超出最大限制(maxmemory)时,可采用如下策略(maxmemory-policy)
让 Redis 淘汰一些数据,以腾出空间继续提供读写服务:
- noeviction: 对可能导致增大内存的命令返回错误(大多数写命令,DEL除外)
- volatile-ttl: 在设置了过期时间的 key 中,选择剩余寿命(TTL)最短的 key,将其淘汰
- volatile-lru: 在设置了过期时间的 key 中,选择最少使用的 key,将其淘汰
- volatile-random: 在设置了过期时间的 key 中,随机选择一些 key,将其淘汰
- allkeys-lru: 在所有的 key 中,选择最少使用的 key,将其淘汰
- allkeys-random: 在所有的 key 中,随机选择一些 key,将其淘汰
- LRU 算法
- 维护一个链表,用于顺序存储被访问过的key。
- 在访问数据时,最新访问过的 key 将被移动到表头
- 即最近访问的 key 在表头,最少访问的 key 在表尾
- 近似 LRU 算法(Redis)
- 给每个 key 维护一个时间戳,淘汰时随机采样 5 个key,从中淘汰掉最旧的key。如果还是超出内存限制,则继续随机采样淘汰
- 优点:比 LRU 算法节约内存,却可以取得非常近似的效果