• Django缓存机制


    一:缓存介绍

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

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

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

    二:Django中的6种缓存方式

    1:开发调试(此模式为开发调试使用,实际上不执行任何操作)

    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)
       }
      }
     }

    2:内存缓存(将缓存保存到内存区域中)

    在settings中配置

    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)
      }  
     }
    }

    3:文件缓存(把缓存数据存到文件中)

    在settings中配置

    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)
      }
     }   
    }
    文件缓存

    4:数据库缓存(把缓存数据存到数据库中)

    settings文件中配置

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

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

    python manage.py createcachetable

    5:memcache缓存(使用python-memcached模块连接memcache)

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

    在settings中配置

    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)
      }
     }
    }
    Memcache缓存

    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',
    ]
    View Code

    6: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)
       },  
      }
     }
    View Code

    LOCATION也可以配置如下:

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

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

    三:Django缓存的应用

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

    三种粒度:

      全站缓存

      单页面缓存

      页面中局部缓存

    1: 使用单页面缓存(使用装饰器)

    from django.views.decorators.cache import cache_page
    @cache_page(5)
    def cache_test(request):
        print('走视图函数')
        ctime=time.time()
        return render(request,'index.html',locals())

    2:页面局部缓存

    {% load cache %}
    #传两个参数:第一个参数是超时时间,第二个参数是key值,唯一的标志#
    {% cache 5  'ttt'%}
        当前时间是:{{ ctime }}
    {% endcache %}

    3:全站缓存(配置中间件)

    -配置两个中间件:
        'django.middleware.cache.UpdateCacheMiddleware'   (response)
        ...
                                        
        'django.middleware.cache.FetchFromCacheMiddleware'    (request)
    
    -配置缓存时间
        CACHE_MIDDLEWARE_SECONDS=10

    缓存数据的格式:

    unique-snowflake={
        index:asdfafasfasf,
        test:aerafdgerytwrega,
        'ttt':saefasfaefqwe,
        'yyy':asdfasfdsad,
                }

    四:基于文件缓存的Django缓存示例

    利用文件缓存,在当前页面中缓存当前时间,缓存刷新时间为5秒

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import test
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/$', test,name='test'),
    ]

    views.py

    from django.shortcuts import render
    from django.views.decorators.cache import cache_page
    import time
    @cache_page(5)    #装饰器,缓存时间为5秒,单页面缓存时使用,当为局部缓存和全站缓存时时将其注释
    def test(request):
        ctime = time.time()
        return render(request,'time.html',locals())

    settings.py

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

    time.py(单页面缓存和全站缓存)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>文件缓存测试</title>
    </head>
    <body>
    {{ ctime }}
    </body>
    </html>

    time.html(局部页面缓存)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>文件缓存测试</title>
    </head>
    <body>
        无缓存的时间:{{ ctime }}
        <br>
        {% load cache %}
        {% cache 5 'ttt' %}
            缓存时间:{{ ctime }}
        {% endcache %}
    </body>
    </html>

    全站缓存是的settings中添加两个中间件和一个缓存时间配置

    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',    #(response)
        ...
        'django.middleware.cache.FetchFromCacheMiddleware' ,   #(request)
    ]
    CACHE_MIDDLEWARE_SECONDS=5  #缓存刷新时间

    配置中间件示意图:

  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/liuxiaolu/p/10638712.html
Copyright © 2020-2023  润新知