redis 分布式鎖 PHP

2022-02-23 07:28:07 字數 1367 閱讀 4004

redis分布式

1.redis是單執行緒操作

2.分布式會出現的問題,死鎖

3.redis分布式(集群)。多台伺服器裡面都有多個單機redis。然後這些redis之間相互鏈結。還有檢視各個單台伺服器之間是否鏈結成功,也就是心跳檢測

4.在資料方面,他們之間有個鎖的問題,叫redis分布式鎖

## 常規流程

$redisdb = new redis('

127.0.0.1:6379');

//獲取redis裡面的資料

$res = $redisdb->lrange();

if(!$res)

}return $res;

這裡會出現乙個問題,在獲取redis資料的時候,出現搶鎖的情況

改動後的流程

//

設定redis鎖

$expire = 10;//

有效期10秒

$key = '

lock

';//

key$value = time() + $expire;//

鎖的值 = unix時間戳 + 鎖的有效期

$redisdb = new redis('

127.0.0.1:6379');

//獲取資料之前,先獲取鎖

$status = true

;while

($status)

}else}}

}

這裡原本就可以是最終的版本,但是看到一些言論說。假設程序1del鎖之前崩了。那鎖會一直存在,程序2和程序3會同時或得到鎖。

### 最終版

//

設定redis鎖

$expire = 10;//

有效期10秒

$key = '

lock

';//

key$value = time() + $expire;//

鎖的值 = unix時間戳 + 鎖的有效期

$redisdb = new redis('

127.0.0.1:6379');

//獲取redis裡面的資料

$res = $redisdb->lrange();

if(!$res)

//***********並吧資料插入資料庫

//以上程式走完刪除鎖

//檢測鎖是否過期,過期鎖沒必要刪除

if($redisdb->ttl($key))

$redisdb->del($key);

$status =false;

} else

}}return $res;

Redis實現分布式鎖 php

一 分布式鎖的作用 redis寫入時不帶鎖定功能,為防止多個程序同時進行乙個操作,出現意想不到的結果,so.對快取進行插入更新操作時自定義加鎖功能。二 redis的nx字尾命令 redis有一系列的命令,其特點是以nx結尾,nx的意思可以理解為 not exists 不存在 setnx命令 set ...

PHP實現Redis分布式鎖

鎖在我們的日常開發可謂用得比較多。通常用來解決資源併發的問題。特別是多機集群情況下,資源爭搶的問題。但是,很多新手在鎖的處理上常常會犯一些問題。今天我們來深入理解鎖。一 redis 鎖錯誤使用之一 我曾經見過有的專案把查詢結果儲存到 redis 當中時的偽 如下 redis new redis 12...

redis分布式鎖之php

在單程序的系統中,當遇到併發情況下,會出現一些資料異常的問題,但是如果這些資料是需要保證唯一性的話,那我們就希望在同一時刻,只能有乙個執行緒在執行這塊 通常我們一般都是通過簡單的加鎖或同步來實現並解決這個問題。但是以上都是單程序多執行緒的情況,如果出現多程序多執行緒,顯然會出現問題。因為多執行緒之間...