redis锁解决高并发问题,可防止重复提交


前言

这里我们主要利用Redissetnx的命令来处理高并发

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版权协议,转载请附上原文出处链接和本声明。