Springboot 应用关闭清理 Redis 的 key

4 天前
 nitouge

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

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

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

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

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

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

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

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

© 2021 V2EX