Java 实现分钟提醒

2019-06-24 16:55:55 +08:00
 Archangell

请问各位大佬 如何实现一个功能 用户主动添加提醒事件分钟级别 举例一个场景 学生添加课程每周一都有这节课 课前 5 分钟进行提醒。当学生量大的时候 基本等于每分钟都可能存在提醒 请说下实现思路。 我的思路是保存学生录入的提醒频率 每周每天等 然后根据课程开始时间和提醒提前时间(提前 5 分钟 半小时或一小时)进行提醒 但这样感觉很印象效率 每分钟都得去判断是否需要提醒 还有个思路为 添加提醒后 就根据频率定制计时器 但这样一个提醒创建之后 就永久存在一个计时器任务且项目不停止计时器也不会从内存中移出也不会被 gc 回收 一直执行着 两个思路感觉都不是很友好 有大佬能提点一下吗 如何实现

2823 次点击
所在节点    问与答
17 条回复
zhady009
2019-06-24 17:19:47 +08:00
不知道你的课有没有是表示一天中是第几节课的字段

要一个课程通知表 记录基本的信息 还有一个字段是表示第几节课的.

然后定时任务 获取当前时间 根据时间来判断是第几节课 或者你自己映射一下都可以

定时 sql 就带上星期几第几课的条件 获得 list 然后获取 uid 给他们推

脑测
wolfie
2019-06-24 17:23:09 +08:00
写几个标点符号吧。

每几分钟查一次数据,然后在 Java 处理。
zhady009
2019-06-24 17:43:09 +08:00
没看到是用户自定义设置 这样就只能每分钟调一次了 其实也没什么的

添加定时器那个肯定不行 用户多了肯定有问题
sigmapi
2019-06-24 17:47:31 +08:00
直接用 quartz, 有 cron trigger
自己写的话,用 ScheduledExecutorService 就可以了,新建提醒时算出下次触发时间,每次触发的时候再算出下次触发的时间加到 executor 里
也可以用效率更高的 Hash Wheel 数据结构 https://stackoverflow.com/questions/867621/efficient-timer-algorithm
misaka19000
2019-06-24 17:56:31 +08:00
这排版楼上你们居然看得下去
Cyron
2019-06-24 18:01:53 +08:00
上 quartz 吧
Archangell
2019-06-24 18:32:40 +08:00
@wolfie 哈哈哈 不好意思 习惯空格分隔了
如果是几分钟查一次 就要做到每分钟查询了 这样不是特别耗性能吗
zhady009
2019-06-24 21:01:20 +08:00
@Archangell 一分钟一次根本没啥啊 只要你那次查询查出来的就是需要被通知的学生
akira
2019-06-24 21:53:20 +08:00
功能优先,优化什么的着急啥。

另外,“永久存在一个计时器任务” 的情况是很正常的,几个几十个计时器一直跑 都不奇怪的
zzl22100048
2019-06-25 08:16:39 +08:00
app 还是 web ?
wolfie
2019-06-25 08:17:11 +08:00
@Archangell #7
如果数据库压力不大,每分钟查一次就可以。

『提前 5 分钟』为例,每 10 分钟查一次未来 6 分钟 ~ 16 分钟 需要提醒的数据。只是一个思路,具体间隔自行选择。
zzl22100048
2019-06-25 08:19:47 +08:00
让客户端去提醒呗
Archangell
2019-06-25 09:04:26 +08:00
@sigmapi 感谢感谢 这个看起来十分有用 我研究研究
@akira 那只是一个学生 设置的一个提醒 如果是 1000 个学生 每天三个提醒 那不是就有 3000 个了
nekoneko
2019-06-25 09:35:56 +08:00
每分钟查一遍数据库,或者查缓存,最简单。或者做一个按提醒时间排序的有序阻塞队列,一个线程向队列写,一个线程取数据做定时任务
vance
2019-06-25 11:33:56 +08:00
每天凌晨查出要当天要提醒的时间和学生,按照当天的时间段动态设置提醒任务,然后删除前一天的提醒
akira
2019-06-25 18:33:42 +08:00
@Archangell 例如设定一个 1 分钟的定时器,然后这个定时器每次 检查 这一次 有 哪些学生需要提醒 ,这样就可以了啊
kevinv
2019-06-25 18:54:33 +08:00
环形队列

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

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

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

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

© 2021 V2EX