演示jvm锁存在的问题

文章目录

  • 1、AlbumInfoApiController --》testLock()
  • 2、redis添加键值对
  • 3、AlbumInfoServiceImpl --》testLock() 没有加锁
  • 4、使用ab工具测试
    • 4.1、安装 ab 工具
    • 4.2、查看 redis 中的值
  • 5、添加本地锁 synchronized
  • 6、集群情况下问题演示

jvm锁:synchronized lock 只能锁住一个jvm内的资源

1、AlbumInfoApiController --》testLock()

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album/albumInfo")
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoApiController {@GetMapping("test/lock")public Result testLock() {this.albumInfoService.testLock();return Result.ok("测试分布式锁案例");}}

2、redis添加键值对

在这里插入图片描述

3、AlbumInfoServiceImpl --》testLock() 没有加锁

    @Overridepublic void testLock(){Object numObj = this.redisTemplate.opsForValue().get("num");if (numObj == null) {this.redisTemplate.opsForValue().set("num", 1);return;}Integer num = Integer.parseInt(numObj.toString());this.redisTemplate.opsForValue().set("num", ++num);}

在这里插入图片描述

4、使用ab工具测试

ab 工具是 Apache Bench阿帕奇基准测试工具),一个由 Apache HTTP Server 项目提供的用于测试 web 服务器性能的命令行工具。ab 主要用于生成 HTTP 请求并发送到 web 服务器,以此来评估服务器的性能和响应能力。它是一个简单但功能强大的工具,广泛用于压力测试和性能测试场景。

之前在redis中,玩过ab测试工具:httpd-tools(yum install -y httpd-tools)

4.1、安装 ab 工具

[root@localhost ~]# yum install -y httpd-tools
已加载插件:fastestmirror, langpacks
[root@localhost ~]# ab
ab: wrong number of arguments
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:-n requests     Number of requests to perform-c concurrency  Number of multiple requests to make at a time-t timelimit    Seconds to max. to spend on benchmarkingThis implies -n 50000-s timeout      Seconds to max. wait for each responseDefault is 30 seconds-b windowsize   Size of TCP send/receive buffer, in bytes-B address      Address to bind to when making outgoing connections-p postfile     File containing data to POST. Remember also to set -T-u putfile      File containing data to PUT. Remember also to set -T-T content-type Content-type header to use for POST/PUT data, eg.'application/x-www-form-urlencoded'Default is 'text/plain'-v verbosity    How much troubleshooting info to print-w              Print out results in HTML tables-i              Use HEAD instead of GET-x attributes   String to insert as table attributes-y attributes   String to insert as tr attributes-z attributes   String to insert as td or th attributes-C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)-H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'Inserted after all normal header lines. (repeatable)-A attribute    Add Basic WWW Authentication, the attributesare a colon separated username and password.-P attribute    Add Basic Proxy Authentication, the attributesare a colon separated username and password.-X proxy:port   Proxyserver and port number to use-V              Print version number and exit-k              Use HTTP KeepAlive feature-d              Do not show percentiles served table.-S              Do not show confidence estimators and warnings.-q              Do not show progress when doing more than 150 requests-g filename     Output collected data to gnuplot format file.-e filename     Output CSV file with percentages served-r              Don't exit on socket receive errors.-h              Display usage information (this message)-Z ciphersuite  Specify SSL/TLS cipher suite (See openssl ciphers)-f protocol     Specify SSL/TLS protocol(SSL3, TLS1, TLS1.1, TLS1.2 or ALL)
ab  -n(一次发送的请求数)  -c(请求的并发数) 访问路径

在这里插入图片描述

[root@localhost ~]# ping 192.168.74.1
PING 192.168.74.1 (192.168.74.1) 56(84) bytes of data.
64 bytes from 192.168.74.1: icmp_seq=1 ttl=64 time=0.582 ms
64 bytes from 192.168.74.1: icmp_seq=2 ttl=64 time=0.427 ms
64 bytes from 192.168.74.1: icmp_seq=3 ttl=64 time=0.342 ms
64 bytes from 192.168.74.1: icmp_seq=4 ttl=64 time=0.370 ms
64 bytes from 192.168.74.1: icmp_seq=5 ttl=64 time=0.426 ms
64 bytes from 192.168.74.1: icmp_seq=6 ttl=64 time=0.548 ms
64 bytes from 192.168.74.1: icmp_seq=7 ttl=64 time=0.791 ms

在这里插入图片描述
在这里插入图片描述

redis中的值重新改为0。

[root@localhost ~]# ab -n 5000 -c 100 http://192.168.74.1:8500/api/album/albumInfo/test/lock
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.74.1 (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requestsServer Software:        
Server Hostname:        192.168.74.1
Server Port:            8500Document Path:          /api/album/albumInfo/test/lock
Document Length:        76 bytesConcurrency Level:      100
Time taken for tests:   5.374 seconds
Complete requests:      5000
Failed requests:        593(Connect: 0, Receive: 0, Length: 593, Exceptions: 0)
Write errors:           0
Total transferred:      2352965 bytes
HTML transferred:       382965 bytes
Requests per second:    930.38 [#/sec] (mean)
Time per request:       107.483 [ms] (mean)
Time per request:       1.075 [ms] (mean, across all concurrent requests)
Transfer rate:          427.57 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        1   19  19.7     17     404
Processing:    20   87  65.9     73     542
Waiting:       15   82  65.0     68     538
Total:         36  106  70.3     90     581Percentage of the requests served within a certain time (ms)50%     9066%    10075%    10880%    11590%    13895%    17698%    33099%    534100%    581 (longest request)

4.2、查看 redis 中的值

在这里插入图片描述

5、添加本地锁 synchronized

    @Overridepublic synchronized void testLock(){Object numObj = this.redisTemplate.opsForValue().get("num");if (numObj == null) {this.redisTemplate.opsForValue().set("num", 1);return;}Integer num = Integer.parseInt(numObj.toString());this.redisTemplate.opsForValue().set("num", ++num);}

在这里插入图片描述
redis中的值重新改为0。

重启之后,使用ab工具压力测试:5000次请求,并发100。

[root@localhost ~]# ab -n 5000 -c 100 http://192.168.74.1:8500/api/album/albumInfo/test/lock
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.74.1 (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requestsServer Software:        
Server Hostname:        192.168.74.1
Server Port:            8500Document Path:          /api/album/albumInfo/test/lock
Document Length:        76 bytesConcurrency Level:      100
Time taken for tests:   23.247 seconds
Complete requests:      5000
Failed requests:        746(Connect: 0, Receive: 0, Length: 746, Exceptions: 0)
Write errors:           0
Total transferred:      2353730 bytes
HTML transferred:       383730 bytes
Requests per second:    215.08 [#/sec] (mean)
Time per request:       464.933 [ms] (mean)
Time per request:       4.649 [ms] (mean, across all concurrent requests)
Transfer rate:          98.88 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    1   4.1      1     196
Processing:     5  446 365.2    414    2722
Waiting:        4  446 365.2    414    2722
Total:          5  447 365.4    415    2734Percentage of the requests served within a certain time (ms)50%    41566%    54875%    62480%    66490%    75095%    80098%   181999%   2408100%   2734 (longest request)

测试完成后,查看redis中的值:
在这里插入图片描述
完美!是否真的完美?
接下来再看集群情况下,会怎样?

6、集群情况下问题演示

启动多个运行实例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
redis中的值重新改为0。

[root@localhost ~]# ab -n 5000 -c 100 http://192.168.74.1:8500/api/album/albumInfo/test/lock
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.74.1 (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requestsServer Software:        
Server Hostname:        192.168.74.1
Server Port:            8500Document Path:          /api/album/albumInfo/test/lock
Document Length:        76 bytesConcurrency Level:      100
Time taken for tests:   8.714 seconds
Complete requests:      5000
Failed requests:        686(Connect: 0, Receive: 0, Length: 686, Exceptions: 0)
Write errors:           0
Total transferred:      2353430 bytes
HTML transferred:       383430 bytes
Requests per second:    573.79 [#/sec] (mean)
Time per request:       174.280 [ms] (mean)
Time per request:       1.743 [ms] (mean, across all concurrent requests)
Transfer rate:          263.74 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    2   3.2      1      54
Processing:     6  170 106.2    164     565
Waiting:        6  170 106.2    163     565
Total:          7  172 106.8    165     568Percentage of the requests served within a certain time (ms)50%    16566%    21875%    24980%    26990%    31795%    35198%    39899%    436100%    568 (longest request)

由于这三个运行实例的服务名都是 service-album,而网关配置的就是通过服务名负载均衡,我们只要通过网关访问,网关就会给我们做负载均衡了。

再次执行之前的压力测试,查看redis中的值:
在这里插入图片描述
集群情况下又出问题了!!!

以上测试,可以发现:

​ 本地锁只能锁住同一工程内的资源,在分布式系统里面都存在局限性。

此时需要分布式锁。。

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

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

相关文章

尚品汇-H5移动端整合系统(五十五)

目录&#xff1a; &#xff08;1&#xff09;运行前端页面 &#xff08;2&#xff09;启动前端页面 &#xff08;3&#xff09;添加搜索分类接口 &#xff08;4&#xff09;购物车模块修改 &#xff08;5&#xff09;登录模块 &#xff08;6&#xff09;订单模块 &#…

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module…

[python]从零开始的PySide安装配置教程

一、PySide是什么&#xff1f; PySide 是 Qt for Python 项目的一部分&#xff0c;它提供了与 PyQt 类似的功能&#xff0c;使开发者能够使用 Python 编程语言来构建基于 Qt 的图形用户界面 (GUI) 应用程序。PySide 是由 Qt 公司官方维护的&#xff0c;而 PyQt 则是由第三方开发…

【Pyside】pycharm2024配置conda虚拟环境

知识拓展 Pycharm 是一个由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Python 编程语言的开发。Pycharm 提供了代码编辑、调试、版本控制、测试等多种功能&#xff0c;以提高 Python 开发者的效率。 Pycharm 与 Python 的关系 Pycharm 是…

【JavaEE】——多线程(join阻塞,计算,引用,状态)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;join等待线程结束 1&#xff1a;知识回顾 2&#xff1a;join的功能就是“阻塞等待” …

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能&#xff0c;该如何去实现呢&#xff1f; 1.创建牌类&#xff1a;52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card)&#xff1a;包含大小和花色。 public class Card { //单张牌的大小及类型/…

无人机+自组网:中继通信增强技术详解

无人机与自组网技术的结合&#xff0c;特别是通过中继通信增强技术&#xff0c;为无人机在复杂环境中的通信提供了稳定、高效、可靠的解决方案。以下是对该技术的详细解析&#xff1a; 一、无人机自组网技术概述 无人机自组网技术是一种利用无人机作为节点&#xff0c;通过无…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

6--SpringBootWeb案例(详解)

目录 环境搭建 部门管理 查询部门 接口文档 代码 删除部门 接口文档 代码 新增部门 接口文档 代码 已有前端&#xff0c;根据接口文档完成后端功能的开发 成品如下&#xff1a; 环境搭建 1. 准备数据库表 (dept 、 emp) -- 部门管理 create table dept( id int un…

如何有效检测住宅IP真伪?

在当今的互联网时代&#xff0c;住宅IP&#xff08;即家庭用户通过宽带服务提供商获得的IP地址&#xff09;在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而&#xff0c;随着网络环境的复杂化和欺诈行为的增多&#xff0c;如何有效检测和辨别住宅IP的真伪成为了…

Spring:统一结果私有属性造成的前端无法访问异常报错问题

用户未填写任何评价 1.问题复现 &#xff08;1&#xff09;看一段代码 controller&#xff1a; import lombok.extern.slf4j.Slf4j; import org.ljy.testdemo.common.Result; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…

Centos中关闭swap分区,关闭内存交换

概述&#xff1a; Swap 分区是 Linux 系统中扩展物理内存的一种机制。Swap的主要功能是当全部的RAM被占用并需要更多内存时&#xff0c;用磁盘空间代理RAM内存。Swap对虚拟化技术资源损耗非常大&#xff0c;一般虚拟化是不允许开启交换空间的&#xff0c;如果不关闭Swap&…

【Linux课程学习】make/Makefile:Linux项目自动化构建工具

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f349;一.make/Makefile的理解&#xff1a; …

关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)

博客的风格是&#xff1a;答案一定不能在问题的后面&#xff0c;要自己想、自己背&#xff1b;回答都是最精简、最精简、最精简&#xff0c;可能就几个字&#xff0c;你要自己自信的展开。 面试官01&#xff1a;什么是模数转换/ADC&#xff1f;说说模数转换的流程&#xff1f; …

基于SpringBoot+Vue+MySQL的手机销售管理系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着智能手机的普及和市场竞争的日益激烈&#xff0c;手机销售行业面临着前所未有的挑战与机遇。传统的手工记录和简单的电子表格管理方式已难以满足现代手机销售业务的需求&#xff0c;销售数据的混乱和管理效率低…

技术成神之路:设计模式(十四)享元模式

介绍 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构性设计模式&#xff0c;旨在通过共享对象来有效地支持大量细粒度的对象。 1.定义 享元模式通过将对象状态分为内部状态&#xff08;可以共享&#xff09;和外部状态&#xff08;不可共享&#xff09;&#xf…

C语言-文件操作-一些我想到的、见到的奇怪的问题

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C语言】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C语言-文件操作-一些我想到的、见到的奇怪的问题 前言1.在不关闭文件的情况下&#xff0c;连续多次调用 fopen() 打开同一个文件&#xff0c;会发生什么&#xff1f;1.1过…

Cursor火出圈,未来程序员还有出路吗?

大家好&#xff0c;我是凡人。 今天我表弟家邻居的阿姨&#xff0c;托他问问我目前程序员还有前景吗&#xff0c;希望我根据十几年的经验给出点建议&#xff0c;看看程序员这条路未来能不能走。 一下子不知道该怎么回复他了&#xff0c;如果是三年前问我&#xff0c;肯定毫不…

【React】React18.2.0核心源码解读

前言 本文使用 React18.2.0 的源码&#xff0c;如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章&#xff1a;VsCode查看React源码全是类型报错如何解决。 阅读源码的过程&#xff1a; 下载源码 观察 package…