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 · 2698 次点击
    这是一个创建于 1901 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前接到一个需求,定时给注册一半的用户发送短信,我设计的实现方法是先把用户在 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   ·   我们的愿景   ·   实用小工具   ·   1065 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:02 · PVG 03:02 · LAX 12:02 · JFK 15:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.