Django缓存

缓存

Django 是动态Web后台框架,需要实时生成用户访问的页面,进行多次的数据库操作,但是多次的数据库访问操作对于整个Web系统来说,会影响效率,尤其是当访问量增大时,数据库的压力也会越来越大。

相对于磁盘及内存操作,数据库的访问操作付出的成本要大的多

浏览器第一次请求时,cache会缓存单个变量或整个网页等内容到硬盘或者内存中,同时设置response头部

当浏览器再次发起请求时,会与缓存中的过期时间相比较,如果缓存时间比较新,则会重新请求数据,并缓存起来然后返回response给客户端,如果缓存没有过期,则直接从缓存中提取数据,返回给response给客户端

Cache-Control

HTTP协议头Cache-ControlCache-ControlExpires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires

缓存引擎

  • django默认通过本地内存进行缓存,同时包括如下其他的一些
arduino 复制代码
'django.core.cache.backends.db.DatabaseCache'
'django.core.cache.backends.dummy.DummyCache'
'django.core.cache.backends.filebased.FileBasedCache'
'django.core.cache.backends.locmem.LocMemCache'
'django.core.cache.backends.memcached.MemcachedCache'
'django.core.cache.backends.memcached.PyLibMCCache'

Memcached设置

  • memcached为例

python中使用memcached需要我们额外安装memcached作为memcache客户端的支持

shell 复制代码
pip3 install python-memcached -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 安装memcached
python 复制代码
apt-get install memcached # debian
yum install memcached # centos 
  • 配置文件:/etc/memcached.conf

配置文件中有两个可能需要修改的参数

python 复制代码
-m 64 #memcached所能使用的内存大小
-l 127.0.0.1 #监听的IP地址
  • 开启|关闭memcached服务
shell 复制代码
systemctl start memcached # 开启
systemctl stop memcached # 关闭
  • 查看服务状态
python 复制代码
systemctl status memcached
  • settings配置

在项目的settings文件下进行配置

python 复制代码
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',  
        # 指定缓存使用的引擎
        'LOCATION':'172.16.19.26:11211', 
        # 指定缓存服务器地址,常为本机地址
    }
}

视图缓存

可以只为某些视图函数进行缓存

使用django.views.decorators.cache下的装饰器cache_page进行视图函数装饰即可

python 复制代码
from django.views.decorators.cache import cache_page
  • 模型类的表代码
python 复制代码
class People(models.Model):
    name = models.CharField(max_length=20,verbose_name='名字')
  • 视图函数代码
python 复制代码
from django.views.decorators.cache import cache_page

@cache_page(10) # 缓存10秒
def index(request):
    print('视图函数被调用')
    ss = models.People.objects.all()
    return render(request, 'index.html', locals())
  • 模板页面代码
jinja2 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>展示数据</title>
</head>
<body>
    {% for s in ss %}
        <li>{{ s.name }} </li>
    {% endfor %}
</body>
</html>

在第一次刷新浏览器之后,立即在数据库中添加一个新的数据对象

接着继续刷新浏览器,前端页面将会读取缓存中的结果,而不会显示刚才添加的用户

除了在视图函数上使用装饰器进行缓存设置,还可以在路由匹配部分使用相同装饰器函数进行设置

python 复制代码
path('',cache_page(60 * 15)(my_view)),

全站缓存

将整站所有视图设置缓存,需要在配置文件的中间件设置首尾部分添加如下内容

python 复制代码
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware', # 首部要添加的中间件
    # 将response缓存起来 
    'django.middleware.security.SecurityMiddleware',
	...
    'django.middleware.cache.FetchFromCacheMiddleware',# 尾部要添加的中间件
    # 将缓存的response取出来
]
  • 设置当前全站缓存有效时间的全局变量
python 复制代码
CACHE_MIDDLEWARE_SECONDS = 10 # 每页页面缓存的秒数,默认为600

局部缓存

局部缓存主要为在模板页面,选择某个区域进行缓存,当用户再次访问相同页面时,如设置缓存未过期,则渲染时局部缓存不会重新生成

jinja2 复制代码
{% load cache %}
	局部缓存首先需要加载cache标签
	
{% cache sec key %}
{% endcache %}

以时间模板变量为例,做一个简单的测试,后台视图函数每次在访问时,返回当前时间

python 复制代码
import time 
now = time.strftime('%H:%M:%S', time.localtime())

模板页面在使用时的代码

jinja2 复制代码
{% load cache %}

<p>这里是未缓存的时间:{{ now }}</p>
{% cache 10 time %}
<p>这里是缓存的时间:{{ now }}</p>
{% endcache %}

手动缓存

除了以上应用于各个业务中的缓存方式,还可以使用django所提供的cache接口进行缓存设置以及获取

  • 设置缓存
python 复制代码
from django.core.cache import cache
#存储缓存数据
cache.set('cache_key',data,60*15)
#cache_key为存储在缓存中的唯一值,data为存储的数据,60*15为缓存有效时间
  • 获取缓存
python 复制代码
#获取缓存数据
cache.get('cache_key','获取不到的默认值')
#cache_key为储存缓存数据的唯一值
  • 避免key值重复导致更新缓存,可以使用cache.add函数,基本用法与set相同
python 复制代码
status = cache.add('add_key', 'New value')
# 当指定key值的缓存存在,add方法不会尝试更新缓存
# 返回值status为True时,代表存储成功,False代表存储失败
  • 清除缓存,通过cache.delete方法,该方法接收一个缓存key
python 复制代码
cache.delete('cache_key')
  • 清空缓存,通过cache.clear方法,直接从缓存中清除所有
python 复制代码
cache.clear()

  • 注意memcached不允许使用超过250个字符或包含空格或控制字符的缓存键值;使用这样的键值将会导致异常
相关推荐
强化生物科研小助手11 小时前
CAS:47623-98-3,DiSBAC2(3)一种慢反应的膜电位敏感探针
django·html·pygame
橘猫云计算机设计14 小时前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
程序员一诺17 小时前
【Django开发】前后端分离django美多商城项目第15篇:商品搜索,1. Haystack介绍和安装配置【附代码文档】
后端·python·django·框架
小狗很可爱1 天前
视图函数的应用
django
麦麦大数据1 天前
neo4j+django+deepseek知识图谱学习系统对接前后端分离前端vue
vue.js·django·知识图谱·neo4j·deepseek·在线学习系统
兔子的洋葱圈1 天前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
爱摄影的程序猿2 天前
如何基于 Django-Vue-Admin 快速二次开发?高效后台管理系统实战指南(附完整代码)
vue.js·python·django
橘猫云计算机设计2 天前
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·小程序·django·毕业设计
靠近彗星2 天前
基于 Vue + Django + MySQL 实现个人博客/CMS系统
前端·vue.js·python·mysql·django
橘猫云计算机设计3 天前
基于ssm的食物营养成分数据分析平台设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
后端·python·信息可视化·数据挖掘·数据分析·django·毕业设计