• 请不要在回答技术问题时复制粘贴 AI 生成的内容
MeloForsaken
V2EX  ›  程序员

德华们,有什么办法能让 redis 某个 key 锁定(进行业务操作),在期间不让其他线程去读。

  •  
  •   MeloForsaken · Mar 12, 2021 · 3895 views
    This topic created in 2071 days ago, the information mentioned may be changed or developed.

    业务操作:取某个 key 的值,对改值进行计算,再将新值覆盖掉旧值。

    可以用 watch,multi,exec 命令保证写操作的原子性,但是如何阻塞其他线程在该业务操作期中读取 key 的值。

    19 replies  •  2021-03-15 16:46:02 +08:00
    kefirzhang
    kefirzhang
    Mar 12, 2021❤️5
    1
    不行,redis 没有独占锁。你可以从业务逻辑上实现,删掉这个 key,然后在程序后再添加
    myCupOfTea
    myCupOfTea
    Mar 12, 2021
    2
    话说你能保证原子性 为啥害怕被人读了
    myCupOfTea
    myCupOfTea
    Mar 12, 2021
    3
    要不让整个 读->计算->写 操作变成原子操作吧
    用 lua 写脚本就可以了
    kefirzhang
    kefirzhang
    Mar 12, 2021
    4
    这种其实最好还是在程序里面做一个排它锁,不是 redis 的事情就不要强加给 redis 了。
    opengps
    opengps
    Mar 12, 2021
    5
    读应该是无所谓的,主要是删改的时候需要有锁来保证原子性
    liian2019
    liian2019
    Mar 12, 2021
    6
    非集群可以用 pipeline 。集群用 lua 。读+操作+写三个步骤原子性执行就好了
    iamlbk
    iamlbk
    Mar 12, 2021
    7
    或者让读到的线程假装没读到呢? 比如先把值改成 tmp_随机数:原始值
    其他线程读到数据以后先判断是不是 tmp_ 开头的, 如果是的话 看看随机数确认是不是当前线程写进去的 如果不是当前线程写进去的 就认为没读到 按照 null 去执行后续逻辑
    qianxiaoxiao
    qianxiaoxiao
    Mar 12, 2021
    8
    @kefirzhang 如果删掉后没有添加前 程序挂了怎么办
    phony2r
    phony2r
    Mar 12, 2021
    9
    彦祖, 我也不会
    Varobjs
    Varobjs
    Mar 12, 2021
    10
    冠希啊,你换 MySQL 吧
    mengdodo
    mengdodo
    Mar 12, 2021
    11
    我就搞不懂你为什么要覆盖
    vegetableChick
    vegetableChick
    Mar 12, 2021
    12
    马德华么?小明
    linxiaojialin
    linxiaojialin
    Mar 12, 2021
    13
    等一等,有件事我们必须先搞清楚,你叫的是姓 [刘] 的还是姓 [马] 的
    liujavamail
    liujavamail
    Mar 12, 2021
    14
    redis 分布式锁能用么?
    securityCoding
    securityCoding
    Mar 12, 2021
    15
    重命名呗
    young1lin
    young1lin
    Mar 12, 2021
    16
    你这要求不就是 Lua 脚本解决的么?
    johnsona
    johnsona
    Mar 13, 2021
    17
    骂谁马德华呢
    Takamine
    Takamine
    Mar 13, 2021 via Android
    18
    我怎么觉得直接在业务上对这个 key 的操作包装的方法(块)是加锁的不就好了吗。
    imwing
    imwing
    Mar 15, 2021
    19
    redis+lua
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2641 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 89ms · UTC 04:22 · PVG 12:22 · LAX 20:22 · JFK 23:22
    ♥ Do have faith in what you're doing.