V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gy123
V2EX  ›  Java

基于 Redisson 的分布式锁,声明式注解方式,

  •  
  •   gy123 · 2020-04-01 14:22:29 +08:00 · 2705 次点击
    这是一个创建于 1698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # Lock-Thanos
    基于 Redisson 的分布式锁,声明式注解方式,[git 地址,喜欢请留星星]( https://github.com/785175323/Lock-Thanos)

    ###一.功能:
    1. 支持可重入公平锁,可重入非公平锁,写锁,读锁
    2. 支持注解声明式设置参数
    3. 自定义错误处理

    ###二.引入项目:
    1 引入 pom 参数:
    ```
    <dependency>
    <groupId>com.kakuiwong</groupId>
    <artifactId>lock-thanos</artifactId>
    <version>${lastversion}</version>
    </dependency>
    ```

    2 编写 application 配置文件
    ```
    lock.thanos.address=redis://127.0.0.1:6379,redis://127.0.0.2:6379 #集群或单机
    lock.thanos.password=123456 #密码
    lock.thanos.database=2 #redis 数据库
    lock.thanos.order=0 #aop 顺序
    ```

    3 引入注解:
    ```
    @LockThanos(key = {"#id"}, #支持 spel 的锁 key
    type = LockTypeEnum.FAIRLOCK, #锁类别
    lockName = "default", #锁名称
    tryLockTime = 30, #尝试加锁过期时间
    autoUnlockTime = 30, #自动销毁锁时间
    timeUnit = TimeUnit.SECONDS, #时间单位
    exceptionHandler = LockExceptionHandlerDemo.class) #自定义异常处理方式
    @GetMapping("lock")
    public Object lock(String id){
    System.out.println(id);
    return id;
    }
    ```

    4 自定义异常处理:
    ```
    //实现 LockExceptionHandler 接口,默认为不做任何处理
    static class LockExceptionHandlerDemo implements LockExceptionHandler {

    @Override
    public Object lockFailHandle(ProceedingJoinPoint joinPoint, ThanosLockI lock, LockParam lockParam) throws Throwable {
    System.out.println("lockFailHandle");
    return joinPoint.proceed();
    }

    @Override
    public void unLockFailHandle(ProceedingJoinPoint joinPoint, ThanosLockI lock, LockParam lockParam) {
    System.out.println("unLockFailHandle");
    }
    }
    ```
    13 条回复    2020-04-01 18:39:00 +08:00
    gy123
        1
    gy123  
    OP
       2020-04-01 14:25:46 +08:00
    竟然不支持 markdown
    fzhyzamt
        2
    fzhyzamt  
       2020-04-01 14:42:31 +08:00
    支持 markdown 的,你可能姿势不对
    gy123
        3
    gy123  
    OP
       2020-04-01 15:00:22 +08:00
    @fzhyzamt 好吧,再研究下..
    GM
        4
    GM  
       2020-04-01 15:16:06 +08:00
    这个.........感觉没必要吧?
    gy123
        5
    gy123  
    OP
       2020-04-01 15:37:08 +08:00
    @GM 哈哈.挺好用的呢-.-
    ZSeptember
        6
    ZSeptember  
       2020-04-01 16:10:00 +08:00
    超时怎么处理
    gy123
        7
    gy123  
    OP
       2020-04-01 16:45:13 +08:00 via iPhone
    @ZSeptember 可以自己定制处理,比如重试次数,抛异常,返回错误信息等等?默认我没处理,如果加锁超时就直接执行业务了,释放锁超时也是默认什么也不做。
    gy123
        8
    gy123  
    OP
       2020-04-01 16:45:57 +08:00 via iPhone
    @ZSeptember 有好的建议我可以加入进去
    ZSeptember
        9
    ZSeptember  
       2020-04-01 17:02:52 +08:00   ❤️ 1
    分布式锁最基本的是有一个续约机制,但是因为各种原因导致续约失败,导致锁超时,就有可能出现并发的情况。

    所以,我是不建议使用分布式锁,一般都是用某种分区机制,转顺序化串行。
    gy123
        10
    gy123  
    OP
       2020-04-01 17:07:03 +08:00 via iPhone
    @ZSeptember 是这样的,无法完全避免并发,因为避免死锁等,只能适当设置超时时间。也是看业务需要吧,串行化处理业务,也有场景需要
    127000
        11
    127000  
       2020-04-01 18:35:45 +08:00
    @gy123 v2ex.com/new/java 文本标记语法改为 Markdown 才行
    gy123
        12
    gy123  
    OP
       2020-04-01 18:38:50 +08:00 via iPhone
    这些
    @127000
    gy123
        13
    gy123  
    OP
       2020-04-01 18:39:00 +08:00 via iPhone
    @127000 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:22 · PVG 21:22 · LAX 05:22 · JFK 08:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.