DRF緩存

對於如今的動態網站來說,全部的界面展現都是經過客戶端請求服務端,服務端再去請求數據庫,而後將請求到的數據渲染後返回給客戶端。用戶每次訪問頁面都須要去請求數據庫,若是同時有多我的訪問的話,對於咱們的數據庫的壓力是至關大的。html

因此咱們會想,對於不是常常變動的數據,或者不須要實時更新展現的數據,咱們能夠將數據存放在緩存中,用戶下次須要數據的時候,服務端直接從緩存中拿到數據返回給用戶便可,不須要每次都去數據庫查詢,這樣會大大下降數據庫的壓力,提高用戶訪問速度。git

Django提供了多種緩存方法,具體能夠參考:https://docs.djangoproject.com/zh-hans/2.1/topics/cache/github

 

下面咱們來看看DRF緩存,它對Django的緩存進行了一層封裝,使咱們用起來更加方便redis

一、使用drf-extensions數據庫

  Django REST Framework中使用緩存,可使用GitHub上提供的drf-extensions擴展來實現django

  GitHub地址:https://github.com/chibisov/drf-extensionswindows

  參考文檔:http://chibisov.github.io/drf-extensions/docs/#caching緩存

  drf-extensions 緩存工做原理:函數

    收到用戶請求時,會根據請求對應的 view_instance, view_method, request, args, kwargs 等生成一個key,而後經過這個key去內存中查找是否有對應的value,若是有value,將其封裝成對應的response返回給客戶端網站

    若是經過key沒有找到對應的value,則去執行咱們的視圖函數對應的方法,並將結果做爲key值保存在內存中,以便下次使用。

      

  1)安裝drf-extensions:pip install drf-extensions

  2)使用方法:

    首先須要安裝 drf-extensions 庫:pip install drf-extensions

    1)使用裝飾器方式

      @cache_response

       它適用於繼承了rest_framework.views.APIView的類,且須要返回一個rest_framework.response.Response的實例

       用法以下:   

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framwork_extensions.cache.decorator import cache_response
class GoodListView(APIView):
    @cache_response()
    def get(self, request, format=None):
        goods = Goods.objects.all()[:10]
        goods_serializer = GoodListSerializer1(goods, many=True)
        return Response(goods_serializer.data)

       第一次訪問goods接口,看到使用的時間是1.44s

      

 

      而後咱們再次刷新界面,看到goods接口只是用了259ms

      

      @cache_response()接受4個參數

       

      a)timeout:指定過時時間,單位爲秒,即緩存有效期時間。默認爲None,即永久緩存,咱們也能夠在設置文件中修改此參數

        REST_FRAMEWORK_EXTENSIONS = {

          'DEFAULT_CACHE_RESPONSE_TIMEOUT':60*15  # 即指定有效期爲15分鐘

        }

      b)key_func:指定緩存鍵,默認狀況下,每一個來自@cache_response裝飾器的緩存數據都由key存儲,使用DefaultKeyConstructor計算

      c)cache:指定裝飾器在緩存結果時使用特定的緩存,通常狀況下,咱們會直接使用默認的default 緩存

      d)cache_errors:默認狀況下,每一個response都會被緩存,包括錯誤,因此若是咱們第一次請求的時候中間出現錯誤,那麼在緩存有效期內,每一次的請求都將會直接將以前緩存的錯誤信息返回給咱們。

        咱們能夠經過修改cache_errors的值爲False來改變這種行爲。

        REST_FRAMEWORK_EXTENSIONS = {

          'DEFAULT_CACHE_RESPONSE_TIMEOUT':60*15,  # 即指定有效期爲15分鐘

          ‘DEFAULT_CACHE_ERRORS’:False

        }

     2)使用CacheResponseMixin

      用於緩存標準視圖retrieve和list方法。和viewset搭配使用。

      CacheResponseMixin本質上也是使用@Cache_response()裝飾器實現,在它的基礎上進行了進一步封裝,使得使用更加便捷

      mixin的示例使用方法:

from rest_framework_extensions.cache.mixins import CacheResponseMixin
class GoodListView3(CacheResponseMixin,mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    queryset = Goods.objects.all().order_by("add_time")
    serializer_class = GoodListSerializer1
    pagination_class = GoodPageView

      只須要將CacheResponseMixin加入到咱們的試圖類函數第一個繼承類位置便可。

      

      查看rest_framework_extensions.cache.mixins,能夠看到,它下面提供了四個類:

      BaseCacheResponseMixin:公共類,只是指定了默認的緩存鍵功能

      ListCacheResponseMixin:繼承自BaseCacheResponseMixin,針對list方法緩存

      RetrieveCacheResponseMixin:針對retrieve方法緩存

      CacheResponseMixin:繼承了ListCacheResponseMixin和RetrieveCacheResponseMixin,即既能夠對list也能夠針對retrieve方法進行緩存。

 二、使用redis緩存(Django-redis)

  參考文檔:https://django-redis-chs.readthedocs.io/zh_CN/latest/

  GitHub:https://github.com/niwinz/django-redis

  1)須要安裝django-redis:pip install django-redis

  2)配置:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",  
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
  若是有密碼的話,能夠在url中:LOCATION:'redis://:password@ip:port',也能夠配置在OPTIONS中
    "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
       "PASSWORD":"password" }
 

  3)具體redis的安裝及配置,能夠見以前的博客  Linux下redis的安裝及配置 或 windows下redis安裝及配置

相關文章
相關標籤/搜索