• 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数据被删除)

  • 相关阅读:
    LVS -DR
    Mac/Linux安装使用 opengauss数据库步骤
    Cox回归列线图(nomogram)的多种绘制方法
    【毕业云】基于Java的高校学生会管理系统的设计和开发方案及技术栈
    Elasticsearch开启查询总条数信息
    Numpy 和 random中的随机函数用法汇总
    [项目管理-23]:中西方沟通方式的差别:含蓄VS直接
    C++对象模型探索--02对象
    【电商实战系列】先看这里:适合人群&课程大纲&开源地址&视频合集&一起学习
    STC51单片机学习笔记7——stc12c56 串口显示AD(单路ad+led指示灯)
  • 原文地址:https://blog.csdn.net/m0_67393619/article/details/126034735