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

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

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