views.pyfrom rest_framework.viewsets import ModelViewSetfrom rest_framework import mixinsfrom . import models, serializersfrom django.conf import settingsfrom rest_framework.response import Responsefrom django.core.cache import cacheclass BannerViewSet(ModelViewSet, mixins.ListModelMixin):queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders')[:settings.BANNER_COUNT]serializer_class = serializers.BannerSerializer# 有缓存走缓存,没有缓存走数据库,然后同步给缓存 。接口自己实现def list(self, request, *args, **kwargs):banner_list = cache.get('banner_list')if not banner_list:print('走了数据库')response = self.list(request, *args, **kwargs)banner_list = response.datacache.set('banner_list', banner_list, 86400)# 存进缓存中,缓存配置了redis数据库return Response(banner_list)
文章插图
启动服务
'''1):先切换到celery_task所在的同级目录(一般为根目录下)2):开一个终端(启动服务):celery worker -A celery_task -l info -P eventlet3):再开一个终端(添加任务): celery beat -A celery_task -l info'''# 注):-A表示相对路径,所以一定先进入celery_task所在包-l 表示打印到日志 info 级别
celery.py"""celery框架django项目工作流程1)加载django配置环境2)创建Celery框架对象app,配置broker和backend,得到的app就是worker3)给worker对应的app添加可处理的任务函数,用include配置给worker的app4)完成提供的任务的定时配置app.conf.beat_schedule5)启动celery服务,运行worker,执行任务6)启动beat服务,运行beat,添加任务重点:由于采用了django的反射机制,使用celery.py所在的celery_task包必须放置项目的根目录下"""# 一、加载django配置环境import osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev")# 二、加载celery配置环境from celery import Celerybroker = 'redis://:123@127.0.0.1:6379/1'backend = 'redis://:123@127.0.0.1:6379/2'# workerapp = Celery(broker=broker, backend=backend, include=['celery_task.tasks'])# 外面的包名和文件名,一般都是固定# 时区app.conf.timezone = 'Asia/Shanghai'# 是否使用UTCapp.conf.enable_utc = False# 任务的定时配置from datetime import timedeltafrom celery.schedules import crontabapp.conf.beat_schedule = {# 定时任务名字'update_banner_cache': {'task': 'celery_task.tasks.update_banner_list','args': (),'schedule': timedelta(seconds=10),# 3秒一次# 'schedule': crontab(hour=8, day_of_week=1),# 每周一早八点# 'schedule': crontab(minute=0, day_of_week=1),# 每周一早八点}}'''minute : 分钟hour :小时day_of_week :礼拜day_of_month:月month_of_year:年''''''fall_task:任务名自定义task:任务来源args:任务参数schedule:定时时间(秒)'''
tasks.pyfrom .celery import appfrom django.core.cache import cachefrom home import models, serializersfrom django.conf import settings@app.taskdef update_banner_list():queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders')[:settings.BANNER_COUNT]banner_list = serializers.BannerSerializer(queryset, many=True).data# 拿不到request对象,所以头像的连接base_url要自己组装for banner in banner_list:banner['image'] = 'http://127.0.0.1:8000%s' % banner['image']cache.set('banner_list', banner_list, 86400)return True
选择了IT,必定终身学习作者:Jeff
出处:http://dwz.date/aNfM
推荐阅读
- 调度器是怎么处理核上任务分配的?
- JavaScript的宏任务和微任务
- 征途手机版运镖任务每日最多可以接多少次答案
- 使用 PDF Mix Tool 执行常见的 PDF 编辑任务
- 研究生 学生代表大会的主要任务是什么?
- 使用时间轮实现“延时任务”
- spacex载人龙飞船发射 SpaceX龙飞船首次商业载人航天任务
- 异步文件通道Java NIO你需要了解多少,来看看这篇文章
- 设计一个高效的定时任务系统
- 当宇航员在国际空间站外执行任务时 国际空间站在大气层外吗