阿里雲Redis lua相關命令支援及限制
Lua 指令碼功能是 Reids的最大亮點, 通過內嵌對 Lua 環境的支援, Redis 解決了長久以來不能高效地處理 CAS (check-and-set)命令的缺點, 並且可以通過組合使用多個命令, 輕鬆實現以前很難實現或者不能高效實現的模式。
阿里雲Redis主從版本、叢集版本、讀寫分離版本都支援Lua相關命令。使用者如果發現無法執行Eval相關命令,比如報"ERR command eval not support for normal user"的時候可以再控制檯進行一個小版本升級完成,升級過程中有閃斷和只讀影響,請在業務低峰期進行操作。

叢集版本限制
預設阿里雲Redis會對lua指令碼做一定限制,目的是為了保證腳本里面的所有操作都在相同slot進行,如果使用者能夠在程式碼確保所有操作都在相同slot而又想打破Redis叢集的lua限制的話可以通過控制檯修改script_check_enable引數為0,則後端不會對指令碼進行校驗。

雲Redis叢集對lua指令碼限制如下:
- 所有key都應該由 KEYS 陣列來傳遞,redis.call/pcall 中呼叫的redis命令,key的位置必須是KEYS array(不能使用Lua變數替換KEYS),否則直接返回錯誤資訊,"-ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS arrayrn"。
- 所有key必須在1個slot上,否則返回錯誤資訊,"-ERR eval/evalsha command keys must be in same slotrn"。
- 呼叫必須要帶有key,否則直接返回錯誤資訊, "-ERR for redis cluster, eval/evalsha number of keys can't be negative or zerorn"。