<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 一、鎖實現的注意點 1. 互斥: 任意時刻, 只能有一個客戶端獲得鎖 2. 不會死鎖: 客戶端持有鎖期間崩潰, 沒有主動解除鎖, 能保證后續的其他客戶端獲得鎖 3. 鎖歸屬標識: 加鎖和解鎖的必須是同一個客戶端, 客戶端不能解掉非自己持有的鎖(鎖應具備標識) # 二、 加鎖 ``` $redis = new Redis(); $redis->pconnect("127.0.0.1", 6379); $redis->auth("password"); // 密碼驗證 $redis->select(1); // 選擇所使用的數據庫, 默認有16個 $key = "..."; $value = "..."; $expire = 3; // 參數解釋 ↓ // $value 加鎖的客戶端請求標識, 必須保證在所有獲取鎖清秋的客戶端里保持唯一, 滿足上面的第3個條件: 加鎖/解鎖的是同一客戶端 // "NX" 僅在key不存在時加鎖, 滿足條件1: 互斥型 // "EX" 設置鎖過期時間, 滿足條件2: 避免死鎖 $redis->set($key, $value, ["NX", "EX" => $expire]) ``` # 三、解鎖 1. 使用lua腳本. ``` $key = "..."; $identification = "..."; // KEYS 和 ARGV 是lua腳本中的全局變量 $script = <<< EOF if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end EOF; # $result = $redis->eval($script, [$key, $identification], 1); // 返回結果 >0 表示解鎖成功 // php中參數的傳遞順序與標準不一樣, 注意區分 // 第2個參數表示傳入的 KEYS 和 ARGV, 通過第3個參數來區分, KEYS 在前, ARGV 在后 // 第3個參數表示傳入的 KEYS 的個數 $result = $redis->evaluate($script, [$key, $identification], 1); ``` 2. 使用Lua腳本的原因: * 避免誤刪其他客戶端加的鎖: 某個客戶端獲取鎖后做其他操作過久導致鎖被自動釋放, 這時候要避免這個客戶端刪除已經被其他客戶端獲取的鎖, 這就用到了鎖的標識. * lua 腳本中執行`get`和`del`是原子性的, 整個lua腳本會被當做一條命令來執行 * 即使`get`后鎖剛好過期, 此時也不會被其他客戶端加鎖 **注意:** eval命令執行Lua代碼的時候,Lua代碼將被當成一個命令去執行,并且直到eval命令執行完成,Redis才會執行其他命令。 由于 script 執行的原子性, 所以不要在script中執行過長開銷的程序,否則會驗證影響其它請求的執行。 3. 解鎖容易錯誤的點: * 直接`del`刪除鍵 原因: 可能移除掉其他客戶端加的鎖(在自己的鎖已過期情況下) * `get`判斷鎖歸屬, 若符合再`del` 原因: 非原子性操作, 若在`get`后鎖過期了, 此時別的客戶端進行加鎖操作, 這里的`del`就會錯誤的將其他客戶端加的鎖解開.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看