无名小程序员 2022-06-30 12:09 采纳率: 100%
浏览 101
已结题

redisson框架会出现重复提交

切面中使用,Redisson框架的tryLock方法做分布式锁,来做防止重复提交,但是锁还未释放tryLock的返回值中就会出现多个true的返回结果,但是采用 lock() 方法就不会出现这样的问题?这是怎么回事?
架包版本
<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-data-23</artifactId>
            <version>3.15.4</version>
</dependency>

代码

@Slf4j
@Order(2)
@Aspect
@Component
public class UserDeDupAspect {
    @Autowired
    private RedissonClient redissonClient;

    @Pointcut("@annotation(com.ruoyi.hall.annotation.UserDeDup)")
    public void tenantUserDeDupAspect() {
    }

    @Before("tenantUserDeDupAspect()")
    private Object runControllerMethod(JoinPoint joinPoint) {
        Object rtnObject = null;
        try {

            MemberInfo memberInfo = UserAspect.MEMBER_INFO.get();
            long userId;
            if (memberInfo != null) {
                userId = memberInfo.getMemberId();
            } else {
                userId = SecurityUtils.getLoginMember().getMemberId();
            }
            String KEY = "dedup:a=" + userId;
            RLock rLock = redissonClient.getLock(KEY);
            //当并发请求到达时,b结果中会返回多个true的值
            boolean b = rLock.tryLock(100, 550000, TimeUnit.MILLISECONDS);
            FileOutputStream f=new FileOutputStream("D:\\mao\\dfd.txt",true);
            f.write(String.valueOf(b).getBytes());
            f.write("\r\n".getBytes());
            f.flush();
            if (!b) {
                throw new ServiceException("");
            }
        } catch (ServiceException e) {
            throw new ServiceException("请勿重复提交", 700);
        } catch (Throwable e) {
            log.error("Exception,exception:{}", e, e);
            throw new ServiceException("请勿重复提交", 700);
        }
        return rtnObject;
    }
}

我想要达到的结果

有啥好的办法或者思路吗?

  • 写回答

1条回答 默认 最新

  • 皮蛋不吃粥 2022-06-30 13:46
    关注

    你这trylock设置了一个100毫秒的等待,如果不需要等待锁的释放,可以设置为0,一旦获取不到锁直接结束。
    而且感觉你这个文件io应该是在获取锁的情况下执行,你这样写不论是否获取都执行是否没什么意义

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月9日
  • 已采纳回答 7月1日
  • 创建了问题 6月30日

悬赏问题

  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题