当前位置: 首页 > news >正文

使用Postman并发测试接口关于RedisTemplate线程安全的一些理解

目录

1、前言

2、 使用Postman并发执行接口

 2.1、Postman版本为:7.36.6

2.1.1、请求参数为json

2.1.2、请求参数为form表单

2.2、Postman版本为:8.12.4

2.2.1、请求参数为json

2.2.2、请求参数为form表单

3、总结

4、参考资料


1、前言

        之前在学习redis的时候,做了一个“商品秒杀”的Demo公开到了网上,然后就有人评论:“redis本身就是线程安全的,没必要在秒杀方法上在加synchronized锁了”。

为了验证他的说法。

一开始我是打算用Junit,在test类中开多个线程同时去调用“doSecKill”方法。

 但这种测试的方法行不通!在程序运行的过程中,涉及到redis的操作都直接跳过了。我查了一下网上的说法,发现Junit并不适合用来测试多线程程序。

可参考:Junit测试多线程_xiaoyangxavier的博客-CSDN博客

因为懒得装Jmeter,我就用电脑上现有的Postman测试了一下。

2、 使用Postman并发执行接口

要测试的接口

 2.1、Postman版本为:7.36.6

2.1.1、请求参数为json

 

 Step1、

Step2、

Step3、上传参数文件(json)

 

 Step4、点击“Run 并发测试”按钮

并发测试执行情况 

 

2.1.2、请求参数为form表单

Step1、Step2同2.1.1

Step3、上传参数文件(txt)

Step4、点击“Run 并发测试”按钮

并发测试执行情况 

 

2.2、Postman版本为:8.12.4

 进入并发配置页面

2.2.1、请求参数为json

Step1、准备参数文件 data.json

 Step2、上传参数文件

 

 Step3、点击“Run 并发测试”按钮

执行结果

2.2.2、请求参数为form表单

Step1、准备参数文件 data.txt

Step2、上传参数文件

Step3、点击“Run 并发测试”按钮

执行结果

3、总结

RedisTemplate类,在我们配置好redis之后,本身就是一个线程安全的类。再使用 RedisTemplate类里面的相关方法,比如:opsForValue、opsForValue().decrement等这些,就无需再在方法上加锁,或者给某个代码块加锁了。因为这些方法对redis的操作都是原子化的。

不过对于RedisTemplate类是如何做到线程安全的,我在网上没有查到相关的说明解释,自己看源码,只看到了RedisTemplate类引入了一个类:TransactionSynchronizationManager

RedisTemplate类中有一个excute()方法,负责与redis建立连接。采用工厂模式,由RedisConnectionFactory类统一创建线程安全的redis的连接对象。在使用过程中由org.springframework.transaction.support.TransactionSynchronizationManager类对每个分配出去的redis连接对象进行监听。TransactionSynchronizationManager使用ThreadLocal来为不同的事务线程提供独立的资源副本,并且同时维护这些事务的配置属性和运行状态。当TransactionSynchronizationManager监听到RedisTemplate在执行redis操作相关的方法时,比如:redisTemplate.opsForValue().get(kcKey)、redisTemplate.opsForSet().isMember(userKey, uid)、redisTemplate.opsForValue().decrement(kcKey)等等。对于每一次redis操作都会被TransactionSynchronizationManager监听并为其操作线程提供独立的资源副本,“独立的资源副本”使得每一次redis操作互不干涉,避免了“脏数据”的情况。

总言而之:

1、RedisTemplate类通过RedisConnectionFactory实现操作线程原子化,确保在并发的情况下每一个操作线程不会被其他线程干扰。

2、RedisTemplate类通过TransactionSynchronizationManager对每个操作线程在操作过程的redis里面的数据提供“独立的资源副本”,避免碰到“脏数据”。

注:以上关于redis的叙述仅供参考

4、参考资料

Redis Setnx 命令_只有在 key 不存在时设置 key 的值。

https://www.jianshu.com/p/1e30e7a4b0c8

解决csv文件自动去掉首位0的方法__easyIT的博客-CSDN博客_csv保留首位是0

RedisTemplate中的execute方法如何使用 - 掘金 (juejin.cn)

Postman自动化测试时如何导入外部文件作为变量输入_欧世乐测试开发技术的博客-CSDN博客

Junit测试多线程_xiaoyangxavier的博客-CSDN博客

相关文章:

  • Java八锁现象
  • 谷氨酸三方突触丨SYSY谷氨酸GluA解决方案
  • 做一个校园跑腿小程序需要多少成本?
  • js实现pdf、word、excel、图片、html文件预览及下载
  • 孙卫琴的《精通Vue.js》读书笔记-注册全局组件和局部组件
  • 28、iNeRF
  • 相关性 与 独立性
  • set和map的模拟
  • window环境下安装大数据环境
  • 解决navicat premium连接数据库自动断开问题
  • 学历提升中的我,入职产品经理之路
  • 网络安全专家,这5本入门秘籍人手一套
  • 智源AI日报(2022-08-30): 华为谢凌曦:关于视觉识别领域发展的个人观点
  • 示波器十大基础知识你都了解多少
  • 【经典算法学习-排序篇】冒泡排序
  • [Vue CLI 3] 配置解析之 css.extract
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Angular2开发踩坑系列-生产环境编译
  • canvas绘制圆角头像
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • echarts花样作死的坑
  • Javascript编码规范
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Laravel核心解读--Facades
  • TCP拥塞控制
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue.js源码(2):初探List Rendering
  • 包装类对象
  • 类orAPI - 收藏集 - 掘金
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 译米田引理
  • 在Mac OS X上安装 Ruby运行环境
  • ​Spring Boot 分片上传文件
  • #QT项目实战(天气预报)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 2.1路线图
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net分布式压力测试工具(Beetle.DT)
  • .NET开源项目介绍及资源推荐:数据持久层
  • [《百万宝贝》观后]To be or not to be?
  • [20150321]索引空块的问题.txt
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色