redis 單機鎖 和 分布式鎖

2021-08-29 01:26:40 字數 1600 閱讀 5645

**偷自:

<?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...