zoukankan      html  css  js  c++  java
  • Django 缓存

    官方文档

    缓存的出现就是为了减轻对数据库的压力和加快内存访问的速度.我们的访问请求最终都是返回一个大的字符串,缓存就是将这段字符串直接存储起来,下次你来了,不用经过view去数据库或者内存拿到数据再渲染返回,而是直接从缓存里把上次的字符串交给你,很大的提高了速度,一般我们会将持久不变的,访问量大的数据放到缓存.(比如说一篇好的博客,很多人看,但是作者又不修改),实时性很高的不放缓存,比如博客访问量.

    Django自带缓存,提供了6中存储模式:

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

    每种存储模式只需要修改配置就可以了,其他早django中的操作都是一样,

    我们先来看配置,写在django settings.py里面就ok:

     1 # 此为开始调试用,实际内部不做任何操作
     2     # 配置:
     3         CACHES = {
     4             'default': {
     5                 'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎
     6                 'TIMEOUT': 300,                                               # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
     7                 'OPTIONS':{
     8                     'MAX_ENTRIES': 300,                                       # 最大缓存个数(默认300)
     9                     'CULL_FREQUENCY': 3,                                      # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
    10                 },
    11                 'KEY_PREFIX': '',                                             # 缓存key的前缀(默认空)
    12                 'VERSION': 1,                                                 # 缓存key的版本(默认1)
    13                 'KEY_FUNCTION' 函数名                                          # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
    14             }
    15         }
    16 
    17 
    18     # 自定义key函数
    19     def default_key_func(key, key_prefix, version):
    20         """
    21         Default function to generate keys.
    22 
    23         Constructs the key used by all other methods. By default it prepends
    24         the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
    25         function with custom key making behavior.
    26         """
    27         return '%s:%s:%s' % (key_prefix, version, key)
    28 
    29     def get_key_func(key_func):
    30         """
    31         Function to decide which key function to use.
    32 
    33         Defaults to ``default_key_func``.
    34         """
    35         if key_func is not None:
    36             if callable(key_func):
    37                 return key_func
    38             else:
    39                 return import_string(key_func)
    40         return default_key_func
    开发调试
     1 # 此缓存将内容保存至内存的变量中
     2     # 配置:
     3         CACHES = {
     4             'default': {
     5                 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
     6                 'LOCATION': 'unique-snowflake',
     7             }
     8         }
     9 
    10     # 注:其他配置同开发调试版本
    内存
     1 # 此缓存将内容保存至数据库
     2 
     3     # 配置:
     4         CACHES = {
     5             'default': {
     6                 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
     7                 'LOCATION': 'my_cache_table', # 数据库表
     8             }
     9         }
    10 
    11     # 注:执行创建表命令 python manage.py createcachetable
    数据库
    Memcache缓存(python-memcached模块)
    Memcache缓存(pylibmc模块)
    # 此缓存将内容保存至文件
        # 配置:
    
            CACHES = {
                'default': {
                    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                    'LOCATION': '/var/tmp/django_cache',
                }
            }
        # 注:其他配置同开发调试版本
    文件

    应用:

    Django提供的缓存支持

    1. 单独的页面缓存
    2. 页面局部缓存
    3. 全局缓存

    1单独的views缓存,存储位置设置为文件

    Django settings.py 里面配置:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': os.path.join(BASE_DIR,'caches'),#cache的存储位置
        }
    }

    views:

    from django.shortcuts import render
    
    from django.views.decorators.cache import cache_page
    
    @cache_page(10)
    # 导入模块后加上装饰器就就完成了单独的页面缓存
    import time
    
    def cache001(req):
        t=time.time()
        return render(req,'cache001.html',{'time':t})
    #这里用了一个动态的时间来验证是否缓存



    #结果就是第一次发起请求后,整个页面的返回字符串存储到了文件位置,再次访问的时候直接读取到了文件里面的内容返回,所以时间在缓存生命周期里面是不会改变的


    页面局部的缓存

    很多时候我们页面只需要一些数据缓存:

    settings..py 配置,用了数据库

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_table',  # 数据库表
        }
    }
    
    #写在sttings里面后执行下, python manage.py createcachetable ,就能再数据库中找到表了

    局部缓存是写在HTML中的:

    #HTNL
    
    {% load cache %}#加载cache
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>{{ time }}</p>
    
    {% cache 5000 mycacher %}      #5000代表超时时间, mycacher代表缓存的key,
    {{ time }}                     #需要缓存的内容
    {% endcache %}
    
    
    </body>
    </html>

    当我么你发起请求后,数据库缓存表就多了点东西了:

    全局缓存:

    这次我们将缓存储存在内存里面,形式会是key value格式,所以会制定一个key:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
            'LOCATION': 'lglgl',#制定一个内存缓存的引用
        }
    }

    全局缓存会利用到我们的中间件,在settings middleware中加上下面2个中间件:

      MIDDLEWARE = [
            'django.middleware.cache.UpdateCacheMiddleware',#-----放在最前面,用于储存缓存
            # 其他中间件...
            'django.middleware.cache.FetchFromCacheMiddleware',#----放在最后面,用于获取缓存
        ]

    搞定.这就是django 提供的3中缓存方式和集中存储地方,应该说是很强大了.

  • 相关阅读:
    家庭记账本安卓版开发:第六天
    django-自定义过滤器
    django-标签语法
    django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
    django-MTV基础篇
    django-第一天
    jquery---响应式方面应用
    css-基础知识
    HTML--第一章的基本知识
    003
  • 原文地址:https://www.cnblogs.com/guoguojj/p/8405534.html
Copyright © 2011-2022 走看看