Springboot 应用关闭清理 Redis 的 key

186 天前
 nitouge

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

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

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

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

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

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

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

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

© 2021 V2EX