使用Celery+redis实现定时删除数据库过期信息

23 篇文章 0 订阅
20 篇文章 0 订阅

上次有个需求是数据库每天定时清理,最后使用了mysql自带的事件调度+存储过程完成了这个事情,详见(点击查看),但是事后仔细回味感觉这很不python,所以决定使用异步列队神器Celery来完成这个事情。

首先需要用到redis来做缓存,所以首先需要保证电脑上有redis环境,安装教程参见我之前的redis教程(点击查看

这里假设已经安装好redis服务了,接下来就是安装python的依赖包:

pip install celery
pip install redis
pip install pymysql
由于我们要对mysql进行操作,所以需要借助pymysql操作数据库。

我们按照官方文档指出的,下面这种方式对定时任务进行设置:

#  test.py

from celery import Celery
from celery.schedules import crontab
import pymysql, datetime

app = Celery()


@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # 每天0点0分运行
    sender.add_periodic_task(
        crontab(minute=0, hour=0),
        del_data(),
    )


@app.task
def del_data():
    # 连接数据库(host,user,password,database)
    db = pymysql.connect("localhost", "user", "password", "database")
    # 使用cursor()方法创建一个游标对象
    cursor = db.cursor()
    # 使用execute()方法执行SQL语句
    cursor.execute(
        "DELETE FROM UserInfo WHERE \
        (TO_DAYS(NOW( ))-TO_DAYS(create_time)) >= `date_inter`"
    )
    # 关闭游标和数据库的连接
    cursor.close()
    db.close()
    print(datetime.datetime.now(), '数据已更新')

Celery 提供了一个 crontab 的对象,功能和linux中的crontab基本一致,可以对于定时任务进行更为精确的时间设置,而不仅限于多少秒重复一次这种简单的任务。下面用例子的方式来说明一下。

from celery.schedules import crontab

# 每分钟执行一次
c1 = crontab()

# 每天凌晨十二点执行
c2 = crontab(minute=0, hour=0)

# 每十五分钟执行一次
crontab(minute='*/15')

# 每周日的每一分钟执行一次
crontab(minute='*',hour='*', day_of_week='sun')

# 每周三,五的三点,七点和二十二点没十分钟执行一次
crontab(minute='*/10',hour='3,17,22', day_of_week='thu,fri')

上面都是配置,接下来就是如何去运行该程序了。
首先到redis的文件下,后台启动redis服务
在这里插入图片描述
然后启动一个组件 beat,它用于对任务进行调度,使用我们的test.py文件为例:
celery -A test beat # 这个命令会启动 test 应用的 beat。

我们也可以在启动 worker 的时候使用 -B 参数同时启动 beat 。
celery -A test worker -l info -B

这样就用Python+celery+redis实现了一个定时任务,是不是比用mysql的事件调度简单得多。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值