背景:秒杀服务中要写一个定时任务:活动到期时给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 分布式锁的更多相关文章

  1. java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱

    java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱 redis数据库 Redis企业集群高级应用精品教程[图灵学院] Redis权威指南 利用redis + lua解决抢红包高并 ...

  2. asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现

    使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...

  3. 漫谈Redis分布式锁实现

    在Redis上,可以通过对key值的独占来实现分布式锁,表面上看,Redis可以简单快捷通过set key这一独占的方式来实现分布式锁,也有许多重复性轮子,但实际情况并非如此.总得来说,Redis实现 ...

  4. 七种方案!探讨Redis分布式锁的正确使用姿势

    前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...

  5. 分布式缓存重建并发冲突和zookeeper分布式锁解决方案

    如果缓存服务在本地的ehcache中都读取不到数据. 这个时候就意味着,需要重新到源头的服务中去拉去数据,拉取到数据之后,赶紧先给nginx的请求返回,同时将数据写入ehcache和redis中 分布 ...

  6. 用压测模拟并发、并发处理(synchronized,redis分布式锁)

    使用工具:Apache an 测压命令: ab -n 100 -c 100 http://www.baidu.com -n代表模拟100个请求,-c代表模拟100个并发,相当于100个人同时访问 ab ...

  7. 使用Redis分布式锁处理并发,解决超卖问题

    一.使用Apache ab模拟并发压测 1.压测工具介绍 $ ab -n 100 -c 100 http://www.baidu.com/ -n表示发出100个请求,-c模拟100个并发,相当是100 ...

  8. JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

    JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

  9. Redis 分布式锁进化史(解读 + 缺陷分析)

    Redis分布式锁进化史 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布 ...

  10. 一文看透 Redis 分布式锁进化史(解读 + 缺陷分析)(转)

    近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Z ...

随机推荐

  1. nginx日志按日期存储

    http {     include       mime.types;     default_type  application/octet-stream;     map $time_iso86 ...

  2. python 的钩子函数

    一.什么是钩子函数 hook函数就是在一定条件下才会执行的函数,将自己实现的函数挂载到挂载点上 1. hook函数:就是我们自己实现的函数,函数类型与挂载点匹配(返回值,参数列表)2. 挂接:也就是h ...

  3. SSH远程服务器时报错 /bin/bash : Permission denied

    SSH远程服务器时报错 /bin/bash : Permission denied 今日接到用户那边的报障,/bin/bash : Permission denied报错,用户使用的是具有sudo权限 ...

  4. 什么是axios

    原文: https://blog.csdn.net/qq_40837310/article/details/123028044 1.使用格式和jquery的ajax很相似,和最初的相比可以链式调用,1 ...

  5. PHP开启缓存加速

     PHP默认会将Operate Code文件丢弃,缓存加速是将其保存下来,放置共享内存中,以便在下次调用该PHP页面时重用,避免相同代码的重复编译 __________________________ ...

  6. 接入B站iframe视频(bilibili引用视频)

    感谢 https://blog.csdn.net/xinshou_caizhu/article/details/94028606 我们在查看其它资料的时候,视频总加载失败,后来发现是少了 https: ...

  7. 理解函数调用_使用argument参数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. DataStructures 01 日期抽象类设计与实现

    1.思维导图以及学习体会 1.1 思维导图 1.2 学习体会 比较大的一个感概就是学习数据结构必须要一步一步来,前期切不可跳过思考过程, 最好的办法还是每一步慢慢分析,写在纸上,初期就要慢慢分析慢慢来 ...

  9. Text文件颜色渐变

    using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEngine.UI;usi ...

  10. Finder是什么?Mac下的Finder有什么用?

    Finder是什么?Mac OS X系统下的Finder即相当于Windows系统下的"我的电脑"资源管理器.通过Finder,您能查看Mac 上几乎全部内容,包括应⽤软件.硬盘. ...