lua在openresty中,使用redis命令和“setex”设置过期时间将显示为永久键

gcuhipw9  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(1435)

在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版+

qvtsj1bj

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)

相关问题