前言
这里我们主要利用Redis
的setnx
的命令来处理高并发
setnx
有两个参数。第一个参数表示键。第二个参数表示值。如果当前键不存在,那么会插入当前键,将第二个参数做为值。返回 1
。如果当前键存在,那么会返回 0
。
代码如下(示例):
<?php class Lock { private static $_instance ; private $_redis; private function __construct() { $this->_redis = new Redis(); $this->_redis ->connect('127.0.0.1'); } public static function getInstance() { if(self::$_instance instanceof self) { return self::$_instance; } return self::$_instance = new self(); } /** * @function 加锁 * @param $key 锁名称 * @param $expTime 过期时间 */ public function set($key,$expTime) { //初步加锁 $isLock = $this->_redis->setnx($key,time()+$expTime); if($isLock) { return true; } else { //加锁失败的情况下。判断锁是否已经存在,如果锁存在切已经过期,那么删除锁。进行重新加锁 $val = $this->_redis->get($key); if($val&&$val<time()) { $this->del($key); return $this->_redis->setnx($key,time()+$expTime); } return false; } } /** * @param $key 解锁 */ public function del($key) { $this->_redis->del($key); } } $lockObj = Lock::getInstance(); //判断是能加锁成功, 第一个参数storage为索引的键,第二个参数10为索引的生命周期(秒) if($lock = $lockObj->set('storage',10)) { //1.加锁成功在这里执行业务逻辑 // 执行完后即可解锁 //2.解锁 $lockObj->del('storage'); } else { //加锁不成功执行其他操作。 //例如返回错误提示信息等 }
版权声明:本文为muwenbofx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。