我正在尝试使用ServiceStack.Redis通过c连接redis。
我已经写了下面的代码来根据指定的密钥验证数字。
argv[1]是关键
argv[2]是数字

string strScript = " local intCurrentVal = redis.call('GET', '' .. ARGV[1] .. ''); \n"
   + "if (tonumber(intCurrentVal) <= 0 ) then return 1  elseif (  (tonumber(intCurrentVal)) - (tonumber('' .. ARGV[2] .. '')) < 0 ) then return 0 end;"
   + "local intUpdatedVal = redis.call('SET', '' .. ARGV[1] .. '',( intCurrentVal -  tonumber('' .. ARGV[2] .. '')));"
   + "local intCurr = redis.call('GET',  '' .. ARGV[1] .. ''); return intCurr";

逻辑步骤:
获取当前值
检查当前值是否不应小于或等于0
检查当前值传递值是否不应小于o
如果传递的当前值不小于0,则将(传递的当前值)设置为当前值
获取当前值
是否可以优化和优化以下lua脚本以提高性能。请帮忙。

最佳答案

原始格式很糟糕——性能也很糟糕。

local key = tostring(ARGV[1])
local number = tonumber(ARGV[2])

local current = tonumber(redis.call('GET', key))

if current <= 0 then
    return 1
elseif current < number then
    return 0
end

redis.call('SET', key, current - number)
return redis.call('GET', key)

进一步的优化步骤可能包括:全局函数的本地化(例如字符串、tonumber等)、在lua_registryindex表缓存编译的块。

关于c#-4.0 - Lua脚本优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21132001/

10-15 09:07