乐趣区

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 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…

退出移动版