主题
Key 过期策略
Redis 提供了多种方式来处理键的过期情况,确保在数据不再需要时能够及时删除,从而优化内存使用。过期策略决定了 Redis 如何管理和清理过期键。
设置过期时间
可以使用 EXPIRE
命令为键设置过期时间,过期时间单位为秒:
bash
EXPIRE key seconds
- 例如,将
mykey
的过期时间设置为 60 秒:
bash
EXPIRE mykey 60
也可以使用其他命令设置过期时间:
- TTL:查看键的剩余过期时间(秒)
bash
TTL key
- PERSIST:移除键的过期时间,使键永不过期
bash
PERSIST key
- EXPIREAT:指定具体的过期时间(UNIX 时间戳)
bash
EXPIREAT key timestamp
过期策略
Redis 采用了三种主要的过期策略来清理过期的键:
1. 定时删除(主动过期)
Redis 会在每次访问数据库时检查键是否过期,并在键过期时立即删除。这是一个比较轻量的方式。
2. 惰性删除(延迟过期)
当 Redis 访问一个键时,如果该键已过期,会在访问时删除该键。惰性删除并不会遍历所有的键,而是仅在访问到某个键时检查其是否过期。
3. 定期删除(周期性过期)
Redis 会定期扫描一部分键,检查它们是否过期,并将过期的键删除。这个过程会在后台线程中执行,不会影响主线程的性能。
配置过期策略
在 redis.conf
文件中,可以配置 Redis 执行定期过期检查的频率:
conf
# 每 10 秒钟扫描一次过期键,扫描 10 个键
hz 10
hz
选项控制了 Redis 扫描过期键的频率,默认为 10,这意味着 Redis 每 10 毫秒会进行一次扫描。
过期键的清理机制
- 懒删除:惰性删除机制,只有在客户端访问过期键时,Redis 才会删除该键。
- 定期删除:周期性地扫描部分键并删除过期的键,防止内存溢出。
- 过期精度:由于过期时间是通过精确到秒来控制的,Redis 允许过期时间的精度误差为 1 秒。
使用场景
- 缓存:用于定期清理不再需要的数据,避免内存占用过大。
- 会话管理:比如用户登录的 session 会在一定时间后过期。
- 临时数据存储:需要在短期内存储的数据,使用过期时间确保不再需要时自动删除。
注意事项
- 内存管理:过期策略有助于控制内存占用,但在高负载场景下,定期删除和惰性删除可能会引起一定的性能影响。
- 精确性:由于 Redis 使用秒级过期时间,过期时间的精度可能不是特别精确(最大误差为 1 秒)。
- 无过期键:如果设置了过期时间后键没有过期,Redis 不会自动删除这些键,因此需要手动管理过期键的清理。
通过合理配置 Redis 的过期策略,能够高效管理内存和处理不再需要的数据,保证系统的性能和稳定性。