• Redis分布式事务锁之核心代码


    分享一下最近学习Redis分布式事务锁的核心代码,主要解决高并发情况下分布式事务的同步问题。


    @RestController
    public class IndexController {

    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    @Autowired
    private Redisson redisson;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("/deduct_stock")
    public String deductStock() throws InterruptedException {
    String lockKey = "product_001";
    //String clientId = UUID.randomUUID().toString();
    RLock redissonLock = redisson.getLock(lockKey);
    try {
    //Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "zhuge"); //jedis.setnx(key,value)
    //stringRedisTemplate.expire(lockKey,30, TimeUnit.SECONDS);
    /*Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

    if (!result) {
    return "1001";
    }*/

    // 加锁,实现锁续命功能
    redissonLock.lock();
    int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock")); // jedis.get("stock")
    if (stock > 0) {
    int realStock = stock - 1;
    stringRedisTemplate.opsForValue().set("stock", realStock + ""); // jedis.set(key,value)
    System.out.println("扣减成功,剩余库存:" + realStock + "");
    } else {
    System.out.println("扣减失败,库存不足");
    }
    }finally {
    redissonLock.unlock();
    /*if (clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){
    stringRedisTemplate.delete(lockKey);
    }*/
    }
    return "end";
    }


    @RequestMapping("/redlock")
    public String redlock() throws InterruptedException {
    String lockKey = "product_001";
    //这里需要自己实例化不同redis实例的redisson客户端连接,这里只是伪代码用一个redisson客户端简化了
    RLock lock1 = redisson.getLock(lockKey);
    RLock lock2 = redisson.getLock(lockKey);
    RLock lock3 = redisson.getLock(lockKey);

    /**
    * 根据多个 RLock 对象构建 RedissonRedLock (最核心的差别就在这里)
    */
    RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
    try {
    /**
    * 4.尝试获取锁
    * waitTimeout 尝试获取锁的最大等待时间,超过这个值,则认为获取锁失败
    * leaseTime 锁的持有时间,超过这个时间锁会自动失效(值应设置为大于业务处理的时间,确保在锁有效期内业务能处理完)
    */
    boolean res = redLock.tryLock(10, 30, TimeUnit.SECONDS);
    if (res) {
    //成功获得锁,在这里处理业务
    }
    } catch (Exception e) {
    throw new RuntimeException("lock fail");
    } finally {
    //无论如何, 最后都要解锁
    redLock.unlock();
    }

    return "end";
    }

    }

  • 相关阅读:
    xcode debug
    ios 使用Quartz 2D画虚线
    ios UIGestureRecognizer
    ios 实现带矩形框的屏幕截图
    ios UISegemetedControl
    centos最小安装之后无法使用ifconfig
    无线LoRa智能远传水表
    智能水表188协议汇总
    无线LoRa远传智能水表
    静电除尘器除尘原理
  • 原文地址:https://www.cnblogs.com/scote/p/13997982.html
Copyright © 2020-2023  润新知