Redis核心技術---Lua語言
Redis在2.6版推出了指令碼功能,允許開發者在Redis中執行Lua語言編寫的指令碼,而在Lua指令碼中我們可以編寫大部分的Redis命令,那麼使用Lua指令碼有什麼好處呢?
- 減少網路開銷:如果我們需要執行一系列Redis命令的話,一句一句傳送給Redis會產生很多次網路請求,影響效率,有了Lua指令碼我們可以把這一系列命令寫入到指令碼中一次性發送給Redis執行,只有一次請求。
- 原子操作:Redis會將整個指令碼作為一個整體執行,中間不會被其他命令插入,也就是說在執行期間資料不會被其他命令修改,從而也就不會產生併發問題,作為一個整體執行也意味著使用Lua指令碼可以完成事務的功能,即同時成功或者同時失敗。
- 複用:客戶端傳送的指令碼會被存在Redis中,所以其他客戶端可以複用這一指令碼從而不必自己去重新寫命令完成同樣的邏輯。
那在Redis中如何使用Lua指令碼呢?先來看一段Redis命令:
eval lua-script key-num [key1 key2 key3...] [value1 value2 value3...]
其中:
eval:代表執行lua指令碼的命令。
lua-script:代表你自己編寫的lua指令碼。
key-num :代表傳入lua指令碼中的引數有多少個key
[key1 key2 key3...]:這些引數將作為key值傳入指令碼
[value1 value2 value3...]:這些引數將作為value值傳入指令碼
看下面的舉例:
eval "redis.call('set',KEYS[1] , ARGV[1])" 1 key-1 value-1
其中:
redis.call('set',KEYS[1] , ARGV[1]) 為lua指令碼,redis.call代表在指令碼中呼叫redis命令,其中的引數代表redis命令:
set KEYS[1] ARGV[1],其中KEYS[1]和ARGV[1]用於接收傳遞給指令碼的引數
數字 1 代表後面的引數中有一個key,剩下的都為value。
有時候Lua指令碼會很長,當需要多次執行同樣的指令碼時,如果每次都在Redis命令中寫顯然是不現實的,這個時候就用到了Redis 的快取指令碼功能,我們可以通過script load 命令給lua指令碼生成一個字串,稱為SHA-1簽名,之後如果需要執行lua指令碼,只要執行這個指令碼對應的SHA-1簽名就可以了,如以下示例:(其中第三行由於大小原因顯示不全,完整是:evalsha 簽名 1 key1 value1)