定时给达到条件的用户发送短信问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
334862132
V2EX    Python

定时给达到条件的用户发送短信问题

  •  
  •   334862132 2019-01-13 15:55:47 +08:00 3440 次点击
    这是一个创建于 2542 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前接到一个需求,定时给注册一半的用户发送短信,我设计的实现方法是先把用户在 redis 中缓存,之后设置一个过期时间,然后每半小时检索一次对达成条件的用户进行短信发送,然后最近随手点开一个 app,人家的短信推送竟然能精确到分钟,我如果也把 redis 缓存做成分钟缓存,每一分钟执行一次感觉对服务器压力很大,如果不是用定时任务一分钟检索一次去发送短信的话还有哪种方法能达到优化的效果?
    求大神指点~!
    16 条回复    2019-01-14 12:37:37 +08:00
    jiangnanyanyu
        1
    jiangnanyanyu  
       2019-01-13 16:05:35 +08:00 via Android   1
    要搞成那种 reactive 模式的
    qile1
        2
    qile1  
       2019-01-13 16:15:39 +08:00 via Android   1
    用数据库的触发器可以做到实时发送
    334862132
        3
    334862132  
    OP
       2019-01-13 16:25:41 +08:00
    @qile1
    @jiangnanyanyu
    谢谢,等我研究一下这俩种方法
    tomczhen
        4
    tomczhen  
       2019-01-13 16:27:25 +08:00   1
    触发一个延迟任务,任务检查用户操作进度,根据条件执行业务逻辑。
    ankle306
        5
    ankle306  
       2019-01-13 17:34:03 +08:00   1
    mq,延迟消息
    KasuganoSoras
        6
    KasuganoSoras  
       2019-01-13 18:32:46 +08:00   1
    用 php 写一个小脚本就可以
    写了一个简单的例子给你: https://github.com/kasuganosoras/SomeCodes/blob/master/v2ex_526598.php
    具体的你自己改一下就可以了
    xiangyuecn
        7
    xiangyuecn  
       2019-01-13 18:47:03 +08:00   1
    对服务器压力很大 亮了
    也许 99.9% 的定时任务回调对服务器一点影响没有也说不一定呢

    如果你的每天注册的用户是海量的。。会发现这是矛盾的。。因为那时候,可能并不会用一个任务通过一次来处理所有的数据

    先让任务使劲搞,后面如果服务器确实因为这个任务产生了影响,那就再想办法呗,干嘛提前优化?
    richzhu
        8
    richzhu  
       2019-01-13 19:07:45 +08:00 via iPhone   1
    有要求一分钟之内全发完吗? 弄个队列,让它慢慢发去不就好了,除非你的用户真的是很多…… 那样的话就不要想着用一个计划任务,或者一次处理就弄好呢
    jimrok
        9
    jimrok  
       2019-01-13 20:54:22 +08:00   1
    1 分钟对 redis 会有太大的影响,一分钟做个一个 set。正经的途径是做个时间轮。
    334862132
        10
    334862132  
    OP
       2019-01-14 08:22:28 +08:00
    @KasuganoSoras 我是写 python 的,我自己的脚本把 1 小时改成 1 分钟就可以了,不过仍然谢谢
    334862132
        11
    334862132  
    OP
       2019-01-14 08:26:31 +08:00
    @xiangyuecn @richzhu 嗯 可能是我杞人忧天吧, 我很不要脸的表示 除了定时任务脚本我写的 发短信都不是我写的, 那短信接口用 TM 同步,都神逻辑,因此我怕对服务器压力大,我不过顺口提了一嘴,人家不改我也没办法,另外说一下 我们用的是 django,要是用 tornado 用同步我就忍了......
    334862132
        12
    334862132  
    OP
       2019-01-14 08:27:56 +08:00
    @tomczhen 延时任务总是查单个用户,感觉还不如一分钟查一下把符合条件的都拽出来呢,查询的次数更少,性价比更高呢
    334862132
        13
    334862132  
    OP
       2019-01-14 08:29:41 +08:00
    @jimrok 谢了 时间轮是个不错的想法
    ShangAliyun
        14
    ShangAliyun  
       2019-01-14 10:31:36 +08:00   1
    这种一般是定时执行的,比如每天早上 10 点
    Raymon111111
        15
    Raymon111111  
       2019-01-14 11:48:57 +08:00   1
    让 key 的维度是分钟粒度的, 然后每分钟去轮询.

    压力不会大的, 相信我.
    tomczhen
        16
    tomczhen  
       2019-01-14 12:37:37 +08:00   1
    @334862132 数据库锁的粒度不同。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3023 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 13:10 PVG 21:10 LAX 05:10 JFK 08:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86