zoukankan      html  css  js  c++  java
  • Django学习之十二:Cache 缓存组件

    Django Cache 缓存组件

    在FBV 或 CBV 需要缓存数据,又或者要进行全站缓存(利用中间件),单视图缓存(利用装饰器@cache_page(60 * 5) ),或者在template中使用{% cache 5 content_detail %} xxx {% endcache %} 进行页面局部缓存。这些场景都是需要用到缓存,来提高我们响应用户请求速度的。在django框架中,给我们提供了Cache组件,并暴露出满足以上4中需求的接口,我们只需要配置好我们的缓存引擎源及相关配置,就可以方便使用了。

    博文图片挂了临时解决办法

    缓存逻辑伪代码

    
    given a URL, try finding that page in the cache
    if the page is in the cache:
        return the cached page
    else:
        generate the page
        save the generated page in the cache (for next time)
        return the generated page
    

    配置缓存源

    在配置settings.py中CACHES = {} 字典中, 添加缓存源,key为缓存源的别名,django默认给我们提供了一个默认缓存,并且是LocMemCahce即memcahe作为缓存引擎。当然可以配置多个缓存源,但是'default'只有一个,这个是默认使用的。当然默认的也可以替换,比如现在流行用reids作为默认缓存。

    可配置参数说明

    查看官网: cache配置参数说明, hint 这里!

    01. Django的默认缓存

    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
            'LOCATION': 'unique-snowflake'
        }
     }
    

    该缓存引擎,对每一个进程是一个缓存,所以该缓存时线程安全的。(This cache is per-process (see below) and thread-safe.)
    'LOCATION'设置时用于标识独立的内存存储。如果系统只有一个,那么可以忽略该设置。
    由于时每个进程一个缓存实例,所以如果多线程或多进程,那么缓存的使用上就不是很高效,所以该缓存引擎不是非常适合生产环境,适合dev环境。

    02. 基于Redis的django-redis

    • 安装django-redis
    # 通过pip安装
    >>> pip install django-redis
    # 通过pipenv  安装
    >>> pyenv install django-redis
    
    • 安装django-redis就会依赖安装redis.py
    • 将默认的CACHES设置为django-redis并配置redis-server相关信息
      django-redis连接到redis-server使用的是redis连接池。
      所以django-redis也提供了一个接口,供我们直接从连接池中拿到redis连接,然后使用redis (get_redis_connection('default'));注意这种方式不是django cache组件提供的接口操作redis方式,这种方式是low-level的;而django cache组件则是在low-level基础上封装的更高级的接口,供我们使用。
    • 安装完成django-redis后,配置为默认cache源:
    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': 1000
                },
                # 'PASSWORD': 'xxx', # 如果有设置了redis-server密码在这里设置
            }
        }
    }
    

    03. 自定义cache

    可以查看django_redis.cache.RedisCache 都是继承了from django.core.cache.backends.base import BaseCache ,所以在django中高级的缓存操作都是通过BaseCache中定义的接口。

    所以自定义cache backend 可以通过继承django.core.cache.backends.base.BaseCache 接口,然后实现接口中的方法。就可以将自己的backend配置到django中使用了。

    04. Django其它内置的缓存源,直接开箱使用out-of-the-box

    django内置的cache backend:

    使用cache的示例

    Tips: 通过redis-cli 查看所有库的key统计信息,命令是info keyspace;

    1. cache在视图中示例

    # 引入装饰器装饰视图函数即可缓存视图
    from django.views.decorators.cache import cache_page
    
    • FBV视图缓存
    import time
    from django.views.decoratosr.cache import cache_page
    
    
    @chace_page(60*5)  # 必须设置缓存的更新间隔,单位秒
    def content_detail(request):
       return HTTPResponse('hello' + str(time.time()))
    
    
    • CBV视图缓存
      特别注意:CBV的视图缓存使用cache_page()是放入URLConf中,而不是对get或者post等CBV内的方法进行装饰。

    2. 全站缓存

    在配置文件的中间件列表的首尾分别添加如下中间件:

    
    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        ......
        'django.middleware.common.CommonMiddleware',
        ......
        'django.middleware.cache.FetchFromCacheMiddleware',]
    

    3. 利用模板系统页面部分缓存

    {% load cache %}
    {% cache 500 sidebar %}
        .. sidebar ..
    {% endcache %}
    

    4. low-level api操作缓存

    通过cache对象的api直接操作缓存。

    • 首先,拿到cache对象:
    from django.core.cache import caches  #这是所有设置的cache对象的字典
    from django.core.cache import cache  # 这是”default" 默认的cahce对象
    
    my_cache = caches['mycache']
    my_cache.set('k1', 'abc', 30)  # 设置k1 值为 ’abc' 有效期 30s.
    

    Note: 注意,每个process 获取的 cache instance 都是独立的,不是同一个,为保证线程安全。

    总结

    1. 参考:https://docs.djangoproject.com/en/2.1/topics/cache/#the-per-view-cache
    2. 从cache的backend引擎,将cache抽象出来,定义出cache的接口,实现细节各自引擎处理。
    3. 看到一句话: 抽象比细节活的更长久.
  • 相关阅读:
    细说java平台日志组件
    linux远程执行命令
    linux命令 common 文件比较
    Linux Shell脚本编程--cut命令
    linux sort命令
    shell中if判断一个变量为空
    linux shell if参数
    wc命令
    date 命令
    let 与 expr Shell运算比较 let强强胜出
  • 原文地址:https://www.cnblogs.com/ZJiQi/p/10590217.html
Copyright © 2011-2022 走看看