redis使用lua腳本遇到的問題


1、windows如何使用lua腳本

首先我們編寫一段lua腳本

 

 

 把這個lua腳本拷貝到redis的安裝目錄redis-cli文件夾下面,然后執行:redis-cli --eval hello.lua。就可以順利執行。當然還可以加更多參數,具體看文檔

 

 

 2、當存在寫命令的時候,lua腳本報錯,當時我想通過lua腳本去刪除所有沒有設置過期時間的key,lua腳本如下:

 

 

 當我去執行這串命令的時候,redis一直給我報錯,報錯信息如下:

 

 

 翻譯過來就是說, 寫命令不被允許出現在‘非確定性命令’的后面, 請在腳本開始時調用redis.replicate_commands()來切換到命令復制模式.

為什么要使用replicate_commands()尼?

3、為什么使用replicate_commands()

因為受到了持久化和主從復制的制約,在主從復制和AOF追加時, 直接復制整個腳本的內容, 那么肯定會造成執行時數據的不一致性. 

其實道理也很簡單,因為開啟了備份,當使用lua腳本對數據做改動的時候,其實redis是沒有辦法保證數據復制的一致性和數據的追蹤

從Redis 3.2開始,可以選擇另一種復制方法。我們可以復制腳本生成的單個寫入命令,而不是復制整個腳本。我們稱之為【腳本影響復制】(script effects replication)。

在這種復制模式下,當執行Lua腳本時,Redis會收集由Lua腳本引擎執行的所有實際修改數據集的命令。當腳本執行完成后,由腳本生成的命令序列將被包裝到 MULTI/EXEC 事務中,並發送到從節點和進行AOF持久化保存。

當我們加了replicate_commands()以后,到AOF備份文件里面查看,發現會把寫命令轉換為MULTI...EXEC命令:

 

 

 並且在Lua腳本中讀多寫少的情況下,只持久化和復制寫命令,可以節省重啟和備庫的CPU時間。

replicate_commands雖好但是也不能亂用,有幾個事項還是需要注意的:

1、在寫命令之前調用redis.replicate_commands(),因為調用redis.replicate_commands()之后Redis開始用事務來替代整個Lua腳本做持久化和主從復制。但是Redis並沒有緩存redis.replicate_commands()之前的命令,如果在此之前調用了寫命令是會破壞數據一致性的

2、指定復制的模式:

redis.set_repl(redis.REPL_ALL) -- Replicate to AOF and slaves.

redis.set_repl(redis.REPL_AOF) -- Replicate only to AOF.

redis.set_repl(redis.REPL_SLAVE) -- Replicate only to slaves.

redis.set_repl(redis.REPL_NONE) -- Don't replicate at all.


默認REPL_ALL,當設置為其他模式時會有數據不一致的風險,所以不建議使用redis.set_repl(),使用redis.replicate_commands()來進行隨機寫入足


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM