2014-01-29 79 views
7

我試圖用一個Lua腳本中Redis的TYPE命令裏面的TYPE命令(通過EVAL執行)使用Redis的/ Lua的腳本

local key_type = redis.call("TYPE", key) 

根據Redis的文檔,這應返回的字符串"none","zset"

但是返回值的類型是lua table。將該值與字符串進行比較始終返回false。

我已經設法通過改變調用來解決問題,以

local key_type = redis.call("TYPE", key)["ok"] 

這個數值的確是一個字符串,並執行字符串比較指令工作。我擔心這是我的特定版本的Redis中的一個錯誤,當我升級時它會在未來的版本中崩潰。

有誰知道這是預期的行爲還是錯誤?

回答

9

TYPE命令返回狀態回覆(又名簡單字符串),例如"+list\r\n"

在Redis腳本端,callluaRedisCallCommand實現,它在幕後執行真實的Redis命令。

成功執行後,此功能將命令結果轉換爲redisProtocolToLuaType

當遇到一個狀態回覆,這個功能創建一個Lua表"ok"爲重點,和值的狀態回覆(見redisProtocolToLuaType_Status)。所以:

  • 沒有錯誤,
  • 這就是爲什麼redis.call("TYPE", key)是一個表(因此你需要像你一樣獲得價值爲"ok"鍵,讓key的類型爲字符串) 。

注:當你直接返回表,Redis的照顧來獲得相關的"ok"鍵的值,並將其作爲一個狀態回覆,如:

> EVAL 'return redis.call("TYPE", "foo")' 
set 

請參閱本code section更多細節。

+0

感謝您的詳細和knowledgable答案。 –

相關問題