-1

我正在尝试通过 c# 使用 using 连接 redis ServiceStack.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 脚本以提高性能。请帮忙。

4

1 回答 1

1

原始格式很糟糕——性能通常也是如此。

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 表中缓存已编译的块。

于 2014-01-15T08:59:44.023 回答