zoukankan      html  css  js  c++  java
  • php+redis 学习 二 悲观锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

    <?php
    header('content-type:text/html;chaeset=utf-8');
    
    /**
     * redis实战
     *
     * 实现悲观锁机制
     *
     */
    $timeout = 5000;
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    do {
        $microtime = microtime(true) * 1000;
        $microtime_time = date('Y-m-d H:i:s',$microtime);
        echo "执行microtime:{$microtime} ";
        echo "执行microtime_time:{$microtime_time} ";
        echo '<pre>';
        $microtimeout = $microtime+$timeout+1;
        $microtimeout_time = date('Y-m-d H:i:s',$microtimeout);
        echo "执行microtimeout_time:{$microtimeout_time} ";
        echo '<pre>';
        // 上锁
        $isLock = $redis->setnx('lock.count', $microtimeout);
        if (!$isLock) {
            $getTime = $redis->get('lock.count');
            if ($getTime > $microtime) {
                // 睡眠 降低抢锁频率 缓解redis压力
                usleep(5000);
                // 未超时继续等待
                continue;
            }
            // 超时,抢锁,可能有几毫秒级时间差可忽略
            $previousTime = $redis->getset('lock.count', $microtimeout);
            if ((int)$previousTime < $microtime) {
                break;
            }
        }
    } while (!$isLock);
    $count = $redis->get('count')? : 0;
    // file_put_contents('/var/log/count.log.1', ($count+1));
    // 业务逻辑
    echo "执行count加1操作~ ";
    echo '<pre>';
    $redis->set('count', $count+1);
    // 删除锁
    $redis->del('lock.count');
    // 打印count值
    $count = $redis->get('count');
    echo "count值为:$count ";
    echo '<pre>';
    

      

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读!

  • 相关阅读:
    [ 基础 转义字符 ] HTML转义字符对照表
    CRM 启用或禁用自定义代码执行
    CRM Setstate plugin
    CRM HomePage.aspx
    CRM 403错误
    CRM 2016 js 奇怪现象
    CRM 日期类型的一些处理JS
    CRM JS 设置lookup字段 setSimpleLookupValue
    CRM 2016 级联过滤 类比省市县
    CRM合并事件
  • 原文地址:https://www.cnblogs.com/GreenForestQuan/p/7492106.html
Copyright © 2011-2022 走看看