單機Redis實現分布式鎖

2021-09-24 01:29:41 字數 1550 閱讀 8378

最近有個專案用到了鎖,直接想到了redis,在網上檢視了一下案列,總感覺不是特別符合需求,索性自己寫了乙個。

不多說,直接上**:

<?php

/** * class redis_lock

* * 單機redis 分布式鎖

*/class redis_lock

/*** 單台redis設定鎖

** @param string $key

* @param int $expire

* @return bool

*/public function setlock($key, $expire = 10)

$res = $this->check_expire($expire);

if (!$res)

$res = $this->redis->set('redis:lock:' . $key, time() + $expire, ['nx', 'ex' => $expire]);

if (!$res)

return true;

}/**

* 校驗有效期

** @param mixed $expire

* @return int

*/public function check_expire($expire)

return true;

}/**

* 校驗$key

** @param mixed $key

* @return bool

*/public function check_key($key)

//允許數字、英文本元、下劃線、英文冒號

preg_match('/^[\w\:]*+$/', $key, $p_key);

if (!isset($p_key[0]) || $p_key[0] != $key)

return true;

}/**

* 單台redis裝置鎖,如果不能進入將等待

** @param string $key

* @param int $expire

* @param int $wait_seconds

* @return bool

*/public function setlockandwait($key, $expire = 10, $wait_seconds = 10)

if ($time >= $wait_time)

usleep(500); //等待微妙數}}

/*** 單台redis刪除鎖

** @param string $key

* @return bool

*/public function dellock($key)

return true;

}}$redis = new redis_lock();

$res = $redis->setlock('111');

$redis->dellock('111');

var_dump($res);

exit;

?>

redis單機實現分布式鎖

原理 使用setnx,設定成功返回1,失敗返回0,由於redis也是單執行緒的,所以一次只能有乙個執行緒獲取成功。程式異常情況 設定超時時間,避免程式掛掉鎖無法釋放。執行超時情況 為避免 執行時間超過key設定的超時時間,從而釋放了其他程序的鎖問題。需要儲存當前執行緒的value。在釋放之前先檢查k...

redis 單機鎖 和 分布式鎖

偷自 require vendor autoload.php client new predis client scheme tcp host 127.0.0.1 port 6379,class redislock desc 獲取鎖鍵名 public function getlockcachekey...

Redis實現分布式鎖(單機版)

一 前言 在我們日常工作中,除了spring和mybatis外,用到最多無外乎分布式快取框架 redis。但是很多任務作很多年的朋友對redis還處於乙個最基礎的使用和認識。所以我就像把自己對分布式快取的一些理解和應用整理乙個系列,希望可以幫助到大家加深對redis的理解。本系列的文章思路先從red...