V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
abelyao
V2EX  ›  问与答

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

  •  1
     
  •   abelyao · 2014-12-02 09:06:43 +08:00 · 4311 次点击
    这是一个创建于 3441 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近申请了一个微信企业号,发现很适合做一个定时提醒的功能,消息上限足够用,提醒也有声音。

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

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

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

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

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

    以上。
    abelyao
        18
    abelyao  
    OP
       2014-12-02 11:47:28 +08:00
    @knightlhs 你说的这个我已经在帖子的内容里面说了,就是要这样做,现在的问题是,需要多次触发的重复提醒,要怎么设计怎么实现,比较好
    abelyao
        19
    abelyao  
    OP
       2014-12-02 11:51:46 +08:00
    @jianghu52 我在主贴 APPEND 了一个思路,是看你这个回帖的时候想到的,谢谢!
    dongbeta
        20
    dongbeta  
       2014-12-02 11:52:38 +08:00
    微信有这个自带功能吧?
    holystrike
        21
    holystrike  
       2014-12-02 11:53:49 +08:00
    @abelyao 对,就这意思
    Rabbit52
        22
    Rabbit52  
       2014-12-02 11:58:50 +08:00
    我有个邮件提醒,按照邮件主题作为重复判断,然后 SETEX 到 redis 失效时间自定,然后查不到了就发邮件再 SET
    mornlight
        23
    mornlight  
       2014-12-02 12:52:48 +08:00
    诶?现在企业号可以主动对特定用户发消息了?
    abelyao
        24
    abelyao  
    OP
       2014-12-02 13:31:17 +08:00
    @mornlight 企业号一直可以的,不是公众账号哦!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   997 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:53 · PVG 07:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.