zoukankan      html  css  js  c++  java
  • 在账单生成中看到同事使用的redis锁

    场景:合同数据财务1和财务2都是可以看到的,但是一个合同只要生生一份账单就行,好巧不巧,在同一时刻,财务一和财务二同时对A按下了生产账单按钮。那么就产生了两份账单。

    同事为了解决这个问题使用了redis,我看了看他的代码,他使用aop 只对有特定注解的进行代理。在代理前 先看不能不能根据合同id获取到值,能获取就说明没有被占用锁,不能获取说明锁占用了,这个账单已经在生成了。在after 他直接删除锁。

    说到锁:我先想到的是 sync ,reentrantlock,redisLock. 

    reentratLock 相比sync 是可以去尝试获取锁。当获取不到锁可以做其他的操作。比如上面的场景因为账单只能生成一个,这个时候不能使用sync。因为当财务1的线程1生成账单后,线程2也会继续执行,然后也生成了一个账单,没有达到预期的效果。

    redislock 相比reentrantLock;reentrantLock只能在一个服务里面起作用。账单服务有两个,使用的负载均衡算法是平均算法。那么财务一和财务2的请求刚好请求在不同的服务里面,那么就生成了两个账单。 使用redisLock的话,两个服务也是去同一个redis里面查看有么有值,来判断账单是否在生成。

  • 相关阅读:
    A bon chat, bon rat
    获取信息mysql
    Lua笔记3 表达式
    libevent2编译
    opencv环境搭建
    bash console
    Unix Notes.
    ubuntu vsftpd
    axis2客户端代码生成
    IDEA 快捷键
  • 原文地址:https://www.cnblogs.com/zhongmeilin/p/15522601.html
Copyright © 2011-2022 走看看