redis学习(014 实战:黑马点评:优惠券秒杀——1人只可以下1单问题解决方案)

news2024/9/26 1:08:59

黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目

总时长 42:48:00 共175P

此文章包含第54p-第p55的内容


文章目录

    • 一人一单问题分析
    • 第一种写法 查询后进行添加
    • 第二种写法 加悲观锁
      • 在用户上加悲观锁(提升性能)
      • 事务失效
      • 事务失效的底层原因
      • 解决代码
    • 模拟集群
      • 使用多个tomcat
      • 修改nginx配置文件-负载均衡到两个端口
      • 原因
        • 正常情况
      • 两个JVM

一人一单问题分析

在这里插入图片描述

不能让一个人把所有的优惠券都拍下来了

在这里插入图片描述

第一种写法 查询后进行添加

在这里插入图片描述
这里我们发送200个请求 这些请求是同一个用户的token,我们设置初始库存为100

在这里插入图片描述
测试请求200个 预期失败99.5%,这里我们发现失败率是95%,库存变成了90,没有锁住,因为存在线程并发问题,例:线程1查询后发现这个用户没抢过优惠券,准备添加订单,这时候线程2查询后发现这个用户没抢过优惠券,准备添加订单,这样就出现并发问题了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二种写法 加悲观锁

乐观锁在更新数据时使用,这是插入数据 只能加悲观锁

  1. 先将(查询订单、扣减库存、生成订单)这段逻辑抽离成一个新的方法
    在这里插入图片描述
  2. 快捷键 ctrl+alt+m 抽离代码生成新的方法
    在这里插入图片描述
  3. 修改方法名
    在这里插入图片描述
  4. 在当前加锁,并修改成public然后加事务注解@Transactional 在这里插入图片描述
    这样加锁 就相当于整个方法都加锁了 谁来查都要等待,我们只需要判断同一用户是否添加过即可,所以我们在用户id上加锁即可

在用户上加悲观锁(提升性能)

  1. 在用户上加锁
    在这里插入图片描述
  2. toString()方法无法保证userId相同
    在这里插入图片描述
    这里是new了一个对象,所以每次传进来的用户ID都是新的对象
    在这里插入图片描述
    我们使用intern方法(常量池里查找,但是这样数据量太大的话,会产生常量池溢出)
    在这里插入图片描述
    这里还有问题 因为先释放锁才能提交事务,这里的事务是在方法提交完之后再由spring进行提交
    在这里插入图片描述
    主要原因:当前事务的隔离级别是:可重复读

这样加锁可以,事务提交完再释放锁
在这里插入图片描述

事务失效

这里的方法是this(我们自动省略了this.) ,this.createVoucherOrder指的是目标对象的的方法 所以会造成事务失效。

在这里插入图片描述

事务失效的底层原因

因为如果在同一个Service中,方法A(未加@Transactional)调用方法B(加了@Transactional),那么事务可能会失效。这是因为Spring的事务管理是基于代理的,当方法A直接调用方法B时,不会触发B的方法代理,因此B的事务不会生效。

要确保B方法的事务有效,可以将方法B调用提取到另一个Service中,或者在A方法上也添加@Transactional。

事务失效的原因主要在于Spring的AOP代理机制。当你在一个类的方法上添加@Transactional时,Spring会为该类创建一个代理对象,以管理事务。以下是具体原因:

代理机制: Spring使用动态代理(JDK或CGLIB)来处理@Transactional。当你调用一个带有事务注解的方法时,代理会在方法执行前启动事务,在方法执行后提交或回滚事务。

直接调用: 如果在同一个类中,方法A直接调用方法B,实际上是通过this引用调用,因此不会触发代理,B方法的事务管理就不会生效。

解决方案: 为了解决这个问题,可以将方法B移到另一个Service中,这样调用时就会通过代理,从而确保事务生效。

Spring的设计: 这种设计是为了优化性能和减少复杂性,但也导致了开发者在使用时需要注意方法调用的上下文。

解决代码

如果直接使用目标对象,Spring将无法在方法调用前后执行必要的事务管理操作,因为它依赖于代理机制来插入这些事务管理步骤。

事务底层是aop实现的 因此 调用被包装方法应该采用aopcontext

我们使用代理对象进行调用,就可以防止事务失效了

在这里插入图片描述
记得引入aspectj依赖
在这里插入图片描述

暴露代理对象
在这里插入图片描述
在这里插入图片描述

修改完成后 我们重启项目 ,然后进行测试

这里再开启200条请求进行测试,预计失败率99.5%,只能成功一条
在这里插入图片描述

这里测试完成后确实是99.5%,只成功了一条
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模拟集群

这种情况只适合单机情况下使用,分布式集群下还是使用分布式锁比较好
在这里插入图片描述

使用多个tomcat

ctrl+D 把当前的启动项copy了一份,复制一个新的tomcat
在这里插入图片描述
添加配置项 修改端口号
在这里插入图片描述
新版IDEA配置,点击Modify options->Add VM options

修改nginx配置文件-负载均衡到两个端口

在这里插入图片描述
这里的nginx使用8080端口,负载均衡到8081和8082
在这里插入图片描述

负载均衡
在这里插入图片描述
打开注解,实现负载均衡
这里的42行被注释了,第43,48,49行都要放开,不要漏了
在这里插入图片描述

重新加载nginx配置文件
在这里插入图片描述

调用两次请求
在这里插入图片描述
这里都可以看见日志,证明负载均衡配置完成
在这里插入图片描述

我们调用两次锁 结果发现没有锁住 两个tomcat都执行了一次,扣了两个库存
在这里插入图片描述

原因

正常情况

在这里插入图片描述
这样会出现多次添加

在这里插入图片描述
解决方案 加锁
在这里插入图片描述
所以单机可以锁住

两个JVM

每个tomcat都有自己的虚拟机
在这里插入图片描述

分布式不一定是集群,但集群一定是分布式。

这里就需要分布式锁了,下一篇笔记进行讲解


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章: 详解 Vue 中 Watch 的使用方法及注意事项https://bl…

53 语言模型(和之后用来训练语言模型的数据集)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录理论部分使用计数来建模N元语法总结 代码读取长序列数据随机采样顺序分区 小结练习 理论部分 在上一部分中,我们了解了如何将文本数据映射为词元,以及将这些词元可以视为一系列离散的观测,例如单词或字符…

(务必收藏)推荐市面上8款AI自动写文献综述的网站

在当前的学术研究和论文写作中,AI技术的应用已经变得越来越普遍。特别是在文献综述这一环节,AI工具能够显著提高效率并减少人工劳动。以下是市面上8款推荐的AI自动写文献综述的网站: 一、千笔-AIPassPaper 是一款备受好评的AI论文写作平台&…

java 框架组件

Java 框架是一系列预先编写好的、可复用的软件组件,它们旨在帮助开发者快速构建高质量的应用程序。Java 社区拥有众多优秀的框架,涵盖了从 Web 开发到大数据处理的各个领域。下面是一些流行的 Java 框架及其主要用途: Spring框架:…

基于丹摩智算部署SD3+ComfyUI文生图详解

目录 丹摩智算简介SD3ComfyUI文生图简介 SD3ComfyUI文生图部署步骤1.1、实例创建 操作步骤从HF-mirror下载SD3模型安装git安装ComfyUI 丹摩智算简介 丹摩智算官网:https://www.damodel.com/home 丹摩智算(DAMODEL)是一款专为AI应用打造的智…

网红挣钱太容易了

你看最近这个三只羊小Y哥,因为月饼质量问题、因为大闸蟹的问题,上了好多次热搜,掉粉了几百万。还是有很多人在赶着要买他们家的东西。 你是他的粉丝,他是你的屠夫。只要冠以“全网最低价”的名号,就会有无数的粉丝跑过…

应用层协议 --- HTTP

序言 在上一篇文章中,我们在应用层实现了一个非常简单的自定义协议,我们在我们报文的首部添加了报文的长度并且使用特定的符号分割。但是想做一个成熟,完善的协议是不简单的,今天我们就一起看看我们每天都会用到的 HTTP协议 。 UR…

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手 近日,华语乐坛传来一则令人振奋的消息,11 岁的双胞胎姐妹花陈千言和陈万语荣获 2024 华语童声最受媒体欢迎女歌手和第 15 届华语金曲奖优秀童星两项大奖! 陈千言和陈万语…

前缀和(2)_【模板】二维前缀和_模板

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 前缀和(2)_【模板】二维前缀和_模板 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目…

centos磁盘逻辑卷LVM创建

centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷(PV) 3.创…

单词搜索问题(涉及递归等)

目录 一题目: 二思路解释: 三解答代码: 一题目: newcode题目链接: 单词搜索_牛客题霸_牛客网 二思路解释: 思路:个人理解是找到word中的第一个元素,然后去递归的上下左右查找&am…

python实现财会人工智能分享课件

前言: 一、财会与人工智能之间的联系 人工智能是计算机科学的一个分支,旨在模拟人类智能。自20世纪50年代起,AI经历了多个发展阶段,从规则基础系统到现在的深度学习技术,已经在医疗、制造、金融等多个行业得到广泛应用…

Volume数据管理

Volume 容器销毁时,保存在容器内部文件系统中的数据都会被清除,为了持久化保存容器的数据,可以使用kubernetes Volumevolume的生命周期独立于容器,Pod中的容器可能被销毁和重建,但Volume会被保留本质上,Kub…

【机器学习】Flux.jl 生态

官方API https://fluxml.ai/Flux.jl/stable/ecosystem/ 官网给出了 Flux’s model-zoo, 是一个庞大的案例库, 可以提供直观的参考, 并且还列举了基于 Flux.jl 开发的第三方库。 机器视觉 ObjectDetector.jl YOLO 抓取的“预备跑” 图像Met…

Vue3:作用域插槽

目录 一.性质 1.数据传递性 2.自定义显示方式 3.复用性 4.解耦性 二.作用 1.提高灵活性 2.增强可维护性 3.简化数据流 4.提升用户体验 三.使用 1.父组件 2.子组件 四.代码 1.父组件代码 2.子组件代码 五.效果 作用域插槽(Scoped Slots)…

一个很小的系统为什么负载那么高?

最近帮朋友优化一个系统&#xff0c;基本的情况如下&#xff1a;虚拟机&#xff0c;centos7.9&#xff0c;oracle 11.2.0.4&#xff0c;MES系统&#xff0c;数据量<50GB,日常session数不足100&#xff1b;按说这应该是一个负载很低的系统&#xff0c;但是用户却反映系统CPU经…

jQuery——jQuery的基本使用

1、使用 jQuery 核心函数&#xff1a;$ / jQuery 2、使用 jQuery 核心对象&#xff1a;执行 $&#xff08;&#xff09;返回的对象 3、引入 jQuery 函数库&#xff1a;可以本地引入&#xff08;不用联网&#xff09;&#xff0c;也可以远程引入&#xff08;需联网&#xff09…

GIS开发常用的开源地图数据框架有哪些?

学完Web前端开发&#xff0c;还需要掌握哪些内容&#xff1f;本篇文章再给大家主要讲讲针对WebGIS开发的地图和可视化数据库。 Echarts ECharts是一个使用 JavaScript 实现的开源可视化库。它可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC&#xff08;Digital to Analog Converter&…

分享课程:VUE数据可视化教程

在当今这个数据驱动的世界中&#xff0c;数据可视化已经成为了一种至关重要的工具&#xff0c;它帮助我们理解复杂的数据集&#xff0c;发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表&#xff0c;它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化&#xf…