/**
* Redis锁操作类
* Date: 2016-06-30
* Author: fdipzone
* Ver: 1.0
*
* Func:
* public lock 获取锁
* public unlock 释放锁
* private connect 连接
*/
class RedisLock
{
// class start
private $_config;
private $_redis;
/**
* 初始化
* @param Array $config redis连接设定
*/
public function __construct($config = array())
{
$this->_config = $config;
$this->_redis = $this->connect();
}
/**
* 获取锁
* @param String $key 锁标识
* @param Int $expire 锁过期时间
* @return Boolean
*/
public function lock($key, $expire = 5)
{
$is_lock = $this->_redis->setnx($key, time() + $expire);
// 不能获取锁
if (!$is_lock) {
// 判断锁是否过期
$lock_time = $this->_redis->get($key);
// 锁已过期,删除锁,重新获取
if (time() > $lock_time) {
$this->unlock($key);
$is_lock = $this->_redis->setnx($key, time() + $expire);
}
}
return $is_lock ? true : false;
}
/**
* 释放锁
* @param String $key 锁标识
* @return Boolean
*/
public function unlock($key)
{
return $this->_redis->del($key);
}
/**
* 创建redis连接
* @return Link
*/
private function connect()
{
try {
$redis = new Redis();
$redis->connect($this->_config['host'], $this->_config['port'], $this->_config['timeout'], $this->_config['reserved'], $this->_config['retry_interval']);
if (empty($this->_config['auth'])) {
$redis->auth($this->_config['auth']);
}
$redis->select($this->_config['index']);
} catch (RedisException $e) {
throw new Exception($e->getMessage());
return false;
}
return $redis;
}
}
redis 锁
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 使用lua脚本删除redis中匹配value的key,可以避免由于方法执行时间过长而redis锁自动过期失效的时候...
- 1. 理解同步和异步 同步:一件事一件事的做,做这件事的时候,不能干其他事情 异步:做一件事的同时,可以做其他事情...
- 原文作者: xingguang原文链接:https://www.tiance.club/post/27099428...