字符编码梳理,celery 执行异步任务,延迟任务,定时任务, django中使用celery,模拟秒杀功能实例,轮播图接口加缓存,双写一致性,首页轮播图定时更新,课程前端页面

1|0字符编码梳理,celery 执行异步任务,延迟任务,定时任务, django中使用celery,模拟秒杀功能实例,轮播图接口加缓存,双写一致性,首页轮播图定时更新,课程前端页面

1|1字符编码梳理

字符编码:数字计算机中的存储器唯一可以存储的是比特(bit),因此如果要想在计算机上处理信息,就必须把它们按位存储。为了将文本表示为数字形式,我们需要构建一种系统来为每一个字母赋予一个唯一的编码。数字和标点符号也算做文本的一种形式,所以它们也必须拥有自己的编码。 所有由符号所表示的字母和数字(Alphanumeric)都需要编码。具有这种功能的系统被称为字符编码集(Coded Character Set),系统内的每个独立编码称为字符编码(Character Codes)。

1|2ASCII

ASCII码就是一种被广泛使用的字符编码标准,它被称为美国信息交换标准码,从1967年正式公布至今,它一直是计算机产业中最重要的标准。ASCII码是7位编码,它的二进制取值范围为00000001111111,对应于十六进制就是00h~7Fh,最多可以表示128个编码。

img

1|0ASCII的局限性

简单的7位编码只适用于以英语为主的国家,在面对数以万计的中国、日本、韩国的象形文字,以及奇怪的朝鲜文音节等各国语言面前就不够用了。

1|3Unicode

Unicode,统一码,也叫万国码,简称为UCS。现在用的是UCS-2,即2个字节编码. 相对于ASCII的7位编码,目前Unicode采用了16位编码,每一个字符需要2个字节。

1|4UTF-8

虽然Unicode字符集中的码位唯一,但由于计算机存储数据通常是以字节为单位的,而且出于兼容之前的ASCII、大数小段数段、节省存储空间等诸多原因,通常情况下,我们需要一种具体的编码方式来对字符码位进行存储。 以UTF-8为例,其采用了16字节的变长编码方式编码Unicode,英文通常使用1字节表示,且与ASCII是兼容的,而中文常用3字节进行表示。UTF-8编码由于较为节约存储空间,因此使用得比较广泛。

1|5celery 执行异步任务,延迟任务,定时任务

1|0elery 执行异步任务,延迟任务

# timedelta做时间计算的 from datetime import datetime,timedelta eta = datetime.utcnow()+timedelta(seconds=20) # 异步执行 res = send_sms.delay('188558888','9999') print(res) # 5秒后执行这个任务 异步执行 res = send_sms.apply_async(args=['18898555555','8888'],eta=eta) print(res)

1|0celery 执行定时任务

from celery import Celery from datetime import datetime,timedelta from celery.schedules import crontab # 第一步:在celery的py文件中写入 app.conf.timezone = 'Asia/Shanghai' # 是否使用UTC app.conf.enable_utc = False # celery的配置文件##### # 任务的定时配置 app.conf.beat_schedule = { 'send_sms': { 'task': 'celery_task.user_task.send_sms', # 'schedule': timedelta(seconds=3), # 时间对象 # 'schedule': crontab(hour=8, day_of_week=1), # 每周一早八点 'schedule': crontab(hour=9, minute=43), # 每天9点43 'args': ('18888888', '6666'), }, } # 第二步:启动beat celery -A celery_task beat -l info # 第三步:启动worker celery -A celery_task worker -l info -P eventlet

image

1|6模拟秒杀功能实例

1|01.秒杀逻辑分析

1 前端秒杀按钮,用户点击---》发送ajax请求到后端 2 视图函数---》提交秒杀任务---》借助于celery,提交到中间件中了 3 当次秒杀的请求,就回去了,携带者任务id号在前端 4 前端开启定时任务,每隔3s钟,带着任务,向后端发送请求,查看是否秒杀成功 5 后端的情况 1 任务还在等待被执行----》返回给前端,前端继续每隔3s发送一次请求 2 任务执行完了,秒杀成功了---》返回给前端,恭喜您秒杀成功--》关闭前端定时器 3 任务执行完了,秒杀失败了---》返回给前端,秒杀失败--》关闭前端定时器

1|02.视图

# 秒杀逻辑 from rest_framework.viewsets import ViewSet from celery_task.order_task import sckill_task from celery_task.celery import app from celery.result import AsyncResult class SckillView(ViewSet): @action(methods=['GET'],detail=False) def sckill(self,request): a = request.query_params.get('id') res = sckill_task.delay(a) return APIResponse(task_id = res.id) @action(methods=['GET'],detail=False) def get_result(self,request): task_id = request.query_params.get('task_id') a = AsyncResult(id=task_id, app=app) if a.successful(): result = a.get() if result: return APIResponse(msg='秒杀成功') else: return APIResponse(code=101, msg='秒杀失败') elif a.status == 'PENDING': print('任务等待中被执行') return APIResponse(code=666, msg='还在秒杀中') else: return APIResponse()

image

1|03.任务 order_task.py

import random import time @app.task def sckill_task(good_id): # 生成一个订单,减库存,都在一个事务中 print("商品%s:秒杀开始" % good_id) time.sleep(random.choice([6,7,9])) print("商品%s:秒杀结束" % good_id) return random.choice([True,False])

1|04.前端Sckill.vue

<template> <button @click="handleSckill">秒杀</button> </template> <script> import Header from '@/components/Header.vue'; import Banner from '@/components/Banner.vue'; import Footer from '@/components/Footer.vue'; export default { name: 'Sckill', data(){ return{ task_id:'', t:null } }, methods:{ handleSckill(){ // 响应状态码是200会走then这一条,状态码不是200会走catch this.$axios.get(this.$settings.BASE_URL+'/user/sckill/sckill/?id=888').then(res=>{ this.task_id = res.data.task_id // 写定时操作 this.t = setInterval(()=>{ this.$axios.get(this.$settings.BASE_URL+'/user/sckill/get_result/?task_id=' + this.task_id).then(res=>{ if(res.data.code===666){ console.log(res.data.msg) }else { // 秒杀结束,无论成功失败,这个定时任务都结束 clearInterval(this.t) this.t=null this.$message(res.data.msg) } }) }) }).catch(res=>{ }) } } } </script> <style scoped> </style>

image

1|7django中使用celery

# 使用步骤: -1 把写的包,复制到项目目录下 -luffy_api -celery_task #celery的包路径 -luffy_api #源代码路径 -2 在使用提交异步任务的位置,导入使用即可 -视图函数中使用,导入任务 -任务.delay() # 提交任务 -3 启动worker,如果有定时任务,启动beat -4 等待任务被worker执行 -5 在视图函数中,查询任务执行的结果 # 补充:如果在公司中,只是做定时任务,还有一个更简单的框架 APSchedule:https://blog.csdn.net/qq_41341757/article/details/118759836

1|8轮播图接口加缓存

# 1 网站首页被访问的频率很高,瞬间 1w个人在访问,首页的轮播图接口会执行1w次,1w次查询轮播图标的sql在执行,轮播图基本不变 # 2 想一种方式,让这1w个访问,效率更高一些,不查数据库了,直接走缓存--》redis--》效率高 # 3 现在的逻辑变成了 1 轮播图接口请求来了,先去缓存中看,如果有,直接返回 2 如果没有,查数据库,然后把轮播图数据,放到redis中,缓存起来
# 加入缓存的轮播图接口 def list(self,request,*args,**kwargs): # 查看缓存有没有数据,如果没有的话,就再走数据库 banner_list = cache.get('banner_list') if banner_list: print('走了缓存') return APIResponse(data=banner_list) else:# 走了数据库 print('走了数据库') res = super().list(request,*args,**kwargs) # 把序列化后的数据存到缓存中,redis中 cache.set('banner_list',res.data) return APIResponse(data=res.data)

1|9双写一致性与首页轮播图定时更新

from .celery import app from home.models import Banner from home.serializer import BannerSerializer from django.core.cache import cache from django.conf import settings @app.task def update_banner(): # 只要这个任务一执行,就更新礼拜天的缓存 banners = Banner.objects.all().filter(is_delete=False,is_show=True).order_by('orders') ser = BannerSerializer(instance=banners,many=True) for item in ser.data: item['image'] = settings.BACKEND_URL + item['image'] cache.set('banner_list',ser.data) return True
# 加入缓存后,缓存中有数据,先去缓存拿,但是如果mysql中数据变了,缓存不会自动变化,出现数据不一致的问题 mysql 和 缓存数据库 数据不一致 # 双写一致性 写入mysql,redis没动,数据不一致存在问题 #如何解决 1 修改数据,删除缓存 2 修改数据,更新缓存 3 定时更新缓存 ---》实时性差
'update_banner': { 'task': 'celery_task.home_task.update_banner', 'schedule': timedelta(seconds=3), # 时间对象 },

1|10课程前端页面

# 免费课,实战课,轻课 -不要钱的,免费的 -实战课:python面向对象 39.9 -线下课程完整版的视频 19999 # 课程列表页数据 1 新建3个页面组件 FreeCourserView ActualCourserView LightCourseView 2 配置路由 { path: '/free-course', name: 'free', component: FreeCourserView }, { path: '/actual-course', name: 'actual-course', component: ActualCourserView }, { path: '/light-course', name: 'light-course', component: LightCourseView },
<summary>ActualCourserView.py</summary> <template>
  • 课程分类:
  • 全部
  • Python
  • Linux运维
  • Python进阶
  • 开发工具
  • Go语言
  • 机器学习
  • 技术生涯
<div class="ordering"> <ul> <li class="title">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选:</li> <li class="default this">默认</li> <li class="hot">人气</li> <li class="price">价格</li> </ul> <p class="condition-result">共21个课程</p> </div> </div> <!-- 课程列表 --> <div class="course-list"> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> </div> </div> <Footer></Footer>
<summary>FreeCourserView</summary> <template>
  • 课程分类:
  • 全部
  • Python
  • Linux运维
  • Python进阶
  • 开发工具
  • Go语言
  • 机器学习
  • 技术生涯
<div class="ordering"> <ul> <li class="title">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选:</li> <li class="default this">默认</li> <li class="hot">人气</li> <li class="price">价格</li> </ul> <p class="condition-result">共21个课程</p> </div> </div> <!-- 课程列表 --> <div class="course-list"> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> <div class="course-item"> <div class="course-image"> <img src="@/assets/img/course-cover.jpeg" alt=""> </div> <div class="course-info"> <h3>Python开发21天入门 <span><img src="@/assets/img/avatar1.svg" alt="">100人已加入学习</span></h3> <p class="teather-info">Alex 金角大王 老男孩Python教学总监 <span>共154课时/更新完成</span></p> <ul class="lesson-list"> <li><span class="lesson-title">01 | 第1节:初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span> <span class="free">免费</span></li> <li><span class="lesson-title">01 | 第1节:初识编码</span></li> <li><span class="lesson-title">01 | 第1节:初识编码初识编码</span></li> </ul> <div class="pay-box"> <span class="discount-type">限时免费</span> <span class="discount-price">¥0.00元</span> <span class="original-price">原价:9.00元</span> <span class="buy-now">立即购买</span> </div> </div> </div> </div> </div> <Footer></Footer>
LightCourseView
index.js import Vue from 'vue' import VueRouter from 'vue-router' import HomeView from '../views/HomeView.vue' import Sckill from "@/views/Sckill"; import FreeCourserView from "@/views/FreeCourserView"; import ActualCourserView from "@/views/ActualCourserView"; import LightCourserView from "@/views/LightCourserView";

Vue.use(VueRouter)

const routes = [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/sckill',
name: 'sckill',
component: Sckill
},
{
path: '/free-course',
name: 'free',
component: FreeCourserView
},
{
path: '/actual-course',
name: 'actual-course',
component: ActualCourserView
},
{
path: '/light-course',
name: 'light-course',
component: LightCourserView
},

]

const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})

export default router

image


__EOF__

本文作者泡芙有点甜
本文链接https://www.cnblogs.com/zx0524/p/17201734.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   小王应该在学习!  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示