美文网首页
Redisson实现分布式锁Demo

Redisson实现分布式锁Demo

作者: 胡骄立 | 来源:发表于2021-08-13 14:59 被阅读0次

本文主要是Redisson的一个Demo,Redisson的使用非常简单,三行代码就可以实现。
首先引入依赖,并在springboot启动类中添加配置以及在配置文件中添加配置

Redisson依赖:

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.6.5</version>
        </dependency>

启动类:

    @Value("${config.redis.host}")
    private String host;
    @Value("${config.redis.port}")
    private String port;

    @Bean
    public Redisson redisson() {
        // 此为单机模式
        Config config = new Config();
        config.useSingleServer().setAddress("redis://"+host+":"+port).setDatabase(0);
        return (Redisson) Redisson.create(config);
    }

配置文件:

spring:
  redis:
    host: ${config.redis.host}
    port: ${config.redis.port}


config:
  redis:
    host: 192.168.1.112
    port: 6379

编写一个Controller,写一个接口供测试。
Redisson使用步骤就三步,拿锁+上锁+释放

    @Autowired
    private StringRedisTemplate template;

    @Autowired
    private Redisson redisson;

    @GetMapping("/prod_stock")
    public String stock(){
        String lock_key = "lock";
        RLock lock = redisson.getLock(lock_key);//第一步,获取锁
        try {
            lock.lock();//第二步,加锁
            int stock = Integer.parseInt(template.opsForValue().get("stock"));
            if (stock>0) {
                template.boundValueOps("stock").increment(-1);
                log.info("库存扣减成功,剩余库存:{}",stock - 1);
            }else {
                log.info("库存扣减失败,库存不足");
            }
        } finally {
            lock.unlock();//第三步,释放锁
        }
        return "hi";
    }

代码编写完成,进入测试

启动两个应用,:
server: port: 8090
server: port: 8080
启动Redis./bin/redis-server ./etc/redis.conf
并添加一个key,set stock 100
做下负载均衡,并启动Nginx./sbin/nginx

    upstream redislock{
        server 192.168.1.101:8080;
        server 192.168.1.101:8090;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://redislock;
        }
        location /favicon.ico{
            return 200;

用Jmeter进行测试即可看到结果

2021-08-13 14:51:27.276  INFO 1608 --- [io-8090-exec-37] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:13
2021-08-13 14:51:27.281  INFO 1608 --- [io-8090-exec-12] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:12
2021-08-13 14:51:27.285  INFO 1608 --- [io-8090-exec-38] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:11
2021-08-13 14:51:27.297  INFO 1608 --- [io-8090-exec-38] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:9
2021-08-13 14:51:27.308  INFO 1608 --- [io-8090-exec-12] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:7
2021-08-13 14:51:27.317  INFO 1608 --- [io-8090-exec-35] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:6
2021-08-13 14:51:27.336  INFO 1608 --- [io-8090-exec-39] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:2
2021-08-13 14:51:27.340  INFO 1608 --- [io-8090-exec-11] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:1
2021-08-13 14:51:27.346  INFO 1608 --- [io-8090-exec-35] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:0
2021-08-13 14:51:27.353  INFO 1608 --- [io-8090-exec-39] c.w.redis.controller.IndexController     : 库存扣减失败,库存不足
2021-08-13 14:51:27.267  INFO 7556 --- [io-8080-exec-31] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:15
2021-08-13 14:51:27.271  INFO 7556 --- [io-8080-exec-26] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:14
2021-08-13 14:51:27.292  INFO 7556 --- [io-8080-exec-31] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:10
2021-08-13 14:51:27.301  INFO 7556 --- [io-8080-exec-26] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:8
2021-08-13 14:51:27.323  INFO 7556 --- [io-8080-exec-35] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:5
2021-08-13 14:51:27.327  INFO 7556 --- [io-8080-exec-19] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:4
2021-08-13 14:51:27.331  INFO 7556 --- [io-8080-exec-26] c.w.redis.controller.IndexController     : 库存扣减成功,剩余库存:3
2021-08-13 14:51:27.349  INFO 7556 --- [nio-8080-exec-6] c.w.redis.controller.IndexController     : 库存扣减失败,库存不足

相关文章

网友评论

      本文标题:Redisson实现分布式锁Demo

      本文链接:https://www.haomeiwen.com/subject/ghgdbltx.html