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

php redis 悲观锁

时间:2024-01-10 10:36:40浏览次数:36  
标签: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/myJuly/p/17955937

相关文章

  • Zabbix5.0监控Redis6.0实录
    Zabbix5.0监控Redis6.0实录1.环境描述ZabbixServer:5.0.12Redis:6.2.6(集群,有密码)操作系统:Centos72.监控步骤(1)通过yum安装zabbix-agent2#yum-yinstallzabbix-agent2这里安装的zabbix-agent2也是5.0版本。(2)配置zabbix-agent2配置文件,我的配置文件如下......
  • redis 高可用 二 (主从复制、哨兵和集群Cluster)
    高可用分类主从复制主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。 哨兵在主从复制的基础......
  • 无涯教程-Redis - DISCARD命令函数
    RedisDISCARD命令刷新事务中所有先前排队的命令,并将连接状态恢复为正常。DISCARD-返回值返回字符串OKDISCARD-语法redisDISCARD命令的基本语法如下所示:redis127.0.0.1:6379>DISCARD参考链接https://www.learnfk.com/redis/transactions-discard.html......
  • 无涯教程-Redis - UNSUBSCRIBE 命令函数
    RedisUNSUBSCRIBE命令从给定通道取消订阅客户端,如果没有给出通道,则从所有通道取消订阅。UNSUBSCRIBE-语法以下是RedisUNSUBSCRIBE命令的基本语法。redis127.0.0.1:6379>UNSUBSCRIBEchannel[channel...]UNSUBSCRIBE-返回值返回数组。UNSUBSCRIBE-示例redi......
  • 无涯教程-Redis - SUBSCRIBE 命令函数
    RedisSUBSCRIBE命令将客户端订阅到指定的频道。SUBSCRIBEchannel-语法以下是RedisSUBSCRIBE命令的基本语法。redis127.0.0.1:6379>SUBSCRIBEchannel[channel...]SUBSCRIBEchannel-返回值返回数组。SUBSCRIBEchannel-示例redis127.0.0.1:6379>SUBSC......
  • 无涯教程-Redis - PFCOUNT 命令函数
    RedisPFCOUNT命令用于获取由存储在指定变量中的HyperLogLog数据结构计算出的近似基数,如果键不存在,则返回0。PFCOUNT-返回值返回唯一元素的近似数量。当PFCOUNT命令与多个键一起使用时,它将返回HyperLogLogs联合的近似基数。PFCOUNT-语法以下是RedisPFCOUNT命令的......
  • 无涯教程-Redis - ZSCAN 命令函数
    RedisZSCAN命令迭代"排序集"类型的元素及其关联的分数。ZSCAN-返回值返回数组。ZSCAN-语法以下是RedisZSCAN命令的基本语法。redis127.0.0.1:6379>ZSCANkeycursor[MATCHpattern][COUNTcount]参考链接https://www.learnfk.com/redis/sorted-sets-zscan.h......
  • 无涯教程-Redis - ZUNIONSTORE 命令函数
    RedisZUNIONSTORE命令计算由指定键给定的数字键排序集的并集,并将输出存储在目标位置,在传递输入键和其他(可选)参数之前,必须提供输入键(numkey)的数量。ZUNIONSTORE-返回值返回目标中输出排序集中的元素数。ZUNIONSTORE-语法以下是RedisZUNIONSTORE命令的基本语法。......
  • 无涯教程-Redis - ZSCORE 命令函数
    RedisZSCORE命令返回键排序后的元素的得分,如果元素不存在于排序集中,或者键不存在,则返回nil。ZSCORE-返回值返回元素的分数值。ZSCORE-语法以下是RedisZSCORE命令的基本语法。redis127.0.0.1:6379>ZSCOREkeymemberZSCORE-示例redis127.0.0.1:6379>ZADDm......
  • 深入理解PHP 8的新特性和底层优化
    引言随着PHP8版本的发布,这一被广泛应用的服务器端脚本语言再次展现出了其强大的生命力和持续创新的能力。PHP8带来了许多重大更新,包括全新的特性、语法改进以及底层性能优化。本文将带领读者深入探索PHP8的关键技术革新,并结合实例分析其对开发实践的影响。一、联合类型(UnionTyp......