Springboot 应用关闭清理 Redis 的 key - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
nitouge
V2EX    程序员

Springboot 应用关闭清理 Redis 的 key

  •  
  •   nitouge 2024-07-01 10:12:56 +08:00 4077 次点击
    这是一个创建于 465 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前是 toB 项目,有些文件生产耗时比较久,生成的时候设置了锁,使用了 Redis,如果在生成阶段,应用停止,这些 key 会导致没有删除。目前有两种想法,1.需要应用关闭清理的 key ,在设置的使用同时也设置到一个统一的 Redis Set 中,在最后应用关闭的时候使用实现 DisposableBean 的 destroy 删除这些 key;2.可能就是把所有的前缀放到集合,通过 SCAN 方法,获取到也是 DisposableBean 的 destroy ;清理都是通过钩子函数去做 @PreDestroy 或者使用 ApplicationListener这些都可以。大家一般怎么做的。

    第 1 条附言    2024-07-01 10:45:56 +08:00
    统一回复下,时间是设置了的,可能有这种情况,有的 key 的时间较长,应用重新上新,关闭的时候 key 没有删除,重启后,再次访问可能 key 存在,导致无法操作
    37 条回复    2024-07-05 18:51:55 +08:00
    KongLiu
        1
    KongLiu  
       2024-07-01 10:17:03 +08:00
    我们 redis 都是要设置过期时间的,让他自然过期
    kingbill
        2
    kingbill  
       2024-07-01 10:17:16 +08:00
    Lifecycle 接口?
    635925926
        3
    635925926  
       2024-07-01 10:18:04 +08:00
    设置过期时间
    lsk569937453
        4
    lsk569937453  
       2024-07-01 10:19:17 +08:00
    设置锁的时候加一个过期时间啊。看你的描述是用的 java ,我记得有封装好的方法在 getlock 的时候默认加超时时间,还有看门狗机制。
    BBCCBB
        5
    BBCCBB  
       2024-07-01 10:19:23 +08:00
    看 redisson lock
    Goooooos
        6
    Goooooos  
       2024-07-01 10:19:42 +08:00
    心跳机制,key 设置 N 秒过期。
    应用[1,N)秒定时刷新 key 的有效期。
    BBCCBB
        7
    BBCCBB  
       2024-07-01 10:19:43 +08:00
    只设置过期时间也不行, 还要续约.
    billbur
        8
    billbur  
       2024-07-01 10:21:25 +08:00
    设置过期时间,java 的话有很多,有个叫 redisson 的可以直接用,不用自己实现锁
    Plutooo
        9
    Plutooo  
       2024-07-01 10:23:42 +08:00
    直接引入 redisson 好了,设置好过期时间
    billbur
        10
    billbur  
       2024-07-01 10:23:44 +08:00
    @billbur 还有就是 redisson 的锁是有看门狗机制的,可以不用开发者自己设置锁的超时时间,需要你自己评估
    yangyaofei
        11
    yangyaofei  
       2024-07-01 11:41:28 +08:00   1
    为啥非要关闭的时候清空呢, 在启动的时候清空不也一样么, 还好实现
    nitouge
        12
    nitouge  
    OP
       2024-07-01 13:47:21 +08:00
    @yangyaofei 通过 ContextRefreshedEvent 时间去清理吗
    nitouge
        13
    nitouge  
    OP
       2024-07-01 14:11:25 +08:00
    @billbur 项目没引入 redisson ,新的项目中引入了,是不是可以时间不设置或者设置不那么长,通过续期解决,即使应用关闭了,到了过期时间也就删除了
    nitouge
        14
    nitouge  
    OP
       2024-07-01 14:12:02 +08:00
    @Plutooo 是不是不能设置太长时间,靠 Redisson 续期来做
    billbur
        15
    billbur  
       2024-07-01 15:08:44 +08:00
    @nitouge #13 具体可以去看 lock 的用法,不需要你自己续期,时间到了自然失效了
    BBCCBB
        16
    BBCCBB  
       2024-07-01 15:35:27 +08:00
    ... 你们应用重启的时候做了优雅关闭吗? 你不得等正在跑的流程跑完了才重启??? 跑完了锁就会正常释放了呀.
    Misakas
        17
    Misakas  
       2024-07-01 15:38:29 +08:00
    从程序的角度来说一下,可以在代码侧监听 signal 信号,一般使用 kill 命令、systemd 停止的时候会收到。当程序被要求停止时去把需要清理的给删一下。当然只在应用正常关闭时有用,崩溃是不行的
    Shinu
        18
    Shinu  
       2024-07-01 15:52:55 +08:00
    "如果在生成阶段,应用停止,这些 key 会导致没有删除"

    没有做优雅关闭吗?
    如果不考虑优雅关闭, 也不需要考虑生成到一半的文件, 那就在启动的时候清理 key 呗
    Habyss
        19
    Habyss  
       2024-07-01 17:15:37 +08:00
    toB 的话, 如果不是多服务使用这个 key, 就是如果是单体应用的话, 可以写在内存里 比如 Guava Cache

    还有如果关闭应用比较不好处理的话, 可以换个思路, 比如启动应用的时候清理? 这样是不是容易一些
    pota
        20
    pota  
       2024-07-01 17:22:35 +08:00
    服务启动时初始化一个时间相关的 key 做为全局的 prefix ?
    adgfr32
        21
    adgfr32  
       2024-07-01 18:00:30 +08:00
    加锁的时候, 把锁的 value 设置为当前时间.
    校验锁之前, 先 get 一下 value, 如果在应用启动时间之前, 作为脏数据覆盖掉
    然后就是和之前一样的逻辑, 拿锁, 操作, 释放
    这样虽然多了一步操作, 但是心智负担比较低.

    然后看有人提每次应用启动, 设置锁的 prefix 不一样, 感觉是一个更好的方法
    我感觉你如果扫描删除 key, 太依赖删除步骤的可靠性了, 总有特殊情况导致删除没成功, 或者没触发
    WispZhan
        22
    WispZhan  
       2024-07-01 21:12:18 +08:00
    Graceful Shutdown 是合理诉求。
    Spring 的话看 SmartLifecycle

    强烈建议任何应用做好 Lifecycle 维护。
    yangyaofei
        23
    yangyaofei  
       2024-07-01 23:00:48 +08:00
    @nitouge #12 随便吧, 或者怎么用的怎么清就好了, 这还非要用什么方式去实现么
    cctv6
        24
    cctv6  
       2024-07-01 23:10:16 +08:00 via Android   2
    我想为啥不在启动的时候清空 redis 呢
    iseki
        25
    iseki  
       2024-07-01 23:20:04 +08:00
    如果要增加超时机制,就必须考虑如果程序因为种种原因暂停(垃圾回收、VM 迁移)导致锁超时,恢复运行后,“以为”自己还持有锁会导致何种问题。考虑的最后往往是别用这个破锁了。
    kivmi
        26
    kivmi  
       2024-07-02 08:41:00 +08:00
    生成好的和没有生成完的 key 都可以清理掉?
    kivmi
        27
    kivmi  
       2024-07-02 08:49:12 +08:00
    你这个 redis 是用来做分布式锁么?还是进程级别的锁?生成文件用分布式锁,貌似吞吐很小啊
    dddd1919
        28
    dddd1919  
       2024-07-02 08:55:48 +08:00   2
    如果要关闭服务清空,不如直接内存缓存,redis 多此一举
    nitouge
    &nbs;   29
    nitouge  
    OP
       2024-07-02 09:47:43 +08:00
    @BBCCBB 我是接手的项目,没有启用优雅关闭,但是他这个项目有几个接口时间挺长的,但是他们不想做下载中心,业务也不提,就是觉得下载当前出来就行
    nitouge
        30
    nitouge  
    OP
       2024-07-02 09:48:48 +08:00
    @Misakas 的确 kill -15 或者-2 可以检测到, -9 或者崩溃是不行的,关闭的资源不会清理
    nitouge
        31
    nitouge  
    OP
       2024-07-02 09:51:39 +08:00
    @Shinu 没有启用优雅关闭,但是他这个项目有几个接口时间挺长的,但是他们不想做下载中心,业务也不提,就是觉得下载当前出来就行,感觉还是启动的时候做比较好
    nitouge
        32
    nitouge  
    OP
       2024-07-02 09:53:35 +08:00
    @yangyaofei 倒不是非要什么方式,我只是随便说一个在启动时清理,感觉好实现还好点
    nitouge
        33
    nitouge  
    OP
       2024-07-02 09:55:17 +08:00
    @kivmi 对的,分布式锁,耗时比较长,我刚接手,我想做下载中心,他这个下载的接口比较多,有的耗时比较长
    nitouge
        34
    nitouge  
    OP
       2024-07-02 09:56:54 +08:00
    @z1829909 的确太依赖删除步骤的可靠性
    baoshijiagong
        35
    baoshijiagong  
       2024-07-02 11:21:16 +08:00
    启动时候清空 redis 通配符。通配符为包空间,也就是说,所有当前程序用的 key 前都带上包名,以此清空当前程序的所有 redis ,不影响别的程序。
    kivmi
        36
    kivmi  
       2024-07-02 12:16:32 +08:00
    加锁的目的是什么?
    zvvvvv
        37
    zvvvvv  
       2024-07-05 18:51:55 +08:00 via iPhone
    看着描述像是单体应用,为啥不直接放内存里
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1139 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 124ms UTC 23:25 PVG 07:25 LAX 16:25 JFK 19:25
    Do have faith in what you're doing.
    ubao 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