如何在Redis中批量添加带过期时间的键?
批量向Redis添加带过期时间的键值对并查询有效键
修改批量添加代码
要给批量创建的键加上过期时间,最稳妥的是在set操作时直接指定过期参数——这是原子操作,能避免出现键创建后没来得及设置过期时间的异常情况。修改后的代码如下:
import redis r = redis.Redis() pipe = r.pipeline() # 自定义过期时间,这里设为300秒(5分钟),可根据需求调整 expire_seconds = 300 for i in range(10): # 用set方法的ex参数,直接为键绑定过期时间 pipe.set(f'p{i}', i, ex=expire_seconds) pipe.execute()
如果需要分开执行设置键值和过期时间(非原子操作,不推荐),也可以这么写:
for i in range(10): pipe.set(f'p{i}', i) pipe.expire(f'p{i}', expire_seconds)
查询时过滤已过期的键
Redis的过期键不会实时删除,而是通过惰性删除(访问时检查并删除)和定期删除(后台定时清理)机制处理。直接用KEYS命令可能会拿到已过期但未被清理的键,推荐用以下方式获取有效键:
- 用
SCAN渐进式遍历键(不会阻塞Redis,适合生产环境) - 对每个键做有效性校验,两种方式可选:
方式1:检查键的剩余过期时间
valid_keys = [] # 遍历所有以p开头的键,match参数可根据你的键名规则调整 for key in r.scan_iter(match='p*'): ttl = r.ttl(key) # ttl返回-2表示键已过期不存在;-1表示永不过期;正数是剩余过期时间 if ttl != -2: valid_keys.append(key.decode()) # 转成字符串格式方便查看 print("有效键:", valid_keys)
方式2:直接尝试获取键值
利用Redis的惰性删除机制,访问已过期的键时会自动删除并返回None,所以可以直接判断值是否存在:
valid_keys = [] for key in r.scan_iter(match='p*'): value = r.get(key) if value is not None: valid_keys.append(key.decode()) print("有效键:", valid_keys)
注意:生产环境禁止使用
KEYS命令,它会遍历所有键导致Redis阻塞,严重影响性能。
内容的提问来源于stack exchange,提问作者Govind Avireddi
相关产品推荐
相关产品推荐

