zoukankan      html  css  js  c++  java
  • Django框架深入了解——Django中的缓存

    Django框架深入了解——Django中的缓存

    一、Django中的缓存:

    前言:

    ​ 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.

    当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.

    缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.

    Django中的几种缓存方式:

    -开发调试阶段:没有缓存
    -缓存到内存中:settings.py文件配置

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
      'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
      'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
      'OPTIONS':{
       'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }  
     }
    }
    

    -缓存到数据库:settings.py文件配置

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
      'LOCATION': 'cache_table',          # 数据库表    
      'OPTIONS':{
       'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }  
     }   
    }
    

    -缓存到文件:settings.py文件配置

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
      'LOCATION': '/var/tmp/django_cache',        #指定缓存的路径
      'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
      'OPTIONS':{
       'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }
     }   
    }
    

    注意,创建缓存的数据库表使用的语句:

    python manage.py createcachetable
    

    -*Memcache缓存(使用python-memcached模块连接memcache)*

    Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc.

    settings.py文件配置

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
      'LOCATION': '192.168.10.100:11211',         # 指定Memcache缓存服务器的IP地址和端口
      'OPTIONS':{
       'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }
     }
    }
    

    LOCATION也可以配置成如下:

    'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
    'LOCATION': [         # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
     '192.168.10.100:11211',
     '192.168.10.101:11211',
     '192.168.10.102:11211',
    ]
    

    -Memcache缓存(使用pylibmc模块连接memcache)

    settings.py文件配置
     CACHES = {
      'default': {
       'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  # 指定缓存使用的引擎
       'LOCATION':'192.168.10.100:11211',         # 指定本机的11211端口为Memcache缓存服务器
       'OPTIONS':{
        'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
        'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
       },  
      }
     }
    

    LOCATION也可以配置成如下:

    'LOCATION': '/tmp/memcached.sock',  # 指定某个路径为缓存目录
    'LOCATION': [       # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
     '192.168.10.100:11211',
     '192.168.10.101:11211',
     '192.168.10.102:11211',
    ]
    

    Memcached是基于内存的缓存,数据存储在内存中.所以如果服务器死机的话,数据就会丢失,所以Memcached一般与其他缓存配合使用

    Django中的缓存应用:

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

    缓存粒度:

    单页面缓存:

    在视图函数上加一个装饰器(基于FBV)

    # urls.py
    
    url(r'^show_time/', views.show_time),
    
    # views.py
    
    from django.shortcuts import render
    
    # Create your views here.
    from rest_framework.views import APIView
    from django.views.decorators.cache import cache_page
    import time
    
    @cache_page(5)
    def show_time(request):
        ctime = time.strftime('%Y-%m-%d %H:%M:%S')
        return render(request, 'show_time.html', {'ctime': ctime})
    
    #  show_time.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>缓存测试</title>
    </head>
    <body>
    {{ ctime }}
    </body>
    </html>
    

    如果是CBV的化实现方法为:

    from django.views.decorators.cache import cache_page
    from django.utils.decorators import method_decorator
    @method_decorator(cache_page(5), name='dispatch')
    class ShowTime(APIView):
        def get(self, request):
            ctime = time.strftime('%Y-%m-%d %H:%M:%S')
            return render(request, 'show_time.html', {'ctime': ctime})
    

    img

    上面的例子是基于内存的缓存配置,基于文件的缓存该怎么配置呢??

    更改settings.py的配置

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎
      'LOCATION': 'E:django_cache',          # 指定缓存的路径
      'TIMEOUT': 300,              # 缓存超时时间(默认为300秒,None表示永不过期)
      'OPTIONS': {
       'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }
     }
    }
    

    然后再次刷新浏览器,可以看到在刚才配置的目录下生成的缓存文件

    通过实验可以知道,Django会以自己的形式把缓存文件保存在配置文件中指定的目录中.

    全站使用缓存:

    使用方法:在Django中间件最上面和最下面添加2个中间件:

    # 缓存全站:
    # 在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件
    # “update” 必须配置在第一个
    # “fetch” 必须配置在最后一个
    
    
    'django.middleware.cache.UpdateCacheMiddleware',     # process_response方法中更新缓存
        。。。。
    'django.middleware.cache.FetchFromCacheMiddleware'   # process_request方法中获取缓存
    

    同时在settings.py中再添加一个参数:

    CACHE_MIDDLEWARE_SECONDS=10   # 缓存时间
    

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

    (如果一开始还没有建立缓存,如果所有校验通过后,拿到数据,在请求走的时候,最上面中间件中要进行数据的缓存)

    也就是请求走的时候,在最上面的中间件中进行判断缓存是否已经存在,如果不存在,就使用UpdateCacheMiddleware对该数据进行缓存。

    局部使用缓存:

    # 视图无需设置
    
    def show_time(request):
        ctime = time.strftime('%Y-%m-%d %H:%M:%S')
        return render(request, 'show_time.html', {'ctime': ctime})
    
    # 在页面文件中进行渲染
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>缓存测试</title>
    </head>
    <body>
    <p>{{ ctime }}</p>
    {% load cache %}
    {% cache 5 'test' %}
        {{ ctime }}
    {% endcache %}
    </body>
    </html>
    

    tips:高级用法

    -前后端分离项目
    -设置值和取值:

    cache.set('test_data',{'name':'lqz','age':18},5)
    cache.get('test_data')
    

    Django中的Redis

    方式一:

    utils文件夹下,建立redis_pool.py

    import redis
    POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000)
    

    视图函数中使用:

    import redis
    from django.shortcuts import render,HttpResponse
    from utils.redis_pool import POOL
    def index(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.hset('kkk','age',18)
        return HttpResponse('设置成功')
    def order(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.hget('kkk','age')
        return HttpResponse('获取成功')
    

    方式二:

    安装django-redis模块

    pip install django-redis
    

    setting里配置:

    #redis配置
    
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
    
                # "PASSWORD": "123",
    
           }
        }
    }
    

    View视图函数:

    from django_redis import get_redis_connection
    conn = get_redis_connection('default')
    print(conn.hgetall('xxx'))
    
  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/Wunsch/p/12283726.html
Copyright © 2011-2022 走看看