当前位置:   article > 正文

java项目中使用redis_spring redistemplate.sentx

spring redistemplate.sentx

通过引入SpringRedisTemplate使用redis

1.单机模式下使用

如下代码段(在单机环境下多线程访问会有库存扣减不一致问题,比如线程一扣完库存,同时线程二争抢到资源,此时线程二获取到的库存仍是没有扣减的库存)

  1. @RestController
  2. public class IndexController{
  3. @Autowired
  4. private StringRedisTemplate stringRedisTempldate;
  5. public String deductStock(){
  6. int stock = Integer.parseInt(stringRedisTempldate.opsForValue().get("stock"));
  7. if(stock > 0){
  8. int realStock = stock - 1;
  9. StringRedisTemplate.opsForValue().set("stock",realStock+"");
  10. System.out.println("减扣成功,剩余库存:"+realStock );
  11. }else{
  12. System.out.println("减扣失败,余额不足");
  13. }
  14. return "end";
  15. }
  16. }

单机环境下解决办法:加入同步块或者锁,修改如下:

  1. @RestController
  2. public class IndexController{
  3. @Autowired
  4. private StringRedisTemplate stringRedisTempldate;
  5. public String deductStock(){
  6. synchronized(this){
  7. int stock = Integer.parseInt(stringRedisTempldate.opsForValue().get("stock"));
  8. if(stock > 0){
  9. int realStock = stock - 1;
  10. StringRedisTemplate.opsForValue().set("stock",realStock+"");
  11. System.out.println("减扣成功,剩余库存:"+realStock );
  12. }else{
  13. System.out.println("减扣失败,余额不足");
  14. }
  15. }
  16. return "end";
  17. }
  18. }

2.分布式环境下

分布式环境下上面的代码就会失效,仍然会出现库存扣减不一致的问题。假如我们通过nginx配置一个负载均衡,反响代理到自己模式的两台服务器上面,通过jmeter进行高并发请求压测,就会出现库存扣减不一致的问题,出现超卖的概率越大。synchronized可以控制解决单机的并发问题,不能跨jvm。

解决步骤思路如下:

1.使用用redis的setnx的命令(

        sentnx命令格式:setnx key value

           将key的值设为value,当且仅当key存在。

           若给定的key已经存在,则setnx不做任何操作。

         setnx是『set if not exists』(如果不存在,则set)的简写。

),可以简单的构建分布式锁。

  1. @RestController
  2. public class IndexController{
  3. @Autowired
  4. private StringRedisTemplate stringRedisTempldate;
  5. public String deductStock(){
  6. String lockKey = "kockKey";
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/571000
推荐阅读
相关标签
  

闽ICP备14008679号