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