Springboot 应用关闭清理 Redis 的 key

7 天前
 nitouge

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

3164 次点击
所在节点    程序员
37 条回复
z1829909
7 天前
加锁的时候, 把锁的 value 设置为当前时间.
校验锁之前, 先 get 一下 value, 如果在应用启动时间之前, 作为脏数据覆盖掉
然后就是和之前一样的逻辑, 拿锁, 操作, 释放
这样虽然多了一步操作, 但是心智负担比较低.

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

强烈建议任何应用做好 Lifecycle 维护。
yangyaofei
7 天前
@nitouge #12 随便吧, 或者怎么用的怎么清就好了, 这还非要用什么方式去实现么
cdlnls
7 天前
我想为啥不在启动的时候清空 redis 呢
iseki
7 天前
如果要增加超时机制,就必须考虑如果程序因为种种原因暂停(垃圾回收、VM 迁移)导致锁超时,恢复运行后,“以为”自己还持有锁会导致何种问题。考虑的最后往往是别用这个破锁了。
kivmi
6 天前
生成好的和没有生成完的 key 都可以清理掉?
kivmi
6 天前
你这个 redis 是用来做分布式锁么?还是进程级别的锁?生成文件用分布式锁,貌似吞吐很小啊
dddd1919
6 天前
如果要关闭服务清空,不如直接内存缓存,redis 多此一举
nitouge
6 天前
@BBCCBB 我是接手的项目,没有启用优雅关闭,但是他这个项目有几个接口时间挺长的,但是他们不想做下载中心,业务也不提,就是觉得下载当前出来就行
nitouge
6 天前
@Misakas 的确 kill -15 或者-2 可以检测到, -9 或者崩溃是不行的,关闭的资源不会清理
nitouge
6 天前
@Shinu 没有启用优雅关闭,但是他这个项目有几个接口时间挺长的,但是他们不想做下载中心,业务也不提,就是觉得下载当前出来就行,感觉还是启动的时候做比较好
nitouge
6 天前
@yangyaofei 倒不是非要什么方式,我只是随便说一个在启动时清理,感觉好实现还好点
nitouge
6 天前
@kivmi 对的,分布式锁,耗时比较长,我刚接手,我想做下载中心,他这个下载的接口比较多,有的耗时比较长
nitouge
6 天前
@z1829909 的确太依赖删除步骤的可靠性
baoshijiagong
6 天前
启动时候清空 redis 通配符。通配符为包空间,也就是说,所有当前程序用的 key 前都带上包名,以此清空当前程序的所有 redis ,不影响别的程序。
kivmi
6 天前
加锁的目的是什么?
zvvvvv
3 天前
看着描述像是单体应用,为啥不直接放内存里

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1053844

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX