首页 > 其他分享 >轮播图接口加缓存

轮播图接口加缓存

时间:2023-03-09 20:00:09浏览次数:36  
标签:缓存 轮播 list 接口 celery task import

目录

接口加缓存

以轮播图为例,但是轮播图其实用不到缓存因为轮播图很少更新。这个并不是什么紧急的东西。不影响用户的体验,数据实时性。

为什么接口要加缓存

如果是一个互联网项目轮播图在同一个网址的首页,如果一瞬间有很多访问量,轮播图的接口就会被执行很多次,而轮播图是从mysql里查询出来的,瞬间访问量过大很可能导致接口崩溃。

优化查询,访问来了先去缓存中找,没有再去sql里找,在把轮播图数据放到缓存中。后面的查询都可以在redis中查询。

代码

重写drf list方法在内部写逻辑后给接口继承

from rest_framework.mixins import ListModelMixin
from utils.common_response import APIResponse
from django.core.cache import cache

class CommonListBannerModelMixin(ListModelMixin):
    def list(self, request, *args, **kwargs):
        # 拿到缓存中的轮播图数据
        banner_list = cache.get('banner_list')
        # 判断是否存在
        if banner_list:
            # 有直接返回
            print('走了缓存')
            return APIResponse(data=banner_list)
        else:
            # 不存在则去数据库里查
            res = super().list(request, *args, **kwargs)
            # 查出来以后存入缓存,便于后面访问接口从缓存中拿
            cache.set('banner_list',res.data)
            return APIResponse(data=res.data)

查看轮播图接口

from django.shortcuts import render

# Create your views here.
from rest_framework.viewsets import GenericViewSet
from .models import Banner
from .serializer import BannerSerializer
from utils.common_ListBannerModelMixin import CommonListBannerModelMixin


class BannerView(GenericViewSet, CommonListBannerModelMixin):
    queryset = Banner.objects.filter(is_delete=False, is_show=True).order_by('orders')
    serializer_class = BannerSerializer

但是,有一个严重的问题,这个时候如果我们的数据库中轮播图数据有变化,但是我们redis缓存中已经有了之前的数据,修改数据库数据,缓存中并没有影响。导致数据不一致。

双写一致性

解决数据不一致问题

  1. mysql数据修改后,删除缓存。
  2. 修改数据,更新缓存。
  3. 定时任务,隔一段时间更新一次缓存。 (这个不太好,实时性差,但是可以用在不是很重要的接口上)

使用celery来做

代码

在celery包里创建一个新任务,home_task

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.filter(is_delete=False,is_show=True).order_by('orders')
    # 序列化
    ser =BannerSerializer(instance=banners,many=True)
    # for循环拿出对象
    for item in ser.data:
        # 修改自己拼接后的地址
        item['image'] = settings.BACKEND_URL + item['image']
    cache.set('banner_list',ser.data)  
    return True

轮播图不显示的原因是没有request对象就不会带上前缀,自己加上

settings/dev.py

# 后端地址
BACKEND_URL= 'http://127.0.0.1:8001'

在celery里写一个定时任务

from celery import Celery
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.dev')
# 中间件 用本地的redis 1库,提交的任务放在里面
broker  ='redis://127.0.0.1:6379/1'
# 执行结果 用本地的redis 2库,执行完的结果放在里面
backend ='redis://127.0.0.1:6379/2'
# 实例化得到对象,并起个名字可以__name__获得这个文件的名字   include 指定管理的任务
app = Celery('test',broker=broker,backend=backend,include=['celery_task.order_task','celery_task.user_task','celery_task.home_task'])

from datetime import timedelta
# 定时任务
# celery的配置文件#####
# 第一步:在celery的py文件中写入
app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
app.conf.enable_utc = False
# 任务的定时配置
app.conf.beat_schedule = {
    'update_banner':{
        'task':'celery_task.home_task.update_banner',
        'schedule': timedelta(seconds=10)
    }
}

新写的任务一定要在celery里的include托管

app = Celery('test',broker=broker,backend=backend,include=['celery_task.order_task','celery_task.user_task','celery_task.home_task'])

标签:缓存,轮播,list,接口,celery,task,import
From: https://www.cnblogs.com/LiaJi/p/17201213.html

相关文章

  • ASP.NET Core Web API 接口限流
    前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间范围......
  • GO语言学习笔记-接口篇 Study for Go ! Chapter six - Interface
    持续更新Go语言学习进度中......GO语言学习笔记-类型篇StudyforGo!Chapterone-Type-slowlydance2me-博客园(cnblogs.com)GO语言学习笔记-表达式篇Study......
  • Java:包装类的缓存机制是?
    对包装类进行直接赋值时,若值在缓存区内,则会指向执行缓存区的地址。(通过new赋值则不会)缓存范围:1、Boolean,全部缓存。2、Character、Byte、Short、Intege......
  • 接口幂等性
    背景在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景:一个订单创建接口,第一次调用超时了,然后调用方重试了一次在订单创建时,我们需要去扣减库存,这时接口发生......
  • celery 执行异步任务,延迟任务,定时任务、django中使用celery、轮播图接口加缓存、双写
    目录1celery执行异步任务,延迟任务,定时任务2django中使用celery2.1秒杀功能2.1.1视图2.1.2任务order_task.py2.1.3前端Sckill.vue2.2django中使用celery3轮播图......
  • api接口详解大全
    api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口,可以帮助API使用者更好地了解、使用和集成,同时帮助人们有效地维护它每个产品都需要使用手册,AP......
  • VGA、HDMI、DP你都懂吗?显示接口大盘点
    电脑显示器,就像我们人类的眼睛一样,是我们和电脑之间进行信息交流的重要窗口。电脑显示器接口,则好比是我们人类的视神经,承载着传递信息的重要任务。随着科技与硬件的不断发......
  • 列表行删除 接口版
    面试试题系统管理框架是ruoyi-ui删除的接口请求可以使用post请求或者delete请求post请求要把参数改成dataexportfunctiontopicDelete(data){returnrequest(......
  • TypeScript学习笔记 -- 接口对象
    1.接口对象-对对象的形状(shape)进行描述2.基本用法:规定了对象属性的类型  接口的首字母大写,一般会在接口前面加上大写的I  定义好的接口使用的时候,其中的属性不......
  • 模糊搜索 接口版
    渲染出列表后使用后端传来参数直接使用参数就行:questionName   使用参数getList(questionName){topicList({page:this.page-1,size:this.siz......