Redis中优雅处理过期Key的技巧(redis过期key处理)
Redis 是一个高性能的key-value存储系统,广泛使用在任何一个程序中用来作为一个缓存库,用于存储一些热点数据。出于安全应用,在一定的时间段内,关键对象以及缓存对象需要过期(Expire),Redis 给开发者提供了一个方便的API来让我们精确具体指出Key的过期时间。但需要解决的是,那些已经过期的key,如何精确的回收,下面就来介绍一些处理过期Key的技巧。
在每次更新一个key的时候,可以给这个key一个更长的TTL(Time To Live),可以重新设置过期时间,而不是让它在原来的时间段内过期,这样系统不用再进行大量的处理,减少了CPU大量的消耗。
可以在意识到有一个key仍在存活,但可以在删除之前收集内存,从而缓解内存压力。在设计Redis的时候,可以通过监听 over_maxmemory_script(callback) API 来实现,当内存超过设置的最大限值的时候,可以自动的运行收集过期的key的脚本来回收内存:
//获取过期 keys
local expired_keys = redis.call("keys", "*")
//遍历 keys 并且获取 ttlfor i,key in iprs(expired_keys) do
if redis.call("pttl",key) table.insert(expired_keys, key)
endend
//删除过期 keysif table.getn(expired_keys) > 0 then
redis.call("del", unpack(expired_keys)) redis.log(redis.LOG_WARNING, "expired keys cleaned up, keys is: " , table.concat(expired_keys, ","))
end
再次,可以使用定期清理策略来删除过期keys。这一方法更加适合Redis工作量不大,但需要保持内存数据稳定的情况,可以使用crontab或者定时任务在定期的时间间隔内删除所有过期的keys。
也可以借助 aof(Append Only File)日志的记录,在重启Redis的时候,扫描key的TTL,同时删除所有过期的Key。
选择以上任一方法,可以解决 Redis中处理过期 Key 的技巧,让系统更加高效运行。