php------redis锁

看群里大牛说什么redis锁,完全不懂,然后自己百度了写文章看了看,觉得好的,我就转载过来了。。。

根据《redis 实战》书讲的redis锁的章节python修改成的php代码

为什么不用 watchmulti exec 事务主要还是效率问题,要结合前面的章节具体分析一下

<?php
$redis = new \Redis();
 
if ($redis->connect('127.0.0.1','6379') == false) {
    die($redis->getLastError());
}
item_lock($redis);
//redis 锁
function item_lock($redis){
    $locked=acquire_lock($redis,'market');
    if($locked==false){
        return false;
    }
    try{
        if($redis->Llen("success")>=10){
            return false;
        }
        $redis->LPUSH("success",rand(1,20));
    }finally  {//不管try代码是否错误都执行release_lock 解锁
        release_lock($redis, 'market', $locked);
    }
}
/**
 * [release_lock 释放锁]
 * @Author   admin@phpsong.com
 * @DateTime 2016-12-01T14:55:36+0800
 * @param    [type]                   $redis      [description]
 * @param    [type]                   $lockname   [description]
 * @param    [type]                   $identifier [description]
 * @return   [type]                               [description]
 */
function release_lock($redis, $lockname, $identifier){
    $lokename = 'lock:'.$lockname;
    while (true) {
        try{
            $redis->watch($lokename);
            if($redis->get($lockname) == $identifier){
                $redis->multi();
                $redis->delete($lockname);
                $redis->exec();
                return true;
            }
            $redis->unwatch();
            break;
        }catch(Exception $e) {
            //release_lock($redis, $lockname, $identifier);
            //echo 'Message: ' .$e->getMessage();
        }
 
    }
 
    return false;
}
/**
 * [redis加锁]
 * @Author   qiuyisong@dodoca.com
 * @DateTime 2016-12-01T14:23:53+0800
 * @param    [type]                   $redis           [redis 对象]
 * @param    [type]                   $lokename        [锁的民族]
 * @param    integer                  $acquire_timeout [锁超时时间]
 * @return   [type]                                    [description]
 */
function acquire_lock($redis, $lockname, $acquire_timeout=10, $lock_timeout=10){
    $identifier = uuid();
    $end = time()+$acquire_timeout;
    $lockname ='lock:'.$lockname;
    while(time()<$end){
        if($redis->setnx($lockname,$identifier)){//命令在指定的 key 不存在时,为 key 设置指定的值。
            $redis->expireat($lockname, $lock_timeout);
            return $identifier;
        }elseif($redis->ttl($lockname)==-1){//命令以秒为单位返回 key 的剩余过期时间
            $redis->expireat($lockname, $lock_timeout);
        }
        sleep(0.001);
    }
    return false;
}
/**
 * [uuid 生成uuid]
 * @Author   admin@phpsong.com
 * @DateTime 2016-12-01T14:32:09+0800
 * @return   [type]                   [description]
 */
function  uuid()    
{    
    $chars = md5(uniqid(mt_rand(), true));    
    $uuid = substr ( $chars, 0, 8 ) . '-'  
            . substr ( $chars, 8, 4 ) . '-'   
            . substr ( $chars, 12, 4 ) . '-'  
            . substr ( $chars, 16, 4 ) . '-'  
            . substr ( $chars, 20, 12 );    
    return $uuid ;    
}  
 
exit;

现在还不是很理解,留着,回头再来看看

转载于:https://my.oschina.net/sunYwp/blog/853607

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值