在openresty with lua脚本中,使用redis命令设置过期时间将显示为一个永久键。lua脚本如下所示:
local function ip_frequency(ip,red)
local limit_num=50
local key = "limit:frequency:"..ip
local resp, err = red:get(key)
if resp==nil then
local ok,err=red:setex(key,2,1)
if not ok then
return false;
end
end
if type(resp) == "string" then
if tonumber(resp) > limit_num then
return false
end
end
ok, err = red:incr(key)
if not ok then
return false
end
return true
end
当openresty程序运行一段时间后,redis中会出现一些永久性的键,从这个函数可以看出我没有为永久性的时间设置一个键,但它只是发生了。为什么,请帮我回答这个问题。谢谢您!
软件版本如下:
openresty:1.17.8.2版本
redis:6.0版+
centos:8.0版+
1条答案
按热度按时间qvtsj1bj1#
openresty连接到redis数据库并使用它的功能。在lua或其他语言中使用redis函数并不是原子的。对于redis服务器,它意味着:[
redis:get
,暂停,redis:setex
]或者[redis:get
,暂停,redis:incr
]. 在暂停期间可能会发生很多事情,如果只有1ms,则会发生事件,例如清除“死”键。你的代码可能会发生这样的情况:
local resp, err = red:get(key)
得到的有效键值小于limit_num
ok, err = red:incr(key)
redis检查密钥是否有效,如果达到ttl则将其删除redis检查没有这样的键,因此创建值为0的键并递增键值
所以在这一点上你有永久的钥匙。如果要避免使用永久密钥,请使用以下方法:
red:setex(key,2,tonumber(res)+1)
开始red:incr(key)