在以往的後臺數據訪問時,咱們每每都會進行數據庫查詢,基本的流程是這樣的:git
圖中發生了三次請求,則很正常向數據庫查詢了三次。可是如今有這樣一個場景:咱們有1000我的在一個十分鐘內向一個咱們網站都看了同一個文章,那麼咱們有沒有哪些能夠優化咱們的後端代碼,由於這只是一篇文章在短期內就被訪問了1000次,固然咱們網站的文章是海量的,那咱們該怎麼辦?那麼咱們的數據緩存就派上用場了,基本的流程是這樣的:github
這就是咱們爲何只查詢了一次數據庫,如有1000次,咱們在緩存時間內也只須要查詢一次數據庫,這裏向redis中獲取數據也須要耗時,可是因爲redis數據存儲在內存中,數據獲取性能較數據庫高了不止一點半點。
那麼在drf項目中如何去實現呢?只須要簡單的三步redis
pip install drf-extensions
# DRF擴展 REST_FRAMEWORK_EXTENSIONS = { # 緩存時間 'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60, }
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進行轉換。數據庫
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...緩存