PHP Lua指令碼實現分布式鎖

2021-10-03 03:59:56 字數 1186 閱讀 1141

<?php 

$redis

=new

redis()

;$redis

->

connect

("127.0.0.1"

,6379);

$redis

->

select(0

);//php中使用redis拓展執行指令碼時,eval方法的引數 3個,第乙個是指令碼**,

//第二個是乙個陣列,引數陣列,第三個引數是個整數,

//表示第二個引數中的前幾個是key引數,剩下的都是附加引數

//傳入1個key 2個執行緒的唯一標識id 分布式鎖的失效時間

$lua

=getlualock()

;$res

=$redis

->

eval

($lua,[

'lock'

,'thread-002'

,'15'],

1);if

($res

)echo

"業務結束\n"

;$unlock

=getunlocklua()

;$redis

->

eval

($unlock,[

'lock'

,'thread-002'

,'15'],

1);echo

"釋放分布式鎖\n";}

$redis

->

close()

;//關閉redis

/** *獲取分布式鎖指令碼

*@param key 分布式鎖的key名稱

*@param threadid 當前執行緒的id

*@param expiretime 分布式鎖失效時間

**/function

getlualock()

/** *釋放分布式lua指令碼

*@param key 分布式鎖的key名稱

*@param threadid 當前執行緒的id

*@param expiretime 分布式鎖失效時間

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

分布式鎖實現

1,資料庫實現原理 資料庫的行級x鎖。優點 不需要引入第三方應用。缺點 死鎖 對資料庫效能影響,可能較長時間占用資料庫連線資源 如果業務是分庫分表的,可能支援不了 示例 2,快取實現原理 通過setnx是否成功。當且僅當 key 不存在,將 key 的值設為 value 並返回1 若給定的 key ...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...