高并发解决方案之 redis 分布式锁
背景:秒杀服务中要写一个定时任务:活动到期时给order微服务发送关闭订单的通知。这需要改变数据库表中的数据,而集群中服务是多节点的方式进行部署,会出现并发执行的情况,所以采用的redis的分布式锁的实现方式。
Redis 锁(setNx)
特点: 如果没有获取到锁,请求会被丢弃。 只适合 消息队列 和定时任务场景
点击查看代码
public function sendEndNotice()
{
$lock = new QueueLockLogic(LimitCFG::CLOSE_LOCK_KEY);
$lock_res = $lock->lock(LimitCFG::CLOSE_LOCK_KEY);
if (!$lock_res) return false;
//...
$res = $lock->unlock(LimitCFG::CLOSE_LOCK_KEY);
return $res;
}
//再附上一个应用于砍价服务中消息队列的
加锁:
$uniqueKey = "bargain:cmq:upOrderStatus:$storeId_$branchId_$orderId_$status";
$lock = new QueueLockLogic($uniqueKey);
$lockRes = $lock->lock($uniqueKey);
if (!$lockRes){
throw new ErrException(ExceCode::E13161);
}
.....
解锁:
$res = $lock->unlock($uniqueKey);
===================方法原型============================
namespace App\Models\Logic;
use Swoft\Redis\Redis;
use Swoft\App;
/**
* Class QueueLockLogic
* @package App\Models\Logic
*/
class QueueLockLogic
{
private $redis;
private $prefix;
/**
*
* @param
*/
public function __construct(string $redisPrefix)
{
$this->redis = App::getBean(Redis::class);
$this->prefix = $redisPrefix;
}
/**
* 获取redis键
*
* @param string $unique
* @return string
*/
public function getKey(string $unique): string
{
return $this->prefix . $unique;
}
/**
* 获取锁
* 返回:
* true: 说明获得锁,
* false: 说明获得锁失败
*
* @param string $key
* @param integer $expireTime
* @return boolean
*/
public function lock(string $key, int $ttl = 60): bool
{
//加锁
$res = $this->redis->setNx($key, time() + $ttl);
if ($res === 0) { //加锁失败
//检测锁是否过期
$expireTime = $this->redis->get($key);
if ($expireTime < time()) { //锁已过期,获取锁
$oldExpireTime = $this->redis->getSet($key, time() + $ttl); //在查询期间可能有别的进程加锁,也许已经加锁成功。
if ($oldExpireTime < time()) {//加锁成功
return true;
}//即便加锁失败,重置了key的值也相差无几可忽略
}
return false;
}
return true;
}
/**
* 解锁
* @param string $key
* @return bool
*/
public function unlock(string $key): bool
{
return $this->redis->delete($key) > 0;
}
}
高并发解决方案之 redis 分布式锁的更多相关文章
- java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱
java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱 redis数据库 Redis企业集群高级应用精品教程[图灵学院] Redis权威指南 利用redis + lua解决抢红包高并 ...
- asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...
- 漫谈Redis分布式锁实现
在Redis上,可以通过对key值的独占来实现分布式锁,表面上看,Redis可以简单快捷通过set key这一独占的方式来实现分布式锁,也有许多重复性轮子,但实际情况并非如此.总得来说,Redis实现 ...
- 七种方案!探讨Redis分布式锁的正确使用姿势
前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...
- 分布式缓存重建并发冲突和zookeeper分布式锁解决方案
如果缓存服务在本地的ehcache中都读取不到数据. 这个时候就意味着,需要重新到源头的服务中去拉去数据,拉取到数据之后,赶紧先给nginx的请求返回,同时将数据写入ehcache和redis中 分布 ...
- 用压测模拟并发、并发处理(synchronized,redis分布式锁)
使用工具:Apache an 测压命令: ab -n 100 -c 100 http://www.baidu.com -n代表模拟100个请求,-c代表模拟100个并发,相当于100个人同时访问 ab ...
- 使用Redis分布式锁处理并发,解决超卖问题
一.使用Apache ab模拟并发压测 1.压测工具介绍 $ ab -n 100 -c 100 http://www.baidu.com/ -n表示发出100个请求,-c模拟100个并发,相当是100 ...
- JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案
JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案
- Redis 分布式锁进化史(解读 + 缺陷分析)
Redis分布式锁进化史 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布 ...
- 一文看透 Redis 分布式锁进化史(解读 + 缺陷分析)(转)
近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Z ...
随机推荐
- 读后笔记 -- Python 全栈测试开发 Chapter8:接口测试
8.1 接口测试 1. 市场分布 UI(web.app)自动化:10% 接口自动化:20% 单元测试:70% -- 测开 2. 接口类型: 1)结构划分:模块间(系统间)的接口称为内部接口:系统与第三 ...
- 没有可用软件包 iostat。
说明: iostat 主要用于监控系统设备的IO负载情况,根据这个可以看出当前系统的写入量和读取量,CPU负载和磁盘负载. iostat 命令的输出结果包含了很多信息,以下是一些常见的统计指标的解释: ...
- [Oracle19C 数据库管理] 管理存储与表空间
存储概览 存储的架构 Control File:储存了数据物理存储的信息.存在多个副本来避免单点故障.没有控制文件,数据库无法打开. DATA File: 存储用户与应用的信息,以及元数据与数据字典. ...
- [转]B树与B+树----mysql的索引结构
B树 和B+树是 MySQL索引使用的数据结构,对于索引优化和原理理解都非常重要,下面我的写文章就是要把B树,B+树的神秘面纱揭开,让大家在面试的时候碰到这个知识点一往无前,不再成为你的知识盲点! 1 ...
- VMware Fusion Pro 13.0.0 最新序列号【转】
Fusion简介 VMware Fusion是最好的Windows-to-Mac解决方案,是任何平台上最强大的应用开发和测试工具. Fusion 13支持macOS 13.0,为开发者.IT管理员和普 ...
- VSCode-WSL配置 C++ —— 以OpenCV4为例
生成并编辑c_cpp_properties.json 命令窗口输入:>C/C++: Edit Configurations(JSON),就会自动生成该文件 在includePath中加上需要in ...
- windows11上面打开HEIC文件的有效方法
今天在传资料的时候,用手机拍了一张照片传到window11,打开时竟然无法打开,顿时有点诧异,仔细看了文件类型(HEIC),可能软件不识别,怎么解决呢? 经过搜索整理尝试了许多方法,没找到一个合适的. ...
- nop4.3 用户权限管理
权限管理涉及到5张表: //用户表 select * from Customer //角色表select * from CustomerRole //用户和角色对应关系select * from Cu ...
- Unity 凹多边形三角剖分
游戏中需要实现一个小功能,显示一个玩家的能力图,这个图是一个有6个顶点任意摆放组合的多边形.而绘制多边形主要用到的知识就是Mesh构建,mesh的构建主要需要顶点列表,三角形列表,法线列表.uv列表等 ...
- 解决Ubuntu下的的“system program problem detected”问题
解决Ubuntu下的的"system program problem detected"问题 1.删除crash文件 sudo rm /var/crash/*2.关闭pop up功 ...