使用:
在php的redis中使用lua
$redis->eval()函數
eval($lua,$data,$num);
$lua 要執行的lua命令 :
$data傳進去的參數(必須是數組):
$num表示第二個參數數組中 有幾個是參數(數組其他剩下來的是附加參數)
其中 lua中使用參數用的是 KEYS[1] KEYS[2] 使用附加參數是 ARGV[1]
public function unlock($key){
$redis = new Redis(); #實例化redis類
$redis->connect('127.0.0.1'); #連接服務器
$lua = "
local key=KEYS[1];
local value=ARGV[1];
if redis.call('get',key)==value then
return redis.call('del',key)
else
return 0
end
";
$arr = [$key,$redis->get($key)];
return $redis->eval($lua,$arr,1);
}
優勢:
- 減少網絡開銷: 不使用 Lua 的代碼需要向 Redis 發送多次請求, 而腳本只需一次即可, 減少網絡傳輸;
- 原子操作: Redis 將整個腳本作爲一個原子執行, 無需擔心併發, 也就無需事務;
- 複用: 腳本會永久保存 Redis 中, 其他客戶端可繼續使用.
不足之處:
- 該方案基於單個寫節點的 Redis集羣,無法適用於多個寫節點的Redis集羣;
- Redis 執行 Lua 腳本 具有了原子性, 但是 Lua腳本內的 多個寫操作 沒有實現 原子性(事務)。