Django-----几种常用的缓存配置

一、为什么要用缓存?

我们知道,在Django中,请求到达视图后,视图会从数据库取数据放到模板中进行动态渲染,渲染后的结果就是用户看到的html页面。但是,如果每次请求都从数据库取数据并渲染,将极大降低性能,不仅服务器压力大,而且客户端也无法即时获得响应。如果能将渲染后的结果放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。

缓存是一类统称,一般其介质是速度很快的内存,但也可以是能加快数据读取的其它方式

二、缓存的原理:

1、没有缓存

  1. Django view通过Models从DB获取数据
  2. 然后调用template去渲染,形成真正的HttpResponse
  3. 通过Http Socket将数据写回给客户端

2、有缓存

  1. 上面的1,2就省略了
  2. 根据url直接从缓存池里取出保存过的HttpResponse,返回给客户端

二、Django提供了6种缓存方式

  1. 开发调试缓存
  2. 内存缓存
  3. 数据库缓存
  4. 文件缓存(常用)
  5. Memcache缓存(使用python-memcached模块)
  6. Memcache缓存(使用pylibmc模块)
  7. 使用redis缓存(常用)
  8. 使用mongdb缓存

三、常用的缓存配置

1、文件缓存

  1. 配置

    CACHES = {
        'default': {
        # 指定缓存方式为文件
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            # 指定缓存文件的路径
            'LOCATION': '路径',
            # 缓存超时时间(默认为300秒,None表示永不过期,0表示立即过期)
            # 可以在setting.py中单独配置CACHE_MIDDLEWARE_SECONDS = 10缓存超时时间,其优先级高于CACHES中的TIMEOUT。
            'TIMEOUT':300,                            
       }
    }   
    
  2. 说明

    linux系统上要把缓存项目放在文件系统上,请为CACHE_BACKEND使用”file://“的缓存类型。例如,要把缓存数据存储在/var/tmp/django_cache上,请使用此设置:

    CACHE_BACKEND = 'file:///var/tmp/django_cache'
    

    **注意:**有三个斜线。 头两项是file://,第三个是第一个字符的目录路径,/var/tmp/django_cache。

    使用的是Windows,在file://之后加上文件的盘符:

    file://d:/cache/django_cache
    
  3. 适合场景

    小网站的低成本解决方案

2 、Memcache缓存(python-memcached)

  1. 安装memcache

    1、安装memcache
    sudo apt-get install memcached
    2、运行memcached
    memcached -d -m 50 -p 11311 -u root
    -d重启或者启动服务 -m 最大内存 默认64 -p 端口号 - u 用户名
    3、默认只能本地访问需要修改
    
  2. django安装python-memcached

    pip install python-memcached
    
  3. 单个配置方式

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
      'LOCATION': '127.0.0.1:11211',   # 指定Memcache缓存服务器的IP地址和端口
      'OPTIONS':{
       'MAX_ENTRIES': 300,  
      }
     }
    }
    
  4. 多个服务器配置

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎'LOCATION': [         
      # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
        '127.0.0.1:11211',
        '127.0.0.1.3:11311',
        '127.0.0.1.4:11411',
    	]
    	# 或者也可以给缓存机器加权重,权重高的承担更多的请求
        # 'LOCATION': [
        #            ('172.19.26.240:11211',5),
        #            ('172.19.26.242:11211',1),
        #  ]
     }
    }
    
  5. 应用场景

    缓存机制对于小型网站,比如你做的各种博客、或者是访问量比较小的,意义不是很大。一般是用于,规模中等或较大,访问量大。

3、Memcache缓存(pylibmc)

4、redis缓存

  1. 安装redis

    pip install django_redis
    
  2. 创建数据库

    python manage.py createcachetable
    
  3. 配置

    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache',
            # 缓存地址
            "LOCATION": "redis://127.0.0.1:6379",
             "OPTIONS": {
                 'MAX_ENTRIES': 2000
                 #使用线程池管理连接
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            }
        },
    }
    
  4. 设置redis存储django的session信息

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"
    

五、缓存的应用

1、说明

Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站.

2、全站使用

  1. 说明

    用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,

    当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存,

  2. 配置

    MIDDLEWARE = [
     'django.middleware.cache.UpdateCacheMiddleware',   # 响应HttpResponse中设置几个headers
      # 其它中间件
     'django.middleware.cache.FetchFromCacheMiddleware',   # 用来缓存通过GET和HEAD方法获取的状态码为200的响应
    ]
    
  3. 其它配置

    CACHE__MIDDLEWARE_SECONDS=15         # 设定超时时间为15秒
    
  4. 注意

    • UpdateCacheMiddleware 必须放在开头
    • FetchFromCacheMiddleware 必须放在最后
  5. 示例代码

    views视图函数

    from django.shortcuts import render
    import time
    
    def index(request):
     cache_time = time.time()
     return render(request,'index.html',{'time':cache_time})
    
    {% load cache %}    # 加载缓存
    <!DOCTYPE html>
    <html lang="en">
    <head>
         <meta charset="UTF-8">
         <title>缓存测试</title>
    </head>
    <body>
        <p>{{ time }}</p>
        {% cache 15  %}   # 设定超时时间为15秒
         <h3>{{ time }}</h3>
        {% endcache %}
    </body>
    </html>
    

3、单独视图缓存

  1. 配置方式一

    from django.views.decorators.cache import cache_page
    @cache_page(60 * 10) 秒数,这里指缓存 10 分钟
    def cache_view(request):
      return render(request, 'cache/index.html', {'bar': bar})
    
  2. 配置方式二

    from django.views.decorators.cache import cache_page
    urlpatterns = [
    url(r'cache_test/$', cache_page(60 * 10)(cache_view)),
    ]
    

4、局部使用缓存

  1. 语法

    1、引入TemplateTag
    {% load cache %}
    2、使用缓存
    {% cache 5000 缓存key %}
      缓存内容
    {% endcache %}
    
  2. 模板

    {% load cache %}    # 加载缓存
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>缓存测试</title>
    </head>
    <body>
    <p>{{ time }}</p>
    {% cache 15 'cache_test' %}   # 设定超时时间为15秒
     <h3>{{ time }}</h3>
    {% endcache %}
    </body>
    </html>
    

猜你喜欢

转载自blog.csdn.net/qq_38953577/article/details/93595291