V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NoKey
V2EX  ›  程序员

redis 锁在服务重启的时候怎么处理呢?

  •  
  •   NoKey · 2023-09-20 09:37:42 +08:00 · 1912 次点击
    这是一个创建于 424 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个锁不管是 redis 的,还是数据库实现的,反正就是远程的
    总会有个问题,就是,如果服务重启的时候,锁没释放,那么服务重启后,总要等到锁失效了,才能继续执行相关业务,大家对于这类问题是怎么处理的呢。
    我在考虑系统每次重启的时候,把所有这类锁全销毁一遍,不知道有没啥隐藏问题。😂
    16 条回复    2023-09-20 13:15:56 +08:00
    lalawu
        1
    lalawu  
       2023-09-20 09:38:59 +08:00
    想问一下这个锁是用在什么场景的,用来做什么的。
    cubecube
        2
    cubecube  
       2023-09-20 09:40:25 +08:00
    锁超时设置短点不就好了。你一个重启完成也得挺长时间的
    msaionyc
        3
    msaionyc  
       2023-09-20 09:47:32 +08:00
    假设 A 服务有 2 个实例,重启的时候,
    实例 1 在 9:45:00 重启完成,收到客户端请求,上了个锁
    实例 2 在 9:45:01 重启完成,然后销毁所有锁,这岂不是把正常业务的锁也清理了?之后收到客户端请求就又可以加这把锁了,岂不是乱套了。
    stinkytofu
        4
    stinkytofu  
       2023-09-20 09:47:51 +08:00
    "每次重启的时候,把所有这类锁全销毁一遍" 这不是一个最优解, 很不可靠, 假如机器死机 ,系统宕机, 进程被杀, 你根本就走不到正常的重启流程. 最好的就是像 2 楼说的, 把锁超时时间设置到尽量短, 满足业务需求即可
    yule111222
        5
    yule111222  
       2023-09-20 09:52:47 +08:00
    去看 Redission 的源码,锁有超时时间和自动续期机制,不能无限持有锁
    maocat
        6
    maocat  
       2023-09-20 09:58:25 +08:00
    突然想到一个问题

    Redis 是主从配置, 给 master 节点添加锁,结果同步到从节点的时候,master 下线了,这个时候程序是怎么的呢
    thofx
        7
    thofx  
       2023-09-20 10:06:08 +08:00
    Redlock 了解一下
    8355
        8
    8355  
       2023-09-20 10:17:41 +08:00
    redis 锁肯定要加 ttl 的
    不然万一你代码有 bug 不是直接锁死了。

    服务重启 首先优雅停机了解一下
    如果按照你这样做的话
    在多台服务场景发布整体的时间没那么快,本来是依赖流量切分+优雅停机就可以解决的问题,你是不是把问题搞复杂了。。。。
    lozzow
        9
    lozzow  
       2023-09-20 10:27:39 +08:00
    加锁然后开个任务自动刷新锁的 ttl
    NoKey
        10
    NoKey  
    OP
       2023-09-20 10:30:52 +08:00
    @msaionyc 阿西吧,你说对了,主要问题应该是这个,一下给忘了🤣
    endoffight
        11
    endoffight  
       2023-09-20 10:57:13 +08:00
    所以这里 redis 应该是多实例的
    IvanLi127
        12
    IvanLi127  
       2023-09-20 11:07:00 +08:00
    重启的时候,等自己上的锁自己释放完了再退出,可不能直接销毁。重启要等多久,最差情况就是就看你的锁多久超时了。
    victorc
        13
    victorc  
       2023-09-20 11:19:48 +08:00
    你这个想法是自然的,合乎逻辑的,就这样做吧
    cheng6563
        14
    cheng6563  
       2023-09-20 11:23:18 +08:00
    Redis 做锁要一顿操作才能可靠使用,你看下 Redisson 库是怎么做的。
    数据库实现用事务,服务停机断开连接就会自动回滚。
    Goooooos
        15
    Goooooos  
       2023-09-20 11:30:27 +08:00
    复杂点,锁 2s 超时,定时任务 1s 重置一次锁超时时间
    potatowish
        16
    potatowish  
       2023-09-20 13:15:56 +08:00 via iPhone
    看看 redisson watchdog 的机制
    https://instaer.me/article/Gvr01g
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:00 · PVG 13:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.