zoukankan      html  css  js  c++  java
  • 分布式锁

    一: 使用redis:

        @PostMapping("/v1/getLock2")
        public  BaseResponse  getLock2(@RequestBody GxyTeacherInfoDto dto) throws  Exception{
            String key = "product_001";
            String lockvalue = UUID.randomUUID().toString();
            Boolean bool = stringRedisTemplate.opsForValue().setIfAbsent(key,lockvalue,10,TimeUnit.SECONDS);
            if(!bool) {
                System.out.println("err");
                return BaseResponse.error();
            }
            try {
                int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
                if (stock > 0) {
                    int realStock = stock - 1;
                    stringRedisTemplate.opsForValue().set("stock",realStock+"");
                    System.out.println("售卖成功,剩余" + realStock);
                    return BaseResponse.ok();
                } else {
                    System.out.println("err2");
                    return BaseResponse.error();
                }
            } finally {
                if(lockvalue.equals(stringRedisTemplate.opsForValue().get(key))) {
                    stringRedisTemplate.delete(key);
                }
            }
    
    
        }

    二: 使用Redisson:

    @Bean
    public Redisson redisson(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://IP:port");
        return (Redisson)Redisson.create(config);
    }

        @PostMapping("/v1/getLock3")
        public  BaseResponse  getLock3(@RequestBody GxyTeacherInfoDto dto) throws  Exception{
            String lockKey = "product_001";
            RLock redissonLock = redisson.getLock(lockKey);
            try {
                int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
                if (stock > 0) {
                    int realStock = stock - 1;
                    stringRedisTemplate.opsForValue().set("stock",realStock+"");
                    System.out.println("售卖成功,剩余" + realStock);
                    return BaseResponse.ok();
                } else {
                    System.out.println("err2");
                    return BaseResponse.error();
                }
            } finally {
                redissonLock.unlock();
            }
        }
    
    
  • 相关阅读:
    Python环境搭建-anaconda
    UITableView的基本使用方法
    模拟网易新闻上方滚动条
    iOS之导航栏基本设置
    UITextField 方法和代理的使用
    UITextField详解
    init方法的重写与自定义
    OC中协议的理解protocal
    IOS中检测键盘出现和消失的消息
    怎么重装系统(一)
  • 原文地址:https://www.cnblogs.com/z360519549/p/12499050.html
Copyright © 2011-2022 走看看