首页 > Web开发 > 详细

PHP 使用redis set锁

时间:2020-01-13 23:42:59      阅读:143      评论:0      收藏:0      [点我收藏+]

const LOCKRSETUSR = ‘lockuser‘;

const SETNXKEYS = ‘user_nx_%s‘; 

const NOT_FREQUENT_OPERATION = ‘请勿频繁操作,请等待%s s‘;

 

//防刷:防止重复刷新页面,加锁随机码产生变动无法解锁
        $setnxkeys = sprintf(self::SETNXKEYS,$edata[‘uid‘]); //$data[‘uid‘] 操作用户的uid
        if($this->redis->exists($setnxkeys)) {
            $ttlsecond = sprintf(self::NOT_FREQUENT_OPERATION,$this->redis->ttl($setnxkeys));
            returnJson([‘status‘ =>0, ‘msg‘ => $ttlsecond]);
        }else{
            $this->redis->set($setnxkeys, 1, 7);
        }

  

//加锁

$token = rand(1, 100000);
$locksetkey = $this->redis->lockset(self::LOCKRSETUSR, $token);

//解锁
$this->redis->unlockset(self::LOCKRSETUSR, $token);

 

具体redis类方法

加锁

public function lockset($cachekey, $value, $expire_time=6) {
         return $this->handler->set($cachekey, $value, [‘NX‘, ‘EX‘=>$expire_time]);
     }

 解锁:

public function unlockset($cachekey,$token) {
        
        $script = ‘if redis.call("get",KEYS[1]) == ARGV[1]
        then
            return redis.call("del",KEYS[1])
        else
            return 0
        end;
        return $this->handler->eval($script, [$cachekey, $token],1);

}

 

$this->handler->eval($script, [$cachekey, $token],1);
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

解释: "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 是被求值的 Lua 脚本,数字 2 指定了键名参数的数量, key1 和 key2 是键名参数,
分别使用 KEYS[1] 和 KEYS[2] 访问,而最后的 first 和 second 则是附加参数,可以通过 ARGV[1] 和 ARGV[2] 访问它们。

PHP中使用redis拓展执行脚本时,eval方法的参数 3个,第一个是脚本代码,第二个是一个数组,参数数组,第三个参数是个整数,表示第二个参数中的前几个是key参数,剩下的都是附加参数

 

PHP 使用redis set锁

原文:https://www.cnblogs.com/yszr/p/12189923.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!