php中redis+lua處理高併發

使用:

在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);
    }

優勢:

  1. 減少網絡開銷: 不使用 Lua 的代碼需要向 Redis 發送多次請求, 而腳本只需一次即可, 減少網絡傳輸;
  2. 原子操作: Redis 將整個腳本作爲一個原子執行, 無需擔心併發, 也就無需事務;
  3. 複用: 腳本會永久保存 Redis 中, 其他客戶端可繼續使用.

不足之處:

  1. 該方案基於單個寫節點的 Redis集羣,無法適用於多個寫節點的Redis集羣;
  2. Redis 執行 Lua 腳本 具有了原子性, 但是 Lua腳本內的 多個寫操作 沒有實現 原子性(事務)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章