Redis 在数据过期后的删除策略主要包括两种方式:惰性删除(Lazy Expiration)和定期删除(Active Expiration)。
1. 惰性删除(Lazy Expiration)
- 原理:当客户端尝试访问某个键时,Redis 会检查该键是否已过期。如果已过期,则删除该键并返回相应的错误信息。
- 优点:不会对性能产生显著影响,因为删除操作只在访问时发生。
- 缺点:可能会占用较多内存,因为过期的键在被访问之前不会被删除。
2. 定期删除(Active Expiration)
- 原理:Redis 会定期检查并删除已过期的键。具体来说,Redis 会在后台线程中周期性地随机选择一些键进行检查,如果发现这些键已过期,则立即删除。
- 优点:可以及时释放内存,减少内存占用。
- 缺点:可能会对性能产生一定影响,尤其是在大量键过期的情况下。
具体实现
-
惰性删除:在每次访问键时进行检查。
GET key
如果 key 已过期,Redis 会自动删除该键并返回 nil。
-
定期删除:Redis 会在后台线程中执行以下步骤:
- 从所有数据库中随机选择一些键。
- 检查这些键是否已过期。
- 如果已过期,立即删除这些键。
配置参数
Redis 提供了一些配置参数来调整定期删除的频率和强度:
- hz:控制 Redis 服务器每秒执行的周期性任务次数。默认值为 10,可以增加该值以提高定期删除的频率。
- CONFIG SET hz 100
示例代码
以下是一个简单的 Python 示例,演示如何设置键的过期时间:
import redis
# 连接 Redis 服务器
r = redis.Redis(host='localhost', port=6379, db=0)
# 设置键值对并设置过期时间(5秒后过期)
r.set('name', 'Alice', ex=5)
# 获取键值对
name = r.get('name')
print(name) # 输出: b'Alice'
# 等待 6 秒后再次获取键值对
import time
time.sleep(6)
name = r.get('name')
print(name) # 输出: None
642

被折叠的 条评论
为什么被折叠?



