资讯专栏INFORMATION COLUMN

drf实现常用数据缓存

ghnor / 3343人阅读

摘要:使用扩展类使用了视图集用于缓存返回列表数据的视图,与扩展类配合使用,实际是为方法添加了装饰器用于缓存返回单一数据的视图,与扩展类配合使用,实际是为方法添加了装饰器为视图集同时补充和两种缓存,与和一起配合使用。

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


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

流程

在第一次请求的时候查看缓存中(redis)是否有数据,有数据则直接返回响应

若redis中没有数据,则查询数据库

查询数据库并将数据保存到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 Response
from rest_framework import views
from rest_framework_extensions.cache.decorators import (
    cache_response
)
from myapp.models import City

class 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 UserSerializer
from rest_framework_extensions.cache.mixins import CacheResponseMixin

class UserViewSet(CacheResponseMixin, viewsets.ModelViewSet):#继承顺序一定在ViewSet前,其实必须在对应的mixin前
    serializer_class = UserSerializer

def-extensions官方文档:http://chibisov.github.io/drf...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45047.html

相关文章

  • drf实现常用数据缓存

    摘要:使用扩展类使用了视图集用于缓存返回列表数据的视图,与扩展类配合使用,实际是为方法添加了装饰器用于缓存返回单一数据的视图,与扩展类配合使用,实际是为方法添加了装饰器为视图集同时补充和两种缓存,与和一起配合使用。 在以往的后台数据访问时,我们往往都会进行数据库查询,基本的流程是这样的: showImg(https://segmentfault.com/img/bVbooYc?w=784&h...

    yanest 评论0 收藏0
  • drf实现常用数据缓存

    摘要:使用扩展类使用了视图集用于缓存返回列表数据的视图,与扩展类配合使用,实际是为方法添加了装饰器用于缓存返回单一数据的视图,与扩展类配合使用,实际是为方法添加了装饰器为视图集同时补充和两种缓存,与和一起配合使用。 在以往的后台数据访问时,我们往往都会进行数据库查询,基本的流程是这样的: showImg(https://segmentfault.com/img/bVbooYc?w=784&h...

    cocopeak 评论0 收藏0
  • Django-缓存

    摘要:自带了一个健壮的缓存系统来保存动态页面,避免每次请求都重新计算。缓存中的和方法是很常见的。尽量放在第一个继承的类设置过期时间根据自己需求加缓存。目前这个缓存使用的是内存。 概述:对于中等流量的网站来说,尽可能的减少开销是非常必要的。缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源。获取数据的数据的时候就是去缓存中拿,拿到了直接返回,没拿到就去数据库中...

    aervon 评论0 收藏0
  • DRF跨域后端解决之django-cors-headers

    摘要:后端实现跨域第三方扩展在介绍之前,我先介绍两个概念同源策略跨域同源策略同源策略是一种约定,是浏览器的一种安全机制。这里同源需要协议域名端口三者都相同,否则不能进行访问。跨域不同源之间的网站通信就是跨域。 在使用django-rest-framework开发项目的时候我们总是避免不了跨域的问题,因为现在大多数的项目都是前后端分离,前后端项目部署在不同的web服务器上,因为我们是后端程序员...

    lingdududu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<