分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
對於一些需要限制同乙個使用者併發訪問的場景,如果使用者併發請求多次,而伺服器處理沒有加鎖限制,使用者則可以多次請求成功。
例如換領優惠券,如果使用者同一時間併發提交換領碼,在沒有加鎖限制的情況下,使用者則可以使用同乙個換領碼同時兌換到多張優惠券。
偽**如下:
if a(可以換領)
b(執行換領)
c(更新為已換領)
d(結束)
如果使用者併發提交換領碼,都能通過可以換領(a)的判斷,因為必須有乙個執行換領(b)後,才會更新為已換領(c)。因此如果使用者在有乙個更新為已換領之前,有多少次請求,這些請求都可以執行成功。
使用檔案鎖可以實現併發訪問限制,但對於分布式架構的環境,使用檔案鎖不能保證多台伺服器的併發訪問限制。
redis是乙個開源的使用ansi c語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、key-value資料庫,並提供多種語言的api。
本文將使用其setnx方法實現分布式鎖功能。setnx即set it not exists。
當鍵值不存在時,插入成功(獲取鎖成功),如果鍵值已經存在,則插入失敗(獲取鎖失敗)
redislock.class.php
<?php /** * redis鎖操作類 * date: 2016-06-30 * author: fdipzone * ver: 1.0 * * func: * public lock 獲取鎖 * public unlock 釋放鎖 * private connect 連線 */class redislock /** * 獲取鎖 *@param string $key 鎖標識 *@param int $expire 鎖過期時間 *@return boolean */
public function lock($key, $expire=5) } return $is_lock? true : false; } /** * 釋放鎖 *@param string $key 鎖標識 *@return boolean */
public function unlock($key) /** * 建立redis連線 *@return link */
private function connect() $redis->select($this->_config['index']); }catch(redi***ception $e) return $redis; }} // class end?>
demo.php
<?php
require
'redislock.class.php';$config = array( 'host' => 'localhost', 'port' => 6379, 'index' => 0, 'auth' => '', 'timeout' => 1, 'reserved' => null, 'retry_interval' => 100,);// 建立redislock物件
$oredislock = new redislock($config);// 定義鎖標識
$key = 'mylock';// 獲取鎖
$is_lock = $oredislock->lock($key, 10);if($is_lock)else?>
測試方法:開啟兩個不同的瀏覽器,同時在a,b中訪問demo.php
如果先訪問的會獲取到鎖
輸出get lock success
do sth..
success
另乙個獲取鎖失敗則會輸出request too frequently
保證同一時間只有乙個訪問有效,有效限制併發訪問。
為了避免系統突然出錯導致死鎖,所以在獲取鎖的時候增加乙個過期時間,如果已超過過期時間,即使是鎖定狀態都會釋放鎖,避免死鎖導致的問題。
給我老師的人工智慧教程打call!
php 使用redis鎖限制併發訪問類
對於一些需要限制同乙個使用者併發訪問的場景,如果使用者併發請求多次,而伺服器處理沒有加鎖限制,使用者則可以多次請求成功。例如換領優惠券,如果使用者同一時間併發提交換領碼,在沒有加鎖限制的情況下,使用者則可以使用同乙個換領碼同時兌換到多張優惠券。偽 如下 if a 可以換領 b 執行換領 c 更新為已...
php 使用redis鎖限制併發訪問類
對於一些需要限制同乙個使用者併發訪問的場景,如果使用者併發請求多次,而伺服器處理沒有加鎖限制,使用者則可以多次請求成功。例如換領優惠券,如果使用者同一時間併發提交換領碼,在沒有加鎖限制的情況下,使用者則可以使用同乙個換領碼同時兌換到多張優惠券。偽 如下 if a 可以換領 b 執行換領 c 更新為已...
php 使用redis鎖限制併發訪問類
對於一些需要限制同乙個使用者併發訪問的場景,如果使用者併發請求多次,而伺服器處理沒有加鎖限制,使用者則可以多次請求成功。例如換領優惠券,如果使用者同一時間併發提交換領碼,在沒有加鎖限制的情況下,使用者則可以使用同乙個換領碼同時兌換到多張優惠券。偽 如下 if a 可以換領 b 執行換領 c 更新為已...