**偷自:
<?php
require
"vendor/autoload.php"
;$client
=new
predis\client([
'scheme'
=>
'tcp'
,'host'
=>
'127.0.0.1'
,'port'
=>
6379,]
);class
redislock
/** * @desc 獲取鎖鍵名
*/public
function
getlockcachekey
($key)"
;}/** * @desc 獲取鎖
** @param key string | 要上鎖的鍵名
* @param timeout int | 上鎖時間
*/public
function
getlock
($key
,$timeout
=null
)while(1
)$newexpire
=$time
+$timeout
;$expireat
=$this
->
objredis
->
getset
($lockcachekey
,$newexpire);
if($oldexpire
!=$expireat
)$isget
=$newexpire
;break;}
return
$isget;}
/** * @desc 釋放鎖
** @param key string | 加鎖的字段
* @param newexpire int | 加鎖的截止時間
** @return bool | 是否釋放成功
*/public
function
releaselock
($key
,$newexpire
)return
true;}
}$start_time
=microtime
(true);
$lock
=new
redislock
($client);
$key
="name"
;for($i
=0;$i
<
10000;$i
++)$end_time
=microtime
(true);
echo
"花費時間 : ".(
$end_time
-$start_time).
"\n"
;
官方原文:
翻譯:注意下,按照上面的官方文件,setnx 的正確寫法是
set resource_name my_random_value nx px 30000
單機Redis實現分布式鎖
最近有個專案用到了鎖,直接想到了redis,在網上檢視了一下案列,總感覺不是特別符合需求,索性自己寫了乙個。不多說,直接上 class redis lock 單機redis 分布式鎖 class redis lock 單台redis設定鎖 param string key param int exp...
redis單機實現分布式鎖
原理 使用setnx,設定成功返回1,失敗返回0,由於redis也是單執行緒的,所以一次只能有乙個執行緒獲取成功。程式異常情況 設定超時時間,避免程式掛掉鎖無法釋放。執行超時情況 為避免 執行時間超過key設定的超時時間,從而釋放了其他程序的鎖問題。需要儲存當前執行緒的value。在釋放之前先檢查k...
redis分布式鎖
redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...