一、应用场景
1、多人并发场景,例如秒杀,抢购,设置总数量一百,并发一次减1,减到0为止。
2、单人并发场景,例如连续点击事件,抢票脚本,事件往表插入一条记录,一个用户只能插入一条记录。
二、表结构
-- Create table create table IPLN_REDIS_TEST ( id VARCHAR2(32), key VARCHAR2(100), value NUMBER, remark VARCHAR2(100) ) tablespace TS_VER_EPM pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); -- Add comments to the table comment on table IPLN_REDIS_TEST is 'redis测试'; |
三、代码实现-使用关系型数据库处理并发
1、多人并发代码,请求成功,数量减1,减到0为止
@ResponseBody @RequestMapping(value = {"multipleConcurrency.do"}, method = {RequestMethod.POST}) public String multipleConcurrency(@RequestBody Map<String, Object> params){ //校验数据库中是否有key // ----------采用关系型数据库 处理并发---------- Map<String, Object> keyMap = iRedisTestService.getRedisTestByKey(params); if(keyMap != null && Integer.parseInt(keyMap.get("VALUE").toString()) > 0){ iRedisTestService.updateRedisTest(params); }else{ return "没有Key,或者并发数为0"; } return "并发成功,value-1"; } |
2、单人并发代码,请求成功,插入一条数据,同一操作人只能插入一条数据
@ResponseBody @RequestMapping(value = {"singleConcurrency.do"}, method = {RequestMethod.POST}) public String singleConcurrency(@RequestBody Map<String, Object> params){ // ----------采用关系型数据库 处理并发---------- Map<String, Object> keyMap = iRedisTestService.getRedisTestByKey(params); if(keyMap == null){ params.put("value", 1); params.put("remark", "一个用户并发"); iRedisTestService.insertRedisTest(params); }else{ return "已有并发数"; } return "并发成功,插入一条数据"; } |
四、PostMan进行测试
1、多用户并发postman测试
2、单用户并发测试
3、测试结果
五、Jmeter并发测试
1、编写测试计划,
单个并发测试,线程数5000并发
多个并发测试,线程数5000并发