2014-01-15 103 views
-1

我想通過使用使用ServiceStack.Redis c#連接redis。Lua腳本優化

我已經寫下面的代碼來驗證基於指定密鑰的數字。

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,則設置(當前值 - 傳遞)作爲當前值
  • 獲取當前值

是否有可能優化和調整以下lua腳本的性能。請幫忙。

+0

它必須在交易區塊內。 – user2771292

+0

什麼事務塊? – Schollii

+0

關於我們每秒鐘談論多少次交易?你有沒有分析過,發現Lua腳本是問題? – dualed

回答

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表緩存編譯塊。

+0

我確實同意你的看法,但我想在一個事務處理塊中包含相同的內容,這就是使用lua腳本的原因。 – user2771292

+0

最後2行我在INCRBY api調用redis時替換了它 – user2771292