1 http基于tcp,一定要进行3次握手,4次挥手
-http1.1版本,keepalive,可以多次请求使用同一个tcp连接
2 redis的hash操作
-hset
-hget
3 redis的列表操作
-lpush
-lpop
-blpop #消息队列
4 通用操作
-typ
-expire
5 管道
-redis非关系型数据库,不支持事务,可以通过管道模拟事务
6 django中使用redis
-普通使用(通用)
-django中独有的(django-redis)
-配置文件中配置cache
-使用的时候:conn=get_redis_connection()
-django的缓存使用的都是redis(不会在内存中放了)
-cache.set()
-cache.get()
7 接口缓存
-提高接口的并发量
8 celery分布式的异步任务框架
-异步任务
-定时任务
-延迟任务
9 使用
-建一个包celery_task
-在包中必须写一个celery.py
app=实例化(消息中间件地址,结果存储地址,管理的task的路径)
-写task
在包下新建py文件,把app导入,用app.task装饰函数(函数就是任务)
-在想用的位置(独立的,在包外部,可能是django项目),导入
-函数名.delay(参数)---》提交任务
-启动worker,
celery -A 包名 worker -l info
-查询执行结果,使用id查(独立的,在包外部,可能是django项目)
1 celery 执行延迟任务
1 其他不用变,提交任务的时候
from celery_task.user_task import mul
from datetime import datetime, timedelta
eta = datetime.utcnow() + timedelta(seconds=10)
# 参数传递需要使用args,传时间要使用时间对象,使用的是utc时间
mul.apply_async(args=(200, 50), eta=eta)
2 celery执行定时任务
#第一步:在celery.py中配置
# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'task-mul': {
'task': 'celery_task.user_task.mul',
'schedule': timedelta(seconds=3), # 3s后
# 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
'args': (3, 15),
},
'task-add': {
'task': 'celery_task.home_task.add',
'schedule': timedelta(seconds=10), # 10s后
# 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点
'args': (3, 5),
},
}
#第二步:启动beat(beat负责定时提交任务)
celery -A celery_task beat -l info
# 第三步:启动worker,任务就会被worker执行了
celery -A celery_task worker -l info -P eventlet
3 首页轮播图定时更新(异步更新思路)
1 首页轮播图加入缓存了
2 双写一致性问题(mysql数据改了,redis缓存数据还是一样的)
3 几种更新缓存的思路
-定时更新(具体接口,看公司需求),我们为了测试,快一些,3s更新一次
-异步更新(咱们现在没有)
-新增轮播图接口---》新增完轮播图后--》执行异步更新轮播图的任务--》update_banner.dely()
4 代码编写
#######0 第0步:在celery.py中
from celery import Celery
#在脚本中导入django环境
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
django.setup()
backend = 'redis://127.0.0.1:6379/1'
broker = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend,
include=['celery_task.course_task', 'celery_task.user_task', 'luffyapi.apps.home.home_task'])
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False
# 任务的定时配置
from datetime import timedelta
from celery.schedules import crontab
app.conf.beat_schedule = {
'update_banner': {
'task': 'luffyapi.apps.home.home_task.update_banner',
'schedule': timedelta(seconds=3), # 3s后
},
}
#######1 第一步:在home的app下新建home_task.py
from celery_task import app
4 课程主页页面
......
5 课程表分析(表数据录入)
1 三种课程放到三个表中
-免费课表
-实战课表
-轻课表
-三个表可以抽出一个基表
2 真正路飞的实战课表
-实战课表
-其他字段了解(课程名字,课程总学时,课程总学生数)
-course_type=InterField(choice=(0,‘python’))
-课程跟老师是一(老师)对多(课程)
-teacher
-课程跟课程分类是一(课程分类)对多(课程)
-course_category
-老师表
-其他字段了解(名字,title,简介,类型:讲师,班主任)
-课程分类表
-name
-章节表
-其他字段了解(章节名称,简介)
-课程跟章节是一(课程)对多(章节)
-course字段
-课时表
-章节和课时是一(章节)对多(课时)
from django.db import models
# Create your models here.
from luffyapi.utils.models import BaseModel
"""课程分类"""
class CourseCategory(BaseModel):
name = models.CharField(max_length=64, unique=True, verbose_name="分类名称")
class Meta:
db_table = "luffy_course_category"
verbose_name = "分类"
verbose_name_plural = verbose_name
def __str__(self):
return "%s" % self.name
"""实战课课程表"""
class Course(BaseModel):
"""课程"""
course_type = (
(0, '付费'),
(1, 'VIP专享'),
(2, '学位课程')
)
level_choices = (
(0, '初级'),
(1, '中级'),
(2, '高级'),
)
status_choices = (
(0, '上线'),
(1, '下线'),
(2, '预上线'),
)
name = models.CharField(max_length=128, verbose_name="课程名称")
course_img = models.ImageField(upload_to="courses", max_length=255, verbose_name="封面图片", blank=True, null=True)
course_type = models.SmallIntegerField(choices=course_type, default=0, verbose_name="付费类型")
brief = models.TextField(max_length=2048, verbose_name="详情介绍", null=True, blank=True)
level = models.SmallIntegerField(choices=level_choices, default=0, verbose_name="难度等级")
pub_date = models.DateField(verbose_name="发布日期", auto_now_add=True)
period = models.IntegerField(verbose_name="建议学习周期(day)", default=7)
attachment_path = models.FileField(upload_to="attachment", max_length=128, verbose_name="课件路径", blank=True,
null=True)
status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="课程状态")
# 优化字段
students = models.IntegerField(verbose_name="学习人数", default=0)
sections = models.IntegerField(verbose_name="总课时数量", default=0)
pub_sections = models.IntegerField(verbose_name="课时更新数量", default=