项目背景:点击按钮,与py进行数据联通,多次点击会频繁发送请求。并且会覆盖原请求内容。
设置分布式锁,通过控制一个请求的id与更改任务状态,达成业务需求。
用id作为锁,拿到锁之后判断一下状态是否可以进行业务操作。
如果没有锁:如果之后业务是发送到redis的,就会频繁的push信息。如果是开放平台,就会频繁调用。都不合理。
//redis分布式锁保证当前
RLock lock = redissonClient.getLock(GATHER_REDIS_LOCK + id);
lock.lock(30, TimeUnit.SECONDS);
try {
//加锁阻塞在当前线程,当一个线程进行任务更新操作,其他线程进入该逻辑则再次判断是否是采集中
taxPo= taxMapper.selectByPrimaryKey(Id);
if (任务状态改变) {
throw new BizException(MsgEnum.NOT_EXIST);
}
doService.actualdo(context);
} finally {
lock.unlock();
对比sk
String lockKey = "promo_stock_lock:" + psId + "-" + productId;
// 1. 获取锁
RLock stockLock = client.getLock(lockKey);
//2. 使用锁,加锁, 如果加锁失败,会阻塞等待
stockLock.lock();
try{
effectieRow = itemMapper.decreaseStock(productId, psId);
} finally {
// 释放锁
stockLock.unlock();
}

7691

被折叠的 条评论
为什么被折叠?



