django(11)、缓存

必要性

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

缓存过程

通用设置

  • 1、设置中间件:
# settings.py
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 必须设置在第一个位置 
    'django.middleware.cache.FetchFromCacheMiddleware', # 必须设置在最后一个位置
]
  • 2、
CACHE_MIDDLEWARE_ALIAS = 'default'    # 用来存储的缓存别名
CACHE_MIDDLEWARE_SECONDS = 0  # 所有页面默认缓存时间,默认600

# 关键的前缀,当多个站点使用同一个配置的时候,这个可以设置可以避免发生冲突,一般设置为网站域名
CACHE_MIDDLEWARE_KEY_PREFIX ='www.demo.com' 
     
# 那么只有匿名的请求会被缓存,这是一个禁用缓存非匿名用户页面的最简单的做法,注意确保已经启用了Django用户认证中间件
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False 

按照存储位置的六种缓存方式

  • 1、内存中缓存,内容以字符串形式存储在内存中, 但是位置无法确定,这个缓存是多进程和线程安全的:

    # setting.py
    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)
            },
    
        }
    }
  • 2、文件中缓存,保存至指定的文件,注意是绝对位置(从根目录开始),必须保证服务器对你列出的路径具有读写权限:

    CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache', # 需要指定文件夹路径
            }
        }
  • 3、数据库中缓存:

    # 先执行创建表命令 python manage.py createcachetable
    # 默认会创建my_cache_table,当然也可以指定缓存表
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_table', # 数据库表
        }
    }
  • 4、Memcache缓存(python-memcached模块)

    CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': '127.0.0.1:11211',  # 类似于连接远程缓存服务器
            }
        }
    
     CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': [
                    # 支持简单的分布式,将数据分别存储在多个内存中, 防止其中一个缓存清空
                    '172.19.26.240:11211',  
                    '172.19.26.242:11211',
                ]
            }
    }
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': 'unix:/tmp/memcached.sock',
        }
    }   

按照缓存的使用范围分类

  • 1、全栈缓存
    • url经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware 获取内容并返回给用户
    • 当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存。
    CACHE_MIDDLEWARE_SECONDS = 5  # 连续多次请求,每隔5s就会进行数据库操作
  • 2、单独视图实现缓存,例如某些静态页面可以使用此方法:

    # 方式一:
    from django.views.decorators.cache import cache_page
    
    # 参数为更新的时间(s)
    @cache_page(60 * 15)
    def my_view(request):
        ...
    
    
    
    # 方式二:
    from django.views.decorators.cache import cache_page
    
    urlpatterns = [
        url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
    ]
  • 3、页面的局部更新:
    • 例如购物网站中商品信息和价格都需要要实时更新,但是剩余数量一般都需要实时更新。
    • 利用模板局部缓存时候,请求会进行数据库相关操作,唯一不同的是,在更新时间内不会将数据渲染到模板中而已。
    <!DOCTYPE html>
    # 在模板中导入内置的中间件
    {% load cache %}
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>主页面</title>
    </head>
    <body>
        <h1>主界面</h1>
    
        {% cache 3 '局部刷新' %}
            {% for user in user_list %}
                {{ user.name }}
            {% endfor %}
        {% endcache %}
    
    </body>
    </html>

测试

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

猜你喜欢

转载自www.cnblogs.com/fqh202/p/9448053.html
今日推荐