问题背景:
在项目中存在两个需求。查询撤单列表,和 对列表中的订单进行撤单操作。出现的问题是,用户执行完撤单操作之后接着刷新列表,拿到了撤单之前的老数据,问题为偶发,但是偶发次数也较多。注:这一块是做了Redis缓存的。
问题初步定位:
1.初步分析有可能是缓存问题,查看日志显示缓存成功
查看Redis缓存数据,得知缓存中的数据的确为老历史数据。
2.由上可分析,是否是用户缓存数据之前并未对缓存数据进行清理?通过查看日志得出结论,缓存已经在用户重新缓存之前进行了清理。初步排除缓存问题的可能。
重新进行逻辑梳理:
分析整个撤单流程,用户发起撤单请求,后端接收到请求之后,将部分数据发送到Kafka中用于撮合删除对应的撮合队列,以阻止当前订单成交,代码如下 :
@RedissonLock(lockIndex = 0, leaseTime = 1)
@RedisCleanCache(key = RedisCommonKeys.TRADE_CACHE + "#{#accountId}")
public void cancelOrder(String accountId, Long commissionId) {
//校验参数合法性
AccountCommission accountCommission = checkCancelOrder(accountId, commissionId);
log.info("开始执行撤单相关操作,accountId :{}, commissionId:{}", accountCommission.getAccountId(), accountCommission.getId());
...........
commissionPlaceService.placeCommission(accountCommission);
}
撮合删除对应的撮合队列之后会将数据重新发回Kafka,后台接收到撮合发回的Kafka消息之后,执行撤单逻辑,所有逻辑均处在同一个事务中。代码如下:
public void doCancel(WithdrawMessage message) {
AccountCommission commission =
accountCommissionService.getOne(new LambdaQueryWrapper<AccountCommission>()
.eq(AccountCommission::getId, message.getCommissionId())
.in(AccountCommission::getCommissionStatus,
Commi