久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      php+redis實(shí)現(xiàn)加鎖與解鎖操作

      php+redis實(shí)現(xiàn)加鎖與解鎖操作

      業(yè)務(wù)背景:在房間棋牌游戲中需要用到鎖來(lái)防止并發(fā)操作引起的 redis 數(shù)據(jù)臟讀問(wèn)題;例如添加用戶進(jìn)入房間的動(dòng)作:

      php+redis實(shí)現(xiàn)加鎖與解鎖操作

      并發(fā)的情況下,get RoomUsers 會(huì)有臟讀現(xiàn)象;

      解決思路:加鎖房間來(lái)實(shí)現(xiàn) 一個(gè)房間每次只允許一個(gè)客戶端操作,其他并發(fā)客戶端則等待;也就是—–堵塞鎖;

      加鎖:redis加鎖方式有幾種: incr、set、setnx、hSetnx,可以參考這篇文章:redis加鎖的幾種實(shí)現(xiàn)

      推薦:PHP視頻教程

      這里我用到 set 這種方式

      $roomId = $_GET['roomId']; $user = $_GET['user'];             // '張三' $key = "LockRoom:{$roomId}"; $value = $roomId.uniqid(); $ex = 3; // 如果 $key 不存在的話,就設(shè)置 $key 的值為 $value,且有效期為 3s;  // return TRUE / FALSE while(true){     $res  = $this->redis->set($key, $value, ['nx', 'ex' => $ex]);     if($res) { break; }     usleep(5000); }  // 將用戶添加進(jìn)房間 $roomUsers = $this->redis->get("Room:{$roomId}:Users"); // ['李四', '王五'] $roomUsers[] = $user; $this->redis->set("Room:{$roomId}:Users", $roomUsers); // ['李四', '王五', '張三']

      解鎖:操作完當(dāng)然要解鎖了,不解鎖起碼要等待 3秒;

      解鎖用 delete 刪除 key; 但是這里有個(gè)坑,不能直接用 delete,因?yàn)榧僭O(shè) client01 獲得了鎖,在添加用戶進(jìn)入房間的過(guò)程中 時(shí)間超過(guò)了 3秒 ,這個(gè)時(shí)候client02 就會(huì)同樣獲得鎖并且設(shè)置3S,然后當(dāng)client01 操作完之后 delete key , 就把 client02 設(shè)置的鎖刪除了;

      這里推薦用 lua 代碼執(zhí)行刪除,因?yàn)閘ua 執(zhí)行具有原子性。

      // 將用戶添加進(jìn)房間 $roomUsers = $this->redis->get("Room:{$roomId}:Users"); // ['李四', '王五'] $roomUsers[] = $user; $this->redis->set("Room:{$roomId}:Users", $roomUsers); // ['李四', '王五', '張三']  // lua 腳本解鎖 // 先判斷 key的值是否為 value, TRUE 才會(huì)刪除, 所以 $value 的設(shè)計(jì)要有隨機(jī)唯一性 $script = 'if redis.call("get",KEYS[1]) == ARGV[1] then     return redis.call("del",KEYS[1]) else     return 0 end '; $this->redis->eval($script, array($key , $value), 1);

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)