欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

drf实现常用数据缓存

发布时间:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 drf实现常用数据缓存 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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


图中发生了三次请求,则很正常向数据库查询了三次。但是现在有这样一个场景:我们有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 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 UserSerializer from rest_framework_extensions.cache.mixins import CacheResponseMixinclass UserViewSet(CacheResponseMixin, viewsets.ModelViewSet):#继承顺序一定在ViewSet前,其实必须在对应的mixin前serializer_class = UserSerializer

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

    与50位技术专家面对面20年技术见证,附赠技术全景图

    总结

    以上是生活随笔为你收集整理的drf实现常用数据缓存的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。