德华们,有什么办法能让 redis 某个 key 锁定(进行业务操作),在期间不让其他线程去读。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
MeloForsaken
V2EX    程序员

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

  •  
  •   MeloForsaken 2021-03-12 16:39:52 +08:00 3283 次点击
    这是一个创建于 1749 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    19 条回复    2021-03-15 16:46:02 +08:00
    kefirzhang
        1
    kefirzhang  
       2021-03-12 16:43:01 +08:00   5
    不行,redis 没有独占锁。你可以从业务逻辑上实现,删掉这个 key,然后在程序后再添加
    myCupOfTea
        2
    myCupOfTea  
       2021-03-12 17:08:50 +08:00
    话说你能保证原子性 为啥害怕被人读了
    myCupOfTea
        3
    myCupOfTea  
       2021-03-12 17:09:42 +08:00
    要不让整个 读->计算->写 操作变成原子操作吧
    用 lua 写脚本就可以了
    kefirzhang
        4
    kefirzhang  
       2021-03-12 17:33:56 +08:00
    这种其实最好还是在程序里面做一个排它锁,不是 redis 的事情就不要强加给 redis 了。
    opengps
        5
    opengps  
       2021-03-12 17:36:28 +08:00
    读应该是无所谓的,主要是删改的时候需要有锁来保证原子性
    liian2019
        6
    liian2019  
       2021-03-12 17:39:49 +08:00
    非集群可以用 pipeline 。集群用 lua 。读+操作+写三个步骤原子性执行就好了
        7
    iamlbk  
       2021-03-12 17:43:14 +08:00
    或者让读到的线程假装没读到呢? 比如先把值改成 tmp_随机数:原始值
    其他线程读到数据以后先判断是不是 tmp_ 开头的, 如果是的话 看看随机数确认是不是当前线程写进去的 如果不是当前线程写进去的 就认为没读到 按照 null 去执行后续逻辑
    iamlbk
    qianxiaoxiao
        8
    qianxiaoxiao  
       2021-03-12 17:44:41 +08:00
    @kefirzhang 如果删掉后没有添加前 程序挂了怎么办
    phony2r
        9
    phony2r  
       2021-03-12 17:47:40 +08:00
    彦祖, 我也不会
    Varobjs
        10
    Varobjs  
       2021-03-12 17:58:17 +08:00
    冠希啊,你换 MySQL 吧
    mengdodo
        11
    mengdodo  
       2021-03-12 18:21:54 +08:00
    我就搞不懂你为什么要覆盖
    vegetableChick
        12
    vegetableChick  
       2021-03-12 18:35:41 +08:00
    马德华么?小明
    linxiaojialin
        13
    linxiaojialin  
       2021-03-12 18:38:18 +08:00
    等一等,有件事我们必须先搞清楚,你叫的是姓 [刘] 的还是姓 [马] 的
    liujavamail
        14
    liujavamail  
       2021-03-12 18:41:38 +08:00
    redis 分布式锁能用么?
    securityCoding
        15
    securityCoding  
       2021-03-12 20:20:57 +08:00
    重命名呗
    young1lin
        16
    young1lin  
       2021-03-12 21:20:20 +08:00
    你这要求不就是 Lua 脚本解决的么?
    johnsona
        17
    johnsona  
       2021-03-13 04:30:53 +08:00
    骂谁马德华呢
    Takamine
        18
    Takamine  
       2021-03-13 18:12:12 +08:00 via Android
    我怎么觉得直接在业务上对这个 key 的操作包装的方法(块)是加锁的不就好了吗。
    Kili9
        19
    Kili9  
       2021-03-15 16:46:02 +08:00
    redis+lua
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4363 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 05:35 PVG 13:35 LAX 21:35 JFK 00:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86