Django优化之缓存技术使用

Django 缓存系统

  网站访问效率优化的一大方法,缓存(cache)。缓存针对动态网站起作用居多,动态网站的数据来源于数据库或者其他的存储容器。当请求页面的时候,我们需要首先查询数据,让后动态的渲染数据,当数据量大并且访问频繁的时候,容易导致响应效率变第,服务器压力变大。
  所以,在第一次访问,就将数据库查询的数据先放到一个地方,这个地方可以是内存,数据库,本地当中,然后,之后访问同样的数据的时候,直接访问刚才存放的地方,而不是重新查询,那么这种技术就叫做缓存。

存储缓存常用的方式:

  • memcache缓存
  • 本地缓存
  • 数据库缓存

使用缓存的方式:

  • 视图粒度缓存
  • 路由粒度缓存
  • 页面粒度缓存
  • 全栈粒度缓存
  • 底层缓存接口

1、memcache缓存:
分布式的高速缓存系统,通常用来提高网站的访问速度。
在本地安装memcache服务。
下载解压缓存包,在解压目录下,以管理员身份打开命令行。

memcached.exe -d install

进入windows服务,开启memcache服务
在这里插入图片描述
安装python-memcached
在这里插入图片描述
到global_settings当中复制cache配置结构到自己的settings当中进行配置
在这里插入图片描述
在settings当中配置memcache缓存

# The cache backends to use.
# CACHES = {
#     'default': {
#         'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# 默认使用本地缓存
#     }
# }

# 缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  # 声明使用memcache缓存
        'LOCATION': [
            '127.0.0.1:11211'
        ]  # 配置cache地址
    }
}

使用视图颗粒方式进行memcache缓存

# 导入cache_page页面
from django.views.decorators.cache import cache_page

在这里插入图片描述
在这里插入图片描述
使用路由颗粒方式进行memcache缓存:
在开发过程当中,有可能使用不同的路由指向同一个视图。比如商品的上架和下架功能,不同的路由,指向同一个视图,这个时候就需要针对路由进行缓存

# 导入cache_page页面
from django.views.decorators.cache import cache_page

在这里插入图片描述

2、本地缓存:
将缓存内容保存至内存中,必须要考虑的内存使用情况

# The cache backends to use.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# 默认使用本地缓存
    }
}

3、数据库缓存:

①Redis数据库缓存
需要提前安装的插件

pip install django-redis
pip install redis

本地启动Redis数据库

redis-server.exe redis.windows.conf

在这里插入图片描述
settings配置Redis数据库缓存

# Redis数据库缓存配置
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',  # 声明使用redis数据库缓存
        'LOCATION': [
            'redis://127.0.0.1:6379/1'
        ],  # 配置cache地址
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient'
        }
    }
}

创建对应存放缓存的数据表

python manage.py createcachetable Tab_name

②MySQL或sqlite默认数据库缓存配置
settings配置:

# 使用默认数据库缓存
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 使用Django默认数据库缓存
        'LOCATION': 'cache_table' # 存放缓存的表
    }
}

同样创建存放缓存的数据表

python manage.py createcachetable Tab_name

然后使用路由或视图的方式应用缓存

最后访问使用缓存的视图,触发
注意修改时区为亚洲上海
在这里插入图片描述
在这里插入图片描述

全栈粒度缓存方式

Django 全栈缓存通过缓存配置还有中间件来声明
首先配置settings的中间件,配置的位置必须一首一尾

  • 用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
  • 当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存
  • 请求来了,是从上到下入走中间件;响应的时候是从下到上走中间件。因此,获取页面放在最后,保存页面放最前面
MIDDLEWARE = [
    # 放页面的时候,应该放在最前面
    'django.middleware.cache.UpdateCacheMiddleware',
    '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', #最后
]

Settings当中还需要配置

# 全栈缓存配置,全局缓存
CACHE_MIDDLEWARE_KEY_PREFIX = ''
CACHE_MIDDLEWARE_SECONDS = 600 # 全局缓存时间
 CACHE_MIDDLEWARE_KEY_PREFIX = '' 
		同一个django下当多个网站共享缓存的时候,可以将该配置指向当前网站的识别,
		这个识别通常是域名,也可以是其他可以唯一标识该网站的字符,目的为了防止多
		个网站共享缓存,缓存混淆
CACHE_MIDDLEWARE_SECONDS = 600
	    全局缓存的寿命
局部页面缓存方式
{% load cache %} # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% cache 50 缓存key(别名) %} # 这个图片50s内会在缓存里中取
    <img src="http://pic16.nipic.com/20111006/6239936_092702973000_2.jpg" alt="加载失败">
    {% endcache %}
</body>
</html>
底层缓存接口方式
	set 设置cache 参数:key, value, timeout_seconds
	get 获取 cache 参数:key
	add 添加 cache 参数:key, value, timeout_seconds

例子:

from django.core.cache import cache
def test(request):
    store_data = cache.get("store_data")
    if store_data:
        store_data = store_data
    else:
        data = Store.objects.all()
        cache.set("store_data",data,30)
        # cache.add("store_data", data, 30) #add只会添加一个缓存,不会修改已经存在的缓存
        store_data = data
    return render(request,"store/TestCache.html",locals())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值