Lua脚本优化

我正在尝试使用 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
  • 检查当前值减去传递的值是否不小于 0
  • 如果当前值减去传递的值不小于 0,则将 (当前值-传递值)设置为当前值
  • 获取当前值

请问是否可能优化并调整此 Lua 脚本的性能。请帮忙。

点赞
用户3125367
用户3125367

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)


进一步的优化步骤可以包括:本地化全局函数(如 tostring, tonumber 等),在 LUA_REGISTRYINDEX 表中缓存编译后的代码块。

2014-01-15 08:59:44