• lock4j--分布式锁中间件--使用实例


    原文网址:lock4j–分布式锁中间件–使用/实例_的博客-CSDN博客

    简介

    说明

    本文用示例介绍分布式锁中间件lock4j 的用法。

    相关网址

    gitee:https://gitee.com/baomidou/lock4j

    github:https://github.com/baomidou/lock4j(Star数:68)

    lock4j的参考项目:https://gitee.com/kekingcn/spring-boot-klock-starter

    友情提示

    本人实际使用lock4j过程中遇到了很多问题,不推荐使用lock4j,推荐直接使用redisson的分布式锁。

    遇到的问题有:

    1. 获取锁超时时并没有抛异常,而是一直等待获取到锁

    概述

    1. lock4j与@Transactional类似:将注解写在方法上,自动控制上锁与释放锁。
    2. lock4j支持Redis(RedisTemplate或Redisson)、Zookeeper作为底层
      1. 2.0之后支持Redisson和Zookeeper
      2. 建议基于Redisson
        1. 原因:可以利用redisson的特性:自动续期等
        2. 方法:引入依赖:lock4j-redisson-spring-boot-starter
    3. 支持SPEL
    4. 执行顺序
      1. 如果在service上有@Transactional和@lock4j,则执行顺序如下
        1. 上锁
        2. 开启事务
        3. 执行逻辑
        4. 提交/回滚事务
        5. 释放锁
    5. 实现原理
      1. AOP:Advisor + methodInterception

    实例

    本文以Redisson为底层使用lock4j。

    依赖

    
    	com.baomidou
    	lock4j-redisson-spring-boot-starter
    	2.2.2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    整个pom.xml

    
    
        4.0.0
        
            org.springframework.boot
            spring-boot-starter-parent
            2.4.13
             
        
        com.knife.demo
        demo_lock4j_SpringBoot
        0.0.1-SNAPSHOT
        demo_lock4j_SpringBoot
        demo_lock4j_SpringBoot
        
            1.8
        
        
            
                org.springframework.boot
                spring-boot-starter-web
            
    
            
            
                com.baomidou
                lock4j-redisson-spring-boot-starter
                2.2.2
            
    
            
                org.projectlombok
                lombok
                true
            
    
            
                com.github.xiaoymin
                knife4j-spring-boot-starter
                3.0.3
            
    
        
    
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                    
                        
                            
                                org.projectlombok
                                lombok
                            
                        
                    
                
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    配置

    application.yml

    spring:
      redis:
        host: 192.168.5.193
        port: 6379
        password: 222333
    
    #lock4j:
    #  acquire-timeout: 3000 #默认值3s,可不设置
    #  expire: 30000 #默认值30s,可不设置
    #  primary-executor: com.baomidou.lock.executor.RedissonLockExecutor #默认redisson > redisTemplate > zookeeper,可不设置
    #  lock-key-prefix: lock4j #锁key前缀, 默认值lock4j,可不设置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码

    Controller

    本处直接将@Lock4j写到Controller方法上,实际开发中应该写到Service的实现类的方法上。

    package com.knife.demo.controller;
    
    import com.baomidou.lock.annotation.Lock4j;
    import com.knife.demo.entity.User;
    import io.swagger.annotations.Api;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @Api(tags = "用户")
    @RestController
    @RequestMapping("user")
    public class UserController {
        @GetMapping("listAll")
        @Lock4j
        public List listAllUser() {
            return null;
        }
    
        @GetMapping("find")
        @Lock4j(keys = {"#user.id", "#user.name"}, expire = 60000, acquireTimeout = 1000)
        public List find(User user) {
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    Entity

    package com.knife.demo.entity;
    
    import lombok.Data;
    
    @Data
    public class User {
        private Long id;
    
        private String name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试

    访问测试页面:http://localhost:8080/doc.html

    测试1:无参数、无选项

    运行前的Redis:(没有数据)

    打断点

    访问接口

    进入断点

    查看Redis信息(写入了数据)

    放开断点,方法执行结束(Redis数据被删除)

    测试2:有参数、有选项

    运行前的Redis:(没有数据)

    打断点

    访问接口(id赋值为:123,name赋值为:Tony)

    进入断点

    查看Redis信息(写入了数据)

    放开断点,方法执行结束(Redis数据被删除)

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    HarmonyOS分布式文件系统开发指导
    ClickHouse数据引擎
    多 bit 数据流传输&FIFO-跨时钟域处理(2)
    2023湖南工业大学计算机考研信息汇总
    计算机网络 | 10.[TCP篇] TCP连接的断开(四次挥手)
    二叉树结点查找
    使用java解析hashMap
    开年拿下3个offer,字节跳动大佬的算法刷题笔记真香
    虚拟数字人/直播/捏脸/3D/metahuman 实时人脸动作捕捉 开发笔记
    mac上输入 insert和replace的快捷键切换
  • 原文地址:https://blog.csdn.net/m0_67402013/article/details/126061596