• 十五 Django框架,缓存


    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

    Django中提供了6种缓存方式:
      1、开发调试,没有实质用途,只是配置了缓存配置
      2、内存,将缓存保存在本地内存
      3、文件,将缓存保存在本地文件
      4、数据库,将缓存保存在数据库
      5、Memcache缓存(python-memcached模块)将缓存保存在Memcache,用的python-memcached模块
      6、Memcache缓存(pylibmc模块)将缓存保存在Memcache,用的pylibmc模块

    配置

    1、开发调试配置,

    复制代码
    #缓存配置
    # 自定义缓存key
    def default_key_func(key, key_prefix, version):
        return '%s:%s:%s' % (key_prefix, version, key)
    
    # 配置:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',   # 开发调试,引擎
            'TIMEOUT': 300,                                             # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
            'OPTIONS': {
                'MAX_ENTRIES': 300,                                     # 最大缓存个数(默认300)
                'CULL_FREQUENCY': 3,                                    # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
            },
            'KEY_PREFIX': '',                                           # 缓存key的前缀(默认空)
            'VERSION': 1,                                               # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
            # 'KEY_FUNCTION': default_key_func                           # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
        }
    }
    复制代码

    2、内存配置

    复制代码
    #缓存配置
    # 自定义缓存key
    def default_key_func(key, key_prefix, version):
        return '%s:%s:%s' % (key_prefix, version, key)
    
    # 配置:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',     #配置内存引擎
            'LOCATION': 'unique-snowflake',                                 #配置内存缓存名称
    
            'TIMEOUT': 300,                     # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
            'OPTIONS': {
                'MAX_ENTRIES': 300,             # 最大缓存个数(默认300)
                'CULL_FREQUENCY': 3,            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
            },
            'KEY_PREFIX': '',                   # 缓存key的前缀(默认空)
            'VERSION': 1,                       # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
            # 'KEY_FUNCTION': default_key_func         # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
        }
    }
    复制代码

    3、文件配置

    复制代码
    #缓存配置
    # 自定义缓存key
    def default_key_func(key, key_prefix, version):
        return '%s:%s:%s' % (key_prefix, version, key)
    
    # 配置:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',     #配置文件引擎
            'LOCATION': os.path.join(BASE_DIR,'huancuen'),                        #配置文件缓存路径,当前工程下的huancuen文件夹
    
            'TIMEOUT': 300,                     # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
            'OPTIONS': {
                'MAX_ENTRIES': 300,             # 最大缓存个数(默认300)
                'CULL_FREQUENCY': 3,            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
            },
            'KEY_PREFIX': '',                   # 缓存key的前缀(默认空)
            'VERSION': 1,                       # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
            # 'KEY_FUNCTION': default_key_func         # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
        }
    }
    复制代码

    4、数据库配置,这种方式不推荐,缓存本来就是解决数据库访问量,结果还是要访问数据库

    复制代码
    # 配置:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',     #配置数据库引擎
            'LOCATION': 'my_cache_table',                                 #配置数据库表,注意:执行创建表命令 python manage.py createcachetable
    
            'TIMEOUT': 300,                     # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
            'OPTIONS': {
                'MAX_ENTRIES': 300,             # 最大缓存个数(默认300)
                'CULL_FREQUENCY': 3,            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
            },
            'KEY_PREFIX': '',                   # 缓存key的前缀(默认空)
            'VERSION': 1,                       # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
            # 'KEY_FUNCTION': default_key_func         # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
        }
    }
    复制代码

    5、Memcache缓存(python-memcached模块)配置

    复制代码
    # 此缓存使用python-memcached模块连接memcache,3种连接方式
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  #连接引擎
                'LOCATION': '127.0.0.1:11211',                      #服务器IP和端口
            }
        }
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  #连接引擎
                'LOCATION': 'unix:/tmp/memcached.sock',                 
            }
        }   
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', #连接引擎
                'LOCATION': [                               #多服务器IP和端口
                    '172.19.26.240:11211',
                    '172.19.26.242:11211',
                ]
            }
        }
    #其他参数同上
    复制代码

    6、Memcache缓存(pylibmc模块)配置

    复制代码
    # 此缓存使用pylibmc模块连接memcache,3种连接方式
        
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  #连接引擎
                'LOCATION': '127.0.0.1:11211',                     #ip端口
            }
        }
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
                'LOCATION': '/tmp/memcached.sock',
            }
        }   
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  #连接引擎
                'LOCATION': [                               #多服务器ip端口
                    '172.19.26.240:11211',
                    '172.19.26.242:11211',
                ]
            }
        }
    #其他参数同上
    复制代码

    缓存应用

    注意:以上任意那种方式的缓存,在应用上都是一样的,应用首先要在全局配置缓存参数

    1、全站应用缓存,不常用

    使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存

    Django提供了两个写好的中间件,用于全站缓存

    MIDDLEWARE = [
            'django.middleware.cache.UpdateCacheMiddleware',  #当请求来的时候判断缓存是否存在,如果不存在写入缓存
            # 其他中间件...
            'django.middleware.cache.FetchFromCacheMiddleware', #如果缓存存在,在缓存里拿数据
        ]

    全站缓存中间件注册

    复制代码
    #中间件
    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        # 'app1.chajian.zhong_jian_jian.zhongjianjian',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',   #
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
    复制代码

    只要在中间件列表里注册了这两个缓存中间件,就自动缓存全站了

    2、单独视图缓存

    就是在逻辑处理函数上用上缓存装饰器,这样被用上缓存装饰器的逻辑处理的页面将自动缓存,要去掉全局的缓存中间件

    导入缓存装饰器模块 from django.views.decorators.cache import cache_page

    @cache_page(60)缓存装饰器,用在要缓存的逻辑处理函数上,参数是缓存时间秒

    复制代码
    from django.shortcuts import render,redirect
    import time
    
    from django.views.decorators.cache import cache_page #导入缓存装饰器
    
    #逻辑处理模块
    @cache_page(5)  #运用缓存装饰器,缓存保存时间5秒
    def special(request):
        t = time.time()
        return render(request, 'app1/index.html',locals())
    复制代码

    3、局部模板使用缓存

    就是在html模板里应用,指定一个页面的某一个区块缓存

    {% load cache %}#在模板页面导入局部缓存模块

    {% cache 缓存时间 自定义缓存名称 %}
      需要缓存的区块
    {% endcache %}

    复制代码
    {% load cache %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" type="text/css" href="/static/css/tou.css">
    </head>
    <body>
    
    {% cache 5 suij %}
       {{ t }}
    {% endcache %}
    
    </body>
    </html>
    复制代码

    将缓存保存在Redis

    首先安装Redis缓存软件

    然后安装Django中使用Redis缓存的第三方模块 django-redis

    配置

    复制代码
    #缓存配置
    # 自定义缓存key
    def default_key_func(key, key_prefix, version):
        return '%s:%s:%s' % (key_prefix, version, key)
    
    # 配置:
    CACHES = {
        'default': {
            'BACKEND': "django_redis.cache.RedisCache",     #配置文件引擎
            'LOCATION': "redis://127.0.0.1:6379",                        #配置文件缓存路径
    
            'TIMEOUT': 300,                     # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)如果使用中没设置,这里启用
            'OPTIONS': {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                'MAX_ENTRIES': 300,             # 最大缓存个数(默认300)
                'CULL_FREQUENCY': 3,            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3,删除百分之3)
            },
            'KEY_PREFIX': 'jxiou',                   # 缓存key的前缀(默认空)
            'VERSION': 1,                       # 缓存key的版本(默认1),设置后缓存key会是,KEY_PREFIX前缀加VERSION版本
            # 'KEY_FUNCTION': default_key_func         # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
        }
    }
    复制代码

    配置默认连接池

    配置默认连接池很简单, 你只需要在 CACHES 中使用 CONNECTION_POOL_KWARGS 设置连接池的最大连接数量即可:

    复制代码
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            ...
            "OPTIONS": {
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            }
        }
    }
    复制代码

    更多教程   http://django-redis-chs.readthedocs.io/zh_CN/latest/#id12

    使用同上

  • 相关阅读:
    Trie树详解及其应用
    最长回文字符串_Manacher算法_(O(n))
    设置VisualStudio以管理员身份运行
    wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法
    data:image字符转byte[]
    ID为XXXX的进程当前未运行
    在Windows2003 server 64位系统上使用ArcEngine开发的WCF服务
    关于position的relative和absolute分别是相对于谁进行定位的
    sql语句进行写数据库时,字符串含有'的处理方式
    EF中关于日期字值的处理
  • 原文地址:https://www.cnblogs.com/meng-wei-zhi/p/8183138.html
Copyright © 2020-2023  润新知