博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
drf实现常用数据缓存
阅读量:5789 次
发布时间:2019-06-18

本文共 1632 字,大约阅读时间需要 5 分钟。

在以往的后台数据访问时,我们往往都会进行数据库查询,基本的流程是这样的:

clipboard.png

图中发生了三次请求,则很正常向数据库查询了三次。但是现在有这样一个场景:我们有1000个人在一个十分钟内向一个我们网站都看了同一个文章,那么我们有没有哪些可以优化我们的后端代码,因为这只是一篇文章在短时间内就被访问了1000次,当然我们网站的文章是海量的,那我们该怎么办?那么我们的数据缓存就派上用场了,基本的流程是这样的:

clipboard.png

流程

  1. 在第一次请求的时候查看缓存中(redis)是否有数据,有数据则直接返回响应
  2. 若redis中没有数据,则查询数据库
  3. 查询数据库并将数据保存到redis中,返回响应

这就是我们为什么只查询了一次数据库,若有1000次,我们在缓存时间内也只需要查询一次数据库,这里向redis中获取数据也需要耗时,但是由于redis数据存储在内存中,数据获取性能较数据库高了不止一点半点。

那么在drf项目中如何去实现呢?只需要简单的三步

安装

pip install drf-extensions

配置(可以省略)

# DRF扩展REST_FRAMEWORK_EXTENSIONS = {    # 缓存时间    'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60,}

使用

  • 使用cache_response装饰器
from rest_framework.response import Responsefrom rest_framework import viewsfrom rest_framework_extensions.cache.decorators import (    cache_response)from myapp.models import Cityclass CityView(views.APIView):    @cache_response()    def get(self, request, *args, **kwargs):        cities = City.objects.all().values_list('name', flat=True)        return Response(cities)

注意,cache_response装饰器既可以装饰在类视图中的get方法上,也可以装饰在REST framework扩展类提供的list或retrieve方法上。使用cache_response装饰器无需使用method_decorator进行转换。

  • 使用扩展类(使用了视图集ViewSet)

ListCacheResponseMixin:用于缓存返回列表数据的视图,与ListModelMixin扩展类配合使用,实际是为list方法添加了cache_response装饰器

RetrieveCacheResponseMixin:用于缓存返回单一数据的视图,与RetrieveModelMixin扩展类配合使用,实际是为retrieve方法添加了cache_response装饰器
CacheResponseMixin:为视图集同时补充List和Retrieve两种缓存,与ListModelMixin和RetrieveModelMixin一起配合使用。

from myapps.serializers import UserSerializerfrom rest_framework_extensions.cache.mixins import CacheResponseMixinclass UserViewSet(CacheResponseMixin, viewsets.ModelViewSet):#继承顺序一定在ViewSet前,其实必须在对应的mixin前    serializer_class = UserSerializer

def-extensions官方文档:

转载地址:http://prmyx.baihongyu.com/

你可能感兴趣的文章
centos 修改字符界面分辨率
查看>>
LNMP之Mysql主从复制(四)
查看>>
阅读Spring源代码(1)
查看>>
nagios一键安装脚本,nagios监控被监控主机上的应用服务mysql数据库
查看>>
grep 命令
查看>>
JS二维数组的声明和使用
查看>>
v$archive_gap dg dataguard 断档处理 scn恢复
查看>>
问责IT风险管理:CIO需关注两个重点
查看>>
Winform打包发布图解
查看>>
PDF文件怎么编辑,超简单的方法
查看>>
EasyUI基础入门之Easyloader(载入器)
查看>>
Uva 839 Not so Mobile
查看>>
30款超酷的HTTP 404页面未找到错误设计
查看>>
程序猿必备 MyEclipse2013-2014系列
查看>>
java中ArrayList 、LinkList区别
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
利用rand7()构造rand10()
查看>>
MySQL 备份与恢复
查看>>
吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
查看>>
easyui中combobox的值改变onchang事件
查看>>