Django Rest Framework中如何实现定时更新热门商品的周期性任务
Django后端实现周期性更新热门商品表的常用技术方案
以下是不同场景下可选择的4种落地方式,按轻量化到复杂功能排序:
方案1:系统级定时任务(无额外依赖,最简方案)
直接借助Linux服务器自带的crontab实现,不需要安装任何Django第三方扩展:
- 先编写Django自定义管理命令,在项目对应app下新建
management/commands/update_hot_products.py,实现的核心逻辑为:统计全量商品的浏览量取Top6,写入专门存储热门商品的表,建议用事务包裹写操作避免中间状态脏读 - 在服务器crontab中新增规则:
* * * * * /path/to/你的虚拟环境/bin/python /path/to/项目根目录/manage.py update_hot_products,即可实现每分钟自动执行一次更新逻辑 - 适配场景:单体部署的小型项目,不需要复杂的任务监控、重试能力
方案2:django-crontab(crontab的Django封装)
在Django配置层直接管理定时任务,不需要手动改服务器crontab规则:
- 安装扩展:
pip install django-crontab,在settings.py的INSTALLED_APPS中加入django_crontab - 在
settings.py中新增任务配置:
CRONJOBS = [ ('*/1 * * * *', '你项目的app名.tasks.update_hot_products') ]
- 执行
python manage.py crontab add即可自动把规则写入系统crontab,后续修改配置只需要重新执行该命令即可 - 适配场景:中小型项目,想统一在Django代码里管理定时任务规则
方案3:django-apscheduler(进程内调度,无外部服务依赖)
不需要依赖系统crontab,定时任务和Django主进程一起运行:
- 安装扩展:
pip install django-apscheduler,在INSTALLED_APPS中加入django_apscheduler,执行迁移生成调度器相关表 - 在项目
urls.py或者单独的调度配置文件中注册周期任务,设置执行间隔为60秒,绑定更新热门商品的逻辑即可 - 注意:如果用Gunicorn/uWSGI多进程部署,需要加分布式锁或者只单独启动一个调度进程,避免同个任务被重复执行多次
- 适配场景:中小型项目,部署环境不支持自定义crontab,不想额外部署其他服务
方案4:Celery + Celery Beat(工业级稳定方案)
适合已经在使用Celery做异步任务的中大型项目,支持分布式部署、任务重试、监控等完整能力:
- 安装依赖:
pip install celery django-celery-beat,配置好Celery的Broker(一般用Redis/RabbitMQ) - 在Celery的任务配置中添加周期任务规则,设置间隔为1分钟,绑定更新热门商品的任务函数,启动Celery Worker和Celery Beat进程即可
- 支持在Django Admin中可视化修改任务周期、启停任务,不需要改代码重启服务
- 适配场景:中大型项目,对任务可靠性、可观测性要求高,已经在使用Celery技术栈
额外优化建议
更新热门商品表的时候,建议先做双表切换或者先写临时表再原子替换,避免更新过程中用户请求读到空数据或者不全的热门商品列表。
内容的提问来源于stack exchange,提问作者some nooby questions
相关产品推荐
相关产品推荐

