Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis实战13-集群下线程并发安全问题

Redis实战13-集群下线程并发安全问题

原创
作者头像
凯哥Java
发布于 2023-02-25 14:53:27
发布于 2023-02-25 14:53:27
5180
举报
文章被收录于专栏:凯哥Java凯哥Java

通过前面两篇(Redis实战11-实现优惠券秒杀下单 Redis实战12-优惠券实现一人一单功能)的学习,我们已经解决了单机情况下优惠券秒杀及一人一单功能。其中,在优惠券秒杀时候,使用到了乐观锁处理的,在一人一单功能时候,使用了悲观锁,synchronized关键字及处理了spring事务失效情况。但是随着业务的增长,单机服务已经不能满足我们需求了,这个时候,需要多台机器来支撑。这就构成了集群,那么在集群模式下,我们再来测试我们的优惠券秒杀及一人一单情况。

从本篇文章开始,咱们就来学学Redis实现分布式锁。预计使用七个篇幅来讲解。在讲解完之后,我们使用5个篇幅讲讲Redisson实现分布锁的。如下图:

1:我们将服务器启动两份,端口分别是8081和8082

在idea中,找到启动的项目,running,然后ctrl+D.如下图:

如果在没有这个。按照如下方法:

1.点击菜单栏:Views -> Tool Windows -> Services;快捷键:Alt+8.如下图:

2.刚创建好的窗口是空白的,需要我们把服务加进去。

具体看在凯哥个人博客网站上搜索:《【经验:图文教程】IDEA开启并配置services窗口,观察启动模块的端口并方便操作.》和《【经验】在Idea中怎么一个spring boot服务怎么模拟多台实例部署》查看这两篇文章。

修改完端口之后,启动服务就能看到如下:启动了两个服务,端口分别是8081和8082

2:修改nginx的conf目录下nginx.conf文件,配置反向代理和负载均衡:

我们先来看看,当前nginx.conf配置文件的内容:

从上图中,我们可以看到,访问api的时候,反向代理是8081.我们修改方向代理为8082和8081

tianj upstream backend如下图:

添加完之后,修改api的proxy_pass。如下图:

修改完成之后,我们重启Nginx。在Nginx的目录下,使用nginx.exe -s reload命令重启。如下图:

测试Nginx是否负载均衡生效。

请看idea中8081和8082的日志,然后访问我们的前端页面,我们会发现,8081和8082的日志轮询的打印。说明Nginx负载均衡生效了。

我们来测试集群模式下,线程并发安全问题

我们在8081服务中,同步代码块打上断点,8082的服务不变。我们来测试同一个用户,在集群下是否会出现一人多单的情况。我们用postman进行测试:

访问完成之后,查看数据库中库存情况:

订单情况:

经过测试后的答案是肯定会出现一人多单的情况。为什么呢?我们来分析分析。

单机或者同一个JVM中,时序图如下:

当是集群的时候,是多个JVM进程了。这个时候,集群下时序图:

因为,我们使用的synchronized关键字实现的锁,是JVM级别的。现在是集群环境下,已经跨JVM进程了,synchronized锁已经锁不住了。

那么怎么解决呢?在下一篇中,咱们就来讲讲分布式锁

大家好,我是凯哥Java(kaigejava),乐于分享技术文章

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis实战12-优惠券实现一人一单功能
在上一篇, Redis实战11-实现优惠券秒杀下单 我们已经把超卖问题解决了。接下来,我们来开发,优惠券一人一单功能。通过本文学习,您将有如下收获:
凯哥Java
2023/02/18
1K0
Redis实战12-优惠券实现一人一单功能
Redis解决秒杀下单
上述就是实现最基本的优惠卷下单功能。当然真实的业务场景绝对不会是向我们这么简单的。
用户11097514
2024/05/30
1780
Redis解决秒杀下单
Redis实战11-实现优惠券秒杀下单
1:查下优惠券、2:判断是否秒杀开始;3:判断秒杀是否结束;4:判断库存是否充足;5:扣减库存;6:创建订单;
凯哥Java
2023/02/11
1.2K0
Redis实战11-实现优惠券秒杀下单
Redis分布式锁实战
我们学习 Java 都知道锁的概念,例如基于 JVM 实现的同步锁 synchronized,以及 jdk 提供的一套代码级别的锁机制 lock,我们在并发编程中会经常用这两种锁去保证代码在多线程环境下运行的正确性。但是这些锁机制在分布式场景下是不适用的,原因是在分布式业务场景下,我们的代码都是跑在不同的JVM甚至是不同的机器上,synchronized 和 lock 只能在同一个 JVM 环境下起作用。所以这时候就需要用到分布式锁了。
编程大道
2020/07/15
6490
Redis分布式锁实战
Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占用内存少,支持热部署,并发能力强,专为高并发而优化,事实上Nginx的并发能力在同类型的网页服务器中表现最好(来自百度百科)
晚上没宵夜
2022/05/09
4650
Nginx
那些年,我们见过的Java服务端“问题”
明代著名的心学集大成者王阳明先生在《传习录》中有云:“道无精粗,人之所见有精粗。如这一间房,人初进来,只见一个大规模如此。处久,便柱壁之类,一一看得明白。再久,如柱上有些文藻,细细都看出来。然只是一间房。”
macrozheng
2019/10/01
9370
【详解】Tomcat+Nginx集群与负载均衡
在现代Web应用开发中,高可用性和高性能是系统设计的重要目标。为了实现这些目标,通常会采用集群和负载均衡技术。本文将详细介绍如何使用Nginx作为反向代理服务器,结合多个Tomcat实例构建一个高可用、高性能的Web应用集群。
大盘鸡拌面
2025/01/23
1330
微服务架构之:Redis分布式锁
在单体架构上,乐观锁和悲观锁可以锁住并发情况下的同步代码块,我们多使用synchronized来对方法加锁。但是在配上负载均衡的集群模式下, 普通的synchronized是无法锁住从两台服务器同时进入的请求 。
用户6256742
2024/07/15
1290
微服务架构之:Redis分布式锁
Nginx+Tomcat+Redis负载均衡Session共享实现超级简单(CentOS6.9系统 Java版本)
第一步Nginx+Tomcat 实现负载均衡的测试  相关软件环境 软件名称 版本号 版本说明 Java 1.7 linux版本 Tomcat 8081 7.x linux版本 Tomcat 8082 7.x linux版本 Redis 3.2.9 linux版本 Nginx 1.12.0 linux版本 CentOS 6.9 ---------- MySql 系统自带 ---------- 链接: https://pan.baidu.com/s/1i5U3srj 密
小帅丶
2018/02/09
1.4K0
Nginx+Tomcat+Redis负载均衡Session共享实现超级简单(CentOS6.9系统 Java版本)
Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用
数据库自增指的是单独使用数据库中某一张表来专门存放主键,当我们需要的时候,只需要提前从该表中读取出一批主键集合,缓存在内存中即可,但是该方法显然太慢了,因此不推荐使用
大忽悠爱学习
2022/05/09
7950
Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用
Redis进阶学习08--多级缓存
传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图:
大忽悠爱学习
2022/05/11
2.9K0
Redis进阶学习08--多级缓存
还能用mysql实现分布式锁?
之前的文章中通过电商场景中秒杀的例子和大家分享了单体架构中锁的使用方式,但是现在很多应用系统都是相当庞大的,很多应用系统都是微服务的架构体系,那么在这种跨jvm的场景下,我们又该如何去解决并发。
程序员老猫
2021/01/06
1.1K0
还能用mysql实现分布式锁?
Redis常见面试题(二):redis分布式锁、redisson;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
还记得Redis使用场景、缓存穿透、缓存击穿、缓存雪崩、Redis持久化、数据过期策略、数据淘汰策略吗?如果忘记可以到这里重新温习, Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略。
寻求出路的程序媛
2024/07/24
2.7K0
Redis常见面试题(二):redis分布式锁、redisson;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
SpringCloud-Nacos集群搭建
本文详细介绍了如何在SpringCloud环境中搭建Nacos集群。通过清晰的步骤和详尽的说明,帮助读者在SpringCloud中成功搭建Nacos集群。文章详细介绍了安装和配置的每个步骤,确保了高可用性和可伸缩性。通过清晰的说明和示例,读者能够轻松理解复杂的集群搭建过程,实现微服务体系的稳固运行。这篇文章是搭建Nacos集群的理想参考,为构建可靠的分布式系统提供了关键信息。
Damon小智
2024/02/18
4491
SpringCloud-Nacos集群搭建
北京某金融公司面试题,精选10道讲解!
面试造火箭工作拧螺丝,最近一位朋友在面试中被问到各种各样的分布式微服务的面试题,也回答上来了。可是,等正式入职后,发现这家公司居然全部是使用单体项目,完全没有分布式微服务的东东,失望至极!
田维常
2023/08/31
2880
北京某金融公司面试题,精选10道讲解!
Nginx+Tomcat关于Session的管理【面试+工作】
解决办法安装epel:EPEL是企业版 Linux 附加软件包的简称,EPEL是一个由Fedora特别兴趣小组创建、维护并管理的,针对 红帽企业版 Linux(RHEL)及其衍生发行版(比如 CentOS、Scientific Linux、Oracle Enterprise Linux)的一个高质量附加软件包项目;
Java帮帮
2018/11/22
9620
公司新来一个同事,把优惠券系统设计的炉火纯青!
如:A优惠券一共发行120张,每一个用户可以领取140张,当一个用户领取优惠券成功的时候,把领取的记录写入到另外一个表中(这张表我们暂且称为表B)
Java团长
2022/12/20
1.6K1
公司新来一个同事,把优惠券系统设计的炉火纯青!
Redis分布式事务锁的应用——秒杀、超卖 简单例子 (下)
上一篇文章介绍了Redisson的分布式锁原理,这篇文章来验证一下Redisson分布式锁的作用。
HaC
2020/12/30
1.1K0
Redis分布式事务锁的应用——秒杀、超卖 简单例子 (下)
Java面试:2021.05.28
大体来说,经历以下过程:接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说,接口测试流程分成以下九步:
夕梦
2021/06/03
3460
Java面试:2021.05.28
Java锁好用还是分布式锁好用?
目前的项目单体结构的基本上已经没有了,大多是分布式集群或者是微服务这些。既然是多台服务器。就免不了资源的共享问题。既然是资源共享就免不了并发的问题。针对这些问题,redis也给出了一个很好的解决方案,那就是分布式锁。这篇文章主要是针对为什么需要使用分布式锁这个话题来展开讨论的。不喜勿喷,准备一套金三银四总结的面试真题共享给你们实战备用!
Java程序猿
2021/05/27
7400
相关推荐
Redis实战12-优惠券实现一人一单功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档