Springboot 应用关闭清理 Redis 的 key

97 天前
 nitouge

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

3500 次点击
所在节点    程序员
37 条回复
KongLiu
97 天前
我们 redis 都是要设置过期时间的,让他自然过期
kingbill
97 天前
Lifecycle 接口?
635925926
97 天前
设置过期时间
lsk569937453
97 天前
设置锁的时候加一个过期时间啊。看你的描述是用的 java ,我记得有封装好的方法在 getlock 的时候默认加超时时间,还有看门狗机制。
BBCCBB
97 天前
看 redisson lock
Goooooos
97 天前
心跳机制,key 设置 N 秒过期。
应用[1,N)秒定时刷新 key 的有效期。
BBCCBB
97 天前
只设置过期时间也不行, 还要续约.
billbur
97 天前
设置过期时间,java 的话有很多,有个叫 redisson 的可以直接用,不用自己实现锁
Plutooo
97 天前
直接引入 redisson 好了,设置好过期时间
billbur
97 天前
@billbur 还有就是 redisson 的锁是有看门狗机制的,可以不用开发者自己设置锁的超时时间,需要你自己评估
yangyaofei
97 天前
为啥非要关闭的时候清空呢, 在启动的时候清空不也一样么, 还好实现
nitouge
97 天前
@yangyaofei 通过 ContextRefreshedEvent 时间去清理吗
nitouge
97 天前
@billbur 项目没引入 redisson ,新的项目中引入了,是不是可以时间不设置或者设置不那么长,通过续期解决,即使应用关闭了,到了过期时间也就删除了
nitouge
97 天前
@Plutooo 是不是不能设置太长时间,靠 Redisson 续期来做
billbur
97 天前
@nitouge #13 具体可以去看 lock 的用法,不需要你自己续期,时间到了自然失效了
BBCCBB
97 天前
... 你们应用重启的时候做了优雅关闭吗? 你不得等正在跑的流程跑完了才重启??? 跑完了锁就会正常释放了呀.
Misakas
97 天前
从程序的角度来说一下,可以在代码侧监听 signal 信号,一般使用 kill 命令、systemd 停止的时候会收到。当程序被要求停止时去把需要清理的给删一下。当然只在应用正常关闭时有用,崩溃是不行的
Shinu
97 天前
"如果在生成阶段,应用停止,这些 key 会导致没有删除"

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

还有如果关闭应用比较不好处理的话, 可以换个思路, 比如启动应用的时候清理? 这样是不是容易一些
pota
97 天前
服务启动时初始化一个时间相关的 key 做为全局的 prefix ?

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

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

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

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

© 2021 V2EX