[Spring data redis] RedisCacheWriter.lockingRedisCacheWriter#putIfAbsent 不是原子性操作

2020-12-09 10:13:57 +08:00
 BBCCBB

代码参见: doUnlock()

有清楚这一块逻辑的老哥吗? 我看了很多引用的地方和这一块的代码, 怎么看都是这几步操作不是原子性的, 随便一个操作出问题不就挂了.. 比如

  1. expire 失败, 不就不会自动过期了?
  2. doUnlcok 失败, 其他的程序如果调用需要加锁的地方不就都卡住了?
1400 次点击
所在节点    程序员
7 条回复
BBCCBB
2020-12-09 10:45:54 +08:00
😱
pigmen
2020-12-09 10:58:10 +08:00
expire 和 set 一起用不就行了,分开的话用 multi exec

doUnlock 应该是单个 key 的?
Vedar
2020-12-09 11:10:42 +08:00
看代码确实有这个问题,而且看 execute 还弄了个 interruptexception 的机制 看起来确实是没拿到锁就会一直等到被打断为止
BBCCBB
2020-12-09 12:30:33 +08:00
@pigmen 关键是没找到用 watch multi 的代码..
BBCCBB
2020-12-09 12:31:36 +08:00
@Vedar 说是针对这个死锁的问题升级了, 但看不出来有啥升级, 擦.. 难受.
Vedar
2020-12-09 13:52:40 +08:00
@BBCCBB 看了一下这段代码的提交记录 最早是 setnx 和 expire 分开的 现在变成 set 增加了 expire 参数。。确实是更加"atomic"了 (笑哭
BBCCBB
2020-12-09 14:08:49 +08:00
@Vedar put 方法里的确是 set 里加的 expire

但 putIfAbsent 这个方法里依然是 lock -> setnx -> expire -> unlock 这个流程,

这代码变更太扯了 😅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/733622

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX