首页 > 数据库 >php redis 悲观锁

php redis 悲观锁

时间:2023-04-03 18:44:05浏览次数:56  
标签:count 悲观 redis echo microtimeout microtime time php

 

悲观锁(Pessimistic Lock), 顾名思义,就是每次处理redis数据都以最悲观的场景展开,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会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>';
复制代码

 

标签:count,悲观,redis,echo,microtimeout,microtime,time,php
From: https://www.cnblogs.com/yzl042349/p/17284023.html

相关文章

  • php kafka生产者,消费者操作
     php7.2  kafka7.8.1生产者代码<?php$conf=newRdKafka\Conf();$conf->setDrMsgCb(function($kafka,$message){file_put_contents("./dr_cb.log",var_export($message,true).PHP_EOL,FILE_APPEND);});$conf->setErrorCb(function($ka......
  • crontab + ThinkPHP6 配合使用
    crontab+ThinkPHP6配合使用1:命令行执行phpthinkmake:commandHellohellophpthinkmake:command控制器名方法名2:console配置3:测试执行phpthinkhello控制台得到结果hello4:配置到linuxcrontab中/usr/local/bin/php/www/web/path/thinkhel......
  • php swoft 中的数据分层
        不仅仅局限于MVC。将数据在model这一个层面剖析开,优雅的处理数据 逻辑,缓存,业务,数据库操作的烦恼。 这个思路也适用于thinkphp,hyperf,imi等框架。不再简单的实现controller->model->view的处理过程。  简化代码,每一层清晰地定义相应处理的数据。......
  • php 扩展 rabbitmq popt
     首先是rabbitmq-c-master.tar.gz包,可以访问https://github.com/alanxz/rabbitmq-c去下载最新的wgethttps://github.com/alanxz/rabbitmq-c.gitwgethttps://github.com/alanxz/rabbitmq-c/archive/v0.10.0.tar.gz  0.8.0这个版本 对popt 要求低一些,如果你遇......
  • php架构之路,phper进阶,学习路线
     鉴于最近跟小伙伴聊了很多PHP架构发展方向的问题,相关技术整理了一下,也顺便规划了一下自己下年。【我的学习路线】一.常用的设计模式以及使用场景    以下是我用到过的  工厂,单例,策略,注册,适配,观察者,原型,装饰器,facade,loc,pipeline二.阅读一个框架源码 例如:laravel......
  • redis 高级数据 hyperLogLog
     1、统计独立的UV2、用做    基数  统计的{1,3,5,7,8,7,5} 基数集:{1,3,5,7,8}     基数:5{1,1,1,1,1,7,1}基数集:{1,7}基数:2基数是数据集去重后元素个数  用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据 核心是技术估算......
  • redis集群简介
     1.1       集群的概念所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。1.1.1      使用redis集群的必要性问题:我们已经部署好了redis,并且能启动一个redis,实现数据的读写,为什么还要学习redis集群?答:(1)单个redis存在......
  • php 如何实现 git diff
    无意间想到这个问题,如何用php来实现gitdiff,如果实现了这个功能,岂不是能够使用php对在线编辑文件的功能做更进一步的优化和提升?查了一下还真有这样的库,话不多说,开始执行composerrequire--devsebastian/diff得到结果Infofromhttps://repo.packagist.org:#StandW......
  • PHPExcel 中文使用手册详解
     1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848......
  • Redis常用命令
    命令参考:https://www.redis.net.cn字符串String操作命令Redis中字符串类型常用命令:*SETkeyvalue 设置指定key的值*GETkey  获取指定key的值*SETEXkeysecondsvalue设置指定key的值,并将key的过期时间设为secon......