大佬们,那种 XX 天后过期改状态的需求,精确到秒,你们是咋设计的?

2018-04-28 11:45:49 +08:00
 monsterj

想到几种, 1:定时器,一秒扫一次,感觉太频繁了吧; 2:mysql 定时任务+存储过程; 3:消息队列;

3608 次点击
所在节点    问与答
26 条回复
nybux
2018-04-28 12:28:51 +08:00
如果不涉及到查询,可以在显示的时候修改。
monsterj
2018-04-28 12:53:22 +08:00
@nybux 后台管理肯定要涉及到查询的
nybux
2018-04-28 12:59:06 +08:00
时间是等长的嘛?
kingname
2018-04-28 13:04:35 +08:00
前台用 JS 做减法,后台不用频繁查,下次完全刷新的时候再更新就可以了。
monsterj
2018-04-28 14:02:08 +08:00
@nybux 假如过期时间是 3 天
gfreezy
2018-04-28 14:04:04 +08:00
存在过期时间,然后状态根据过期时间算出来。
monsterj
2018-04-28 14:05:48 +08:00
@kingname 这样只是考虑了前台用户展示的情况,有其他业务需要这个状态操作的话,就行不通
kera0a
2018-04-28 14:07:27 +08:00
过期后
第一个访问它的事件,触发更新操作~
monsterj
2018-04-28 14:07:55 +08:00
@gfreezy 那就是第一种?每秒钟扫一次过期时间
Weny
2018-04-28 14:08:49 +08:00
延时队列 或者 定时任务 去处理
sfree2005
2018-04-28 14:10:57 +08:00
我的 web app 用的是 laravel 框架,用的是自带的 queue 和 schedule, 它可以将 queue 存于 Redis,每秒扫一下。因为是扫内存 所以速度快和资源占用少,感觉不错。
monsterj
2018-04-28 14:11:26 +08:00
@kera0a 这样会代码冗余吧,还容易忘几加更新操作
liuzelei
2018-04-28 14:12:10 +08:00
redis ttl、mq delay exchange
kera0a
2018-04-28 14:12:31 +08:00
@monsterj
存过期时间的方法最好吧~
“有其他业务需要这个状态操作的话,就行不通” ? 怎么会行不通呢? 是否过期服务器怎么用过期时间-当前时间呗,小于 0 就是过期了啊,不管什么地方都可用
monsterj
2018-04-28 14:12:38 +08:00
@sfree2005 每秒扫内存可以接受
monsterj
2018-04-28 14:17:13 +08:00
@kera0a 假如有一个过期时间,和一个状态,需要在过期后,修改状态,其他业务只需要查这个状态
chenuu
2018-04-28 14:25:23 +08:00
redis 过期功能,过期会有键空间通知.
af463419014
2018-04-28 14:28:30 +08:00
每 5 分钟扫一下
5 分钟以内会过期的数据,每条数据启一个线程
每个线程 sleep 对应数据的过期时间,然后修改状态为过期
kera0a
2018-04-28 14:30:28 +08:00
@monsterj 其他业务不能查过期时间么?
其实这个主动更新状态并不好,假如你有 N 个状态需要更新,而你的服务器运行速度慢,不能在 1 秒内更新完毕,那不就出 BUG 了。假如需求变更,需要兼容到毫秒,那就更加不好了。
你往存过期时间这靠,如果实在靠不了,可以试试我说的懒更新,如果还靠不了
各种定时任务框架了解一下~
kslr
2018-04-28 14:31:34 +08:00
延时队列

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

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

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

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

© 2021 V2EX