需要注意的是设置 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
广告
将在 10 秒后关闭
bannerAds