abelyao
V2EX  ›  问与答

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

  •  1
     
  •   abelyao · Dec 2, 2014 · 5093 views
    This topic created in 4205 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
        1
    robbielj  
       Dec 2, 2014
    不就是cron能完成的事么?
    abelyao
        2
    abelyao  
    OP
       Dec 2, 2014
    @robbielj 动态添加提醒数据哦,难道每一条提醒都增加一条 cron 记录?
    mkeith
        3
    mkeith  
       Dec 2, 2014
    你是怎么申请到的啊?
    fooevr
        4
    fooevr  
       Dec 2, 2014
    node有个later
    abelyao
        5
    abelyao  
    OP
       Dec 2, 2014
    @mkeith 如果不想自己出材料的话 可以到淘宝上找人弄一个咯,20元不到,不过建议只用做测试,以免以后要补充什么资料,就麻烦了。
    abelyao
        6
    abelyao  
    OP
       Dec 2, 2014
    @fooevr 呃,我用 PHP 在做了,难道要换 node …
    kslr
        7
    kslr  
       Dec 2, 2014
    模拟cron如何,规则就抄cron这样写,再写个解析该规则的。
    jybox
        8
    jybox  
       Dec 2, 2014
    abelyao
        9
    abelyao  
    OP
       Dec 2, 2014
    @jybox 这个… 好复杂的样子
    abelyao
        10
    abelyao  
    OP
       Dec 2, 2014
    @kslr 感觉应该不需要这么复杂吧,比如 iPhone 自带的 “提醒事项” 里面有一个选项是 “重复”,默认是只提醒一次,当有设定重复的时候,才会多次提醒,这个难道也要设计得很复杂吗
    holystrike
        11
    holystrike  
       Dec 2, 2014
    可以每次提醒的时候预先算好下次应该提醒的时间

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

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

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