abelyao
V2EX  ›  问与答

想撸一个 “定时提醒” 的接口,请教 “重复提醒” 的实现思路

  •  1
     
  •   abelyao · Dec 2, 2014 · 5574 views
    This topic created in 4366 days ago, the information mentioned may be changed or developed.
    最近申请了一个微信企业号,发现很适合做一个定时提醒的功能,消息上限足够用,提醒也有声音。

    目前的思路是,在 SAE 上搞个定时器,每分钟或半分钟,检查数据库中有没有要发送的消息,那就可以实现定时提醒了。

    那么问题来了,如果要做 “重复提醒” 的功能,可选 每天提醒/每周提醒/每月提醒/每年提醒 这样的重复提醒,数据库 和 定时器 上要怎么设计,比较合适呢?

    麻烦有经验的前辈,不吝赐教,谢谢!
    Supplement 1  ·  Dec 2, 2014
    根据 @jianghu52 的回帖,想到了一个思路:
    数据库中有一个 next time 的字段,表示下一次触发的时间,当然如果是单次提醒的,这个字段直接等于提醒时间就好。如果是需要重复提醒的,在本次提醒之后,根据提醒的周期,计算下一次提醒的时间,然后 update 一下 next time 字段。而 cron 定时器每次检测,都检测 next time 这个字段,就好了。这个应该算是比较简单、也不会太多消耗的方案。如果有更好的,欢迎继续讨论~~
    24 replies  •  2014-12-02 13:31:17 +08:00
    robbielj
    robbielj
    Dec 2, 2014
    1
    不就是cron能完成的事么?
    abelyao
    abelyao
    OP
    Dec 2, 2014
    2
    @robbielj 动态添加提醒数据哦,难道每一条提醒都增加一条 cron 记录?
    mkeith
    mkeith
    Dec 2, 2014
    3
    你是怎么申请到的啊?
    fooevr
    fooevr
    Dec 2, 2014
    4
    node有个later
    abelyao
    abelyao
    OP
    Dec 2, 2014
    5
    @mkeith 如果不想自己出材料的话 可以到淘宝上找人弄一个咯,20元不到,不过建议只用做测试,以免以后要补充什么资料,就麻烦了。
    abelyao
    abelyao
    OP
    Dec 2, 2014
    6
    @fooevr 呃,我用 PHP 在做了,难道要换 node …
    kslr
    kslr
    Dec 2, 2014
    7
    模拟cron如何,规则就抄cron这样写,再写个解析该规则的。
    abelyao
    abelyao
    OP
    Dec 2, 2014
    9
    @jybox 这个… 好复杂的样子
    abelyao
    abelyao
    OP
    Dec 2, 2014
    10
    @kslr 感觉应该不需要这么复杂吧,比如 iPhone 自带的 “提醒事项” 里面有一个选项是 “重复”,默认是只提醒一次,当有设定重复的时候,才会多次提醒,这个难道也要设计得很复杂吗
    holystrike
    holystrike
    Dec 2, 2014
    11
    可以每次提醒的时候预先算好下次应该提醒的时间

    如果取消了,就删除预算提醒项
    knightlhs
    knightlhs
    Dec 2, 2014
    12
    SAE 本身就支持 cron 的计划任务 关键是你后面的逻辑打算怎么处理
    knightlhs
    knightlhs
    Dec 2, 2014
    13
    你可以考虑通过 SAE 的 cron 调度最小检查时间 比如每分钟
    然后去看数据库是否有匹配数据 如果有 发提醒 如果没有 就返回 等待下一轮
    abelyao
    abelyao
    OP
    Dec 2, 2014
    14
    @knightlhs
    我知道 SAE 支持 cron,我也是打算用 cron 来取出需要发送的消息。
    但是总不能只要有一条提醒,就往 cron 里插入一行吧,所以重复提醒这部分还是得由程序来实现,现在就是头疼怎么实现比较合理,并且不会太耗资源。
    abelyao
    abelyao
    OP
    Dec 2, 2014
    15
    @holystrike 就是说,如果这条提醒,是需要重复提醒的,那么每次提醒完,顺便 copy 一份到下一个提醒时间吗?好像也是一个不错的思路
    knightlhs
    knightlhs
    Dec 2, 2014
    16
    @abelyao 我的意思是 用 cron 来触发你的 查询接口 接口去查询数据库看看有没有符合条件的数据
    不是说 每增加一个任务就增加一个 cron
    jianghu52
    jianghu52
    Dec 2, 2014
    17
    我是个初级码农,所以我觉得这个好像就是一个flg的事情。不知道是不是我想的太简单了。
    没有重复的loop_flg=0,重复一个月的loop_flg=1,依次类推
    每过1分钟,读取数据库,当发现有loop_flg = 1的数据的时候,直接计算当前时间与当时设定时间的差就应该可以了。(月份的话其实更简单,要求不高的话就直接去日,要求精确30天的话还得另外算,日,星期,年都可以计算的)

    换句话说 就是直接在代码里面多加几个方法,用以处理数据库里面多了loop-flg的数据。

    以上。
    abelyao
    abelyao
    OP
    Dec 2, 2014
    18
    @knightlhs 你说的这个我已经在帖子的内容里面说了,就是要这样做,现在的问题是,需要多次触发的重复提醒,要怎么设计怎么实现,比较好
    abelyao
    abelyao
    OP
    Dec 2, 2014
    19
    @jianghu52 我在主贴 APPEND 了一个思路,是看你这个回帖的时候想到的,谢谢!
    dongbeta
    dongbeta
    Dec 2, 2014
    20
    微信有这个自带功能吧?
    holystrike
    holystrike
    Dec 2, 2014
    21
    @abelyao 对,就这意思
    tunetoystory
    tunetoystory
    Dec 2, 2014
    22
    我有个邮件提醒,按照邮件主题作为重复判断,然后 SETEX 到 redis 失效时间自定,然后查不到了就发邮件再 SET
    mornlight
    mornlight
    Dec 2, 2014
    23
    诶?现在企业号可以主动对特定用户发消息了?
    abelyao
    abelyao
    OP
    Dec 2, 2014
    24
    @mornlight 企业号一直可以的,不是公众账号哦!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1898 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 08:01 · PVG 16:01 · LAX 00:01 · JFK 03:01
    ♥ Do have faith in what you're doing.