最近有個專案用到了鎖,直接想到了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...