springboot集成redis实现简单秒杀系统的方法
这篇文章给大家分享的是有关springboot集成redis实现简单秒杀系统的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
1. 直接service,我们会介绍两种秒杀模式
publicinterfaceGoodsService{ /** *通过lua脚本实现的秒杀 *@paramskuCode商品编码 *@parambuyNum购买数量 *@return购买数量 */ LongflashSellByLuaScript(StringskuCode,intbuyNum); /** *通过redis事务实现的秒杀 *@paramskuCode商品编码 *@parambuyNum购买数量 *@return购买数量 */ LongflashSellByRedisWatch(StringskuCode,intbuyNum); }
2. service实现类
importorg.springframework.dao.DataAccessException; importorg.springframework.data.redis.core.RedisOperations; importorg.springframework.data.redis.core.SessionCallback; importorg.springframework.data.redis.core.StringRedisTemplate; importorg.springframework.data.redis.core.ValueOperations; importorg.springframework.data.redis.core.script.DefaultRedisScript; importorg.springframework.data.redis.serializer.RedisSerializer; importorg.springframework.stereotype.Service; importjavax.annotation.Resource; importjava.util.Collections; importjava.util.List; @Service publicclassGoodsServiceImplimplementsGoodsService{ @Resource privateStringRedisTemplatestringRedisTemplate; @Override publicLongflashSellByLuaScript(StringskuCode,intnum){ //下面是lua脚本 StringluaScript="localbuyNum=ARGV[1]\n"+ "localgoodsKey=KEYS[1]\n"+ "localgoodsNum=redis.call('get',goodsKey)\n"+ "ifgoodsNum>=buyNum\n"+ "thenredis.call('decrby',goodsKey,buyNum)\n"+ "returnbuyNum\n"+ "else\n"+ "return'0'\n"+ "end\n"+ "\n"; DefaultRedisScript<String>re=newDefaultRedisScript<String>(); //设置脚本 re.setScriptText(luaScript); //定义返回值类型,注意,如果没有这个定义,Spring不会返回结果 re.setResultType(String.class); RedisSerializer<String>stringRedisSerializer=stringRedisTemplate.getStringSerializer(); //执行LUA脚本 Stringresult=(String)stringRedisTemplate.execute(re,stringRedisSerializer,stringRedisSerializer,null); returnLong.valueOf(result); } @Override publicLongflashSellByRedisWatch(StringskuCode,intnum){ SessionCallback<Long>sessionCallback=newSessionCallback<Long>(){ @Override publicLongexecute(RedisOperationsoperations)throwsDataAccessException{ intresult=num; //redis乐观锁 //我们观察商品编码是否发生改变 operations.watch(skuCode); ValueOperations<String,String>valueOperations=operations.opsForValue(); StringgoodsNumStr=valueOperations.get(skuCode); IntegergoodsNum=Integer.valueOf(goodsNumStr); //标记一个事务块的开始。 //事务块内的多条命令会按照先后顺序被放进一个队列当中, //最后由EXEC命令原子性(atomic)地执行。 operations.multi(); if(goodsNum>=num){ valueOperations.increment(skuCode,0-num); }else{ result=0; } //多条命令执行的结果集合 Listexec=operations.exec(); if(exec.size()>0){ System.out.println(exec); } return(long)result; } }; returnstringRedisTemplate.execute(sessionCallback); } //省略其他的方法 }
3. controller
但是首先要向你的redis里面仍一个数据,key='xiaomi',value='100'
@ApiOperation(value="用事务秒杀测试接口",notes="用事务秒杀测试接口") @RequestMapping(value="/miaoTransaction",method=RequestMethod.GET) @ResponseBody publicLongmiaoTransaction(){ Longres=goodsService.flashSellByRedisWatch("xiaomi",1); returnres; } @ApiOperation(value="秒杀Lua测试接口",notes="秒杀Lua测试接口") @RequestMapping(value="/miaoLua",method=RequestMethod.GET) @ResponseBody publicLongmiaoLua(){ Longres=goodsService.flashSellByRedisWatch("xiaomi",1); System.out.println(res.toString()); returnres; }
然后就可以用jemeter并发访问了。
感谢各位的阅读!关于“springboot集成redis实现简单秒杀系统的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
推荐阅读
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
springboot实现基于aop的切面日志
本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志...
-
SpringBoot定时任务功能怎么实现
-
SpringBoot中的@Import注解怎么使用
-
SpringBoot整合Lombok及常见问题怎么解决
-
springboot图片验证码功能模块怎么实现
-
Springboot+SpringSecurity怎么实现图片验证码登录
-
SpringBoot注解的知识点有哪些
SpringBoot注解的知识点有哪些这篇“SpringBoot注...
-
SpringBoot2.x中management.security.enabled=false无效怎么解决
-
springboot怎么禁用某项健康检查
springboot怎么禁用某项健康检查今天小编给大家分享一下sp...