68. redis计数与限流中incr+expire的坑以及解决办法(Lua+TTL)
-- 使用Lua脚本来原子性地增加计数并设置过期时间,避免了incr+expire的问题
local key = KEYS[1]
local increment = tonumber(ARGV[1])
local ttl = tonumber(ARGV[2])
-- 检查键是否存在,如果不存在,则设置初始值和过期时间
if (redis.call('exists', key) == 0) then
redis.call('set', key, 0)
redis.call('expire', key, ttl)
end
-- 对键进行增加操作,并返回新的值
return redis.call('incrby', key, increment)
这段Lua脚本在Redis中被执行,用于安全地增加键的计数并设置过期时间。如果键不存在,脚本会先设置初始值并设置过期时间,然后再执行增加操作。这样就避免了因为incr
和expire
分开执行可能出现的并发问题,确保了操作的原子性。
评论已关闭