关于reids分布式锁的问题

发如雪1024 2020-08-10 10:58:31

求大佬帮我看看为什么还是会出现超卖问题


代码如下:
 @GetMapping("stock")
public String stock() {
try{
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "locked");
if (lock) {
int stock = Integer.parseInt(redisTemplate.opsForValue().get("stock"));
if (stock > 0) {
stock--;
redisTemplate.opsForValue().set("stock", stock+"");
System.out.println("下单成功,库存剩余" + stock + "");

} else {
System.out.println("库存不足");
}
} else {
System.out.println("锁未释放!");
}
}finally {
redisTemplate.delete("lock");
}

return "end";
}
...全文
2556 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个帅逼 2020-08-20
  • 打赏
  • 举报
回复
你这代码都完全写错了
发如雪1024 2020-08-20
  • 打赏
  • 举报
回复
jmeter
dkwuxiang 2020-08-10
  • 打赏
  • 举报
回复
你怎么测试的?
游北亮 2020-08-10
  • 打赏
  • 举报
回复
最后,也是最重要的,finally里,释放锁之前,一定要判断一下,这个锁是不是我加的,不要把别人的锁给释放了。 可以用Redis的lua脚本, 也可以使用Redis内置的monitor事务来保证释放的原子性。
游北亮 2020-08-10
  • 打赏
  • 举报
回复
另外,如果你的程序在执行过程中,断电了,可能出现无法释放锁的情况, 从而导致东西再也卖不出去了。 建议在 setIfAbsent 里,添加锁的过期时间,如果程序崩溃,锁还有机会自动过期, 当然这又会带来另一个问题,就是在锁的有效时间内,事务没执行完,另一个线程又进来了。 这个过期时间要不要加, 如果要加,那么设置多长时间为宜,跟你的业务有关。
游北亮 2020-08-10
  • 打赏
  • 举报
回复
最大的问题,lock失败,你也去delete这个锁了

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧