广告
返回顶部
首页 > 资讯 > 数据库 >Redis分布式锁解决秒杀超卖问题
  • 182
分享到

Redis分布式锁解决秒杀超卖问题

Redis秒杀超卖Redis分布式锁 2022-07-13 10:07:21 182人浏览 独家记忆
摘要

目录分布式锁应用场景单体锁的分类分布式锁核心逻辑分布式锁实现的问题——死锁和解决Redis解决删除别人锁的问题分布式锁应用场景 秒杀环境下:订单服务从库存中心拿到库存数,如果库存总数大于0,则进

分布式锁应用场景

Redis分布式锁解决秒杀超卖问题

秒杀环境下:订单服务从库存中心拿到库存数,如果库存总数大于0,则进行库存扣减,并创建订单
订单服务负责创建订单
库存服务负责扣减库存

Redis分布式锁解决秒杀超卖问题

模拟用户访问库存

Redis分布式锁解决秒杀超卖问题

Redis分布式锁解决秒杀超卖问题

多线程并发访问,出现超卖问题,线程安全。没有保证原子性

单体锁的分类

单体应用锁指的是只能在 一个JVM 进程内有效的锁。我们把这种锁叫做单体应用锁

synchronized锁ReentrantLock锁
一个 Tomcat 可以看作是一个JVM进程,当大量请求并发到系统时,所有的请求都落在这唯一的一个Tomcat上,如果某些请求方法是需要加锁的,比如:秒杀扣减库存,是可以满足需求的,但是随着访问量的增加,导致一个tomcat 难以支撑,这时我们必然就是集群部署Tomcat ,使用多个 Tomcat 共同支撑整个系统。

Redis分布式锁解决秒杀超卖问题

我们看到系统中存在两个Tomcat,我们加的锁是jdk提供的锁,这种锁只能在 一个JVM 下起到作用,也就是在一个Tomcat内是没有问题的。当存在两个或两个以上的Tomcat时,大量的并发请求分散到不同的Tomcat上,在每一个Tomcat中都可以防止并发的产生,但是在多个Tomcat之间,每个Tomcat中获得锁的这个请求,又产生了并发,从而产生超卖现象。这也就是单体应用锁的局限性了,它只能在一个JVM内加锁,所以单体锁只能锁住单体环境,是锁不住分布式环境或集群环境的。

分布式锁核心逻辑

分布式锁的核心逻辑就是在多个服务中设置一个公共的资源,在公共资源中设置锁,供多个服务去同时抢夺锁资源,一旦其中一个线程抢夺成功,其他线程就进入自旋状态,不同的尝试访问获取锁资源,在获取锁资源的线程执行完相应的逻辑以后就会释放锁资源,其他线程就可以获取锁资源。

Redis分布式锁解决秒杀超卖问题

Redis分布式锁解决秒杀超卖问题

分布式锁实现的问题——死锁和解决

死锁:
如果某个线程在执行锁逻辑过程中宕机,导致没有删除锁
解决:

添加过期时间

Redis分布式锁解决秒杀超卖问题

因为是非原子性添加过期时间,可能导致在添加过期时间之前就出现宕机现象,此时依旧进入死锁状态。原子性添加过期时间

Redis分布式锁解决秒杀超卖问题

Redis解决删除别人锁的问题

删除别人锁:
当有线程A进入后由于超时,有其他线程B进入,此时redis中的锁是线程B的,而原来的线程A接着执行,线程A删除了别人的锁。

删除别人锁解决:
①给当前线程绑定一个局部变量uuid,由于每个线程都有一份自己的局部变量,那么线程和局部变量绑定之后,我们在删除锁之前判断一下,当前这把锁是不是自己的载进行删除
②使用lua表达式进一步解决

Redis分布式锁解决秒杀超卖问题

上述方案还是存在问题,在线程A自己的uuid刚好与redis的uuid比较完,正准备删除的时候过期,这时候B线程进入,此时的redisuuid就不是线程A的了,此时还是会存在删除别人锁的问题。
这是由于在拿锁、比较锁和删除锁的过程中并不是原子性的操作。解决此问题可以使用lua表达式

Redis分布式锁解决秒杀超卖问题

 到此这篇关于Redis分布式锁解决秒杀超卖问题的文章就介绍到这了,更多相关Redis秒杀超卖内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: Redis分布式锁解决秒杀超卖问题

本文链接: https://www.lsjlt.com/news/33337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis分布式锁解决秒杀超卖问题
    目录分布式锁应用场景单体锁的分类分布式锁核心逻辑分布式锁实现的问题——死锁和解决Redis解决删除别人锁的问题分布式锁应用场景 秒杀环境下:订单服务从库存中心拿到库存数,如果库存总数大于0,则进...
    99+
    2022-07-13
    Redis秒杀超卖 Redis分布式锁
  • 解决redis秒杀超卖的问题
    小编给大家分享一下解决redis秒杀超卖的问题,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!首先,生成库存的计数量 public function kucun() { ...
    99+
    2022-10-18
  • Go+Lua解决Redis秒杀中库存与超卖问题
    目录0、简介1、简单版2、解决超卖3、解决库存问题Lua0、简介 Go语言连接go-Redis进行数据库的连接,如果你对这部分尚不了解,建议你先学习这部分知识。另外,本秒杀主要解决两个问题,第一个就是超卖问题,另一个就是...
    99+
    2023-03-01
    GoLuaRedis秒杀 GoLuaRedis库存与超卖
  • Redis中秒杀场景下超时与超卖问题如何解决
    这篇文章主要介绍“Redis中秒杀场景下超时与超卖问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis中秒杀场景下超时与超卖问题如何解决”文章能帮助大家解决问题。超时1.redis连...
    99+
    2023-06-30
  • Redis中秒杀场景下超时与超卖问题的解决方案
    目录超时1.redis连接超时原因2.解决方法超卖1.秒杀超卖现象2.解决方案(1)利用乐观锁淘汰用户,解决超卖问题(2)、使用reids的 watch + multi + setn...
    99+
    2022-11-13
  • 如何解决Redis高并发防止秒杀超卖的问题
    这篇文章主要介绍了如何解决Redis高并发防止秒杀超卖的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1:解决思路将活动写入 redis 中,通过 redis 自减指令扣...
    99+
    2023-06-25
  • Redis高并发场景下秒杀超卖解决方案(秒杀场景)
    目录1 什么是秒杀2 为什么要防止超卖3 单体架构常规秒杀3.1 常规减库存代码3.2 模拟高并发3.3 超卖现象3.4 分析原因4 简单实现悲观乐观锁解决单体架构超卖4.1 悲观锁...
    99+
    2022-11-13
  • 怎么使用Go和Lua解决Redis秒杀中库存与超卖问题
    这篇文章主要介绍“怎么使用Go和Lua解决Redis秒杀中库存与超卖问题”,在日常操作中,相信很多人在怎么使用Go和Lua解决Redis秒杀中库存与超卖问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使...
    99+
    2023-07-05
  • Redis锁完美解决高并发秒杀问题
    目录1 单机环境下的锁 2 分布式情况下使用Redis锁。 3 一台服务宕机,导致无法释放锁 4 给每一把锁加上过期时间 5延长锁的过期时间,解决锁失效 6 使用Redisson简化...
    99+
    2022-11-12
  • 如何分析基于redis分布式锁实现秒杀
    本篇文章为大家展示了如何分析基于redis分布式锁实现秒杀,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。业务场景所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源,这里的资源在大部分秒杀场景里是...
    99+
    2023-06-02
  • Springboot整合Redis实现超卖问题还原和流程分析(分布式锁)
    目录超卖简单代码超卖问题单服务器单应用情况下设置synchronizedRedis实现分布式锁 通过超时间解决上述问题通过key设置值匹配的方式解决形同虚设问题 ...
    99+
    2022-11-12
  • 如何解决redis分布式锁的问题
    这篇文章主要为大家展示了“如何解决redis分布式锁的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决redis分布式锁的问题”这篇文章吧。分布式锁在...
    99+
    2022-10-18
  • 解决python-redis-lock分布式锁的问题
    python-redis-lock 官方文档 不错的博文可参考 问题背景 在使用celery执行我们的异步任务时,为了提高效率,celery可以开启多个进程来启动对应的worke...
    99+
    2022-11-12
  • 如何解决redis分布式锁超时
    解决redis分布式锁超时的方法:当锁超时时间快到期且逻辑未执行完,可延长锁超时时间。示例:if redis.call("get",KEYS[1]) == ARGV[1] thenredis.call("set",KEYS[1],ex=30...
    99+
    2022-10-11
  • 基于redis分布式锁如何实现秒杀功能
    这篇文章主要介绍了基于redis分布式锁如何实现秒杀功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。业务场景所谓秒杀,从业务角度看,是短时...
    99+
    2022-10-18
  • SpringBoot之使用Redis实现分布式锁(秒杀系统)
    目录一、Redis分布式锁概念篇1.1、为什么要使用分布式锁1.2、分布式锁应具备哪些条件1.3、分布式锁的三种实现方式二、Redis分布式锁实战篇2.1、导入依赖2.2、配置Red...
    99+
    2022-11-12
  • Redis高并发防止秒杀超卖实战源码解决方案
    目录1:解决思路2:添加 redis 常量3:添加 redis 配置类4:修改业务层1:秒杀业务逻辑层2:添加需要抢购的代金券3:抢购代金券5:postman 测试6:压力测试8:配...
    99+
    2022-11-12
  • redis分布式锁释放问题怎么解决
    在Redis中实现分布式锁时,可以使用以下两种方式解决锁释放的问题: 设置锁的过期时间:在获取锁时,设置一个过期时间,超过该时间...
    99+
    2023-10-27
    redis
  • Redis优惠券秒杀问题怎么解决
    本篇内容主要讲解“Redis优惠券秒杀问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis优惠券秒杀问题怎么解决”吧!1 实现优惠券秒杀功能下单时需要判断两点:1.秒杀是否开始或...
    99+
    2023-07-04
  • Redis实现秒杀的问题怎么解决
    本篇内容介绍了“Redis实现秒杀的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、秒杀逻辑...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作