Redis lua脚本无法设置key过期
2019-11-28 本文已影响0人
牛亦非
近期碰到的一个产品需求:限制用户对某个接口的访问频次,一段时间内超过限制次数则拒绝访问。比如A用户如果在1天内访问接口已达到5次,第6次访问时就会返回错误提示。
这种问题的处理很适合用redis带过期时间的string来记录用户访问次数,同时用lua脚本来保证并发场景下的数据一致性。
一开始很快撸了一个脚本test.lua:
local key,ttl=KEYS[1],KEYS[2]
// key不存在则设置过期时间和初始访问次数
if redis.call('GET',key)==nil then
redis.call('SETEX',key,ttl,1)
return 1
else
return tonumber(redis.call('INCR',key))
end
看起来无懈可击,用命令行测试一下:
redis-cli --eval test.lua test_key 1000
redis-cli
> ttl test_key
(integer) -1
运行成功,但是执行ttl发现key并没有过期时间。哪里有问题呢?google了一下也没查到有用的信息。灵机一动,把判断key是否存在做了下改动:
if redis.call('EXISTS',key)==0 then
卧槽,这样就可以了!目前还没查到原因,感觉是个小坑。