跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • [Spring data redis] RedisCacheWriter.lockingRedisCacheWriter#putIfAbsent 不是原子性操作
未分類
29 12 月 2020

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

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

資深大佬 : BBCCBB 11

代码参见: doUnlock()

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

  1. expire 失败, 不就不会自动过期了?
  2. doUnlcok 失败, 其他的程序如果调用需要加锁的地方不就都卡住了?
大佬有話說 (7)

  • 主 資深大佬 : BBCCBB

  • 資深大佬 : pigmen

    expire 和 set 一起用不就行了,分开的话用 multi exec

    doUnlock 应该是单个 key 的?

  • 資深大佬 : Vedar

    看代码确实有这个问题,而且看 execute 还弄了个 interruptexception 的机制 看起来确实是没拿到锁就会一直等到被打断为止

  • 主 資深大佬 : BBCCBB

    @pigmen 关键是没找到用 watch multi 的代码..

  • 主 資深大佬 : BBCCBB

    @Vedar 说是针对这个死锁的问题升级了, 但看不出来有啥升级, 擦.. 难受.

  • 資深大佬 : Vedar

    @BBCCBB 看了一下这段代码的提交记录 最早是 setnx 和 expire 分开的 现在变成 set 增加了 expire 参数。。确实是更加”atomic”了 (笑哭

  • 主 資深大佬 : BBCCBB

    @Vedar put 方法里的确是 set 里加的 expire

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

    这代码变更太扯了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具