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安装及配置

相关文章
相关标签/搜索