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里面查看有么有值,来判断账单是否在生成。

  • 相关阅读:
    数据访问层之Repository
    IIS执行原理
    异常分析
    Logger
    JSTL
    Kubernetes
    NET Core WordPress
    net平台的rabbitmq
    MySQL can’t specify target table for update in FROM clause
    EqualsBuilder和HashCodeBuilder
  • 原文地址:https://www.cnblogs.com/zhongmeilin/p/15522601.html
Copyright © 2011-2022 走看看