需要注意的是设置 Redis 的过期时间时的时机
在设置Redis的键中设置过期时间并进行分布式环境的超时处理时,偶尔会发生超时不触发的错误。
require 'redis'
ttl = 60 # 1分間でexpireさせる
redis = Redis.new
redis.set('key', 'val')
redis.expire('key', ttl)
如果在set和expire之间过程结束,那么将会留下未设置expire的键。
结果就是以下代码会陷入无限循环。
while redis.get('key').present? ; end
为了防止这种情况发生,必须将set和expire操作处理为原子操作。
redis.multi do
redis.set('key', 'val')
redis.expire('key', ttl)
end