django xadmin自定义页面_网站中的缓存技术是什么?以Django为例轻松来学习!

093e612e42e6873b5d7439d4531751e4.png

动态资源与静态资源

现在的网站,基本上都是动态网站,网站上的页面内容,都是动态实时生成的。

例如下图的股票信息页面,需要不断把最新的股票数据,在页面上进行显示。

056e460d1dc868633ad4192bc1c9fb1c.png

我们可以简要分析下这种动态内容页面的背后的运行原理:

一般情况下,当用户请求这样一个页面时,服务器需要从数据库中查找相应的数据。

再把数据实时计算渲染 成html页面,然后响应给用户(客户端)。

这种需要服务器实时读写数据计算渲染的页面,被称为网站的动态资源

动态资源,自然就会有静态资源

一些不需要数据库读写,也不需要服务端程序处理与渲染的HTML页面Javascript文件CSS文件,以及图片二进制文件,被称为静态资源

从以上的描述的过程可看出:常见情况下,请求动态资源占用的服务器资源是要比静态资源要多的。

对于一些访问频率很高的动态资源,每次被请求都要实时的读写数据与运算的话,会给服务器资源造成较大的压力,直接影响到服务器的性能页面响应速度。

093e612e42e6873b5d7439d4531751e4.png

网站缓存技术的原理

网站缓存技术就是就为了解决访问动态资源占用服务器资源较多的情形而发明的。

其实这个技术的原理很简单:

既然动态资源是实时生成的,那么能不能把这些动态资源的数据保存起来呢?

下次再有同样的请求,直接把保存的数据进行返回,而不是重复的去操作数据库以及计算/渲染,这样对系统的资源会占用少很多,响应速度也会加快。

这就是缓存的原理!

说白了,就是服务端学会了“偷懒”,同样的请求,不再实时的吭哧吭哧的费力算出来,直接用之前已经生成好的结果进行应付啦。

是不是相当的机智!

942075218c34e18d4717a3771b20118a.png

但是,缓存虽好,也不要贪杯。

因为缓存是把之前计算出的数据结果保存起来,下次请求的时候再进行返回,所以有些对数据的实时性要求较高的数据,就不能缓存了。

还是以上面的股票信息页面为例:

投资者想实时的获取当前的股票价格等信息,股票价格是实时波动的(秒秒钟几千万上下啊)。

要是使用缓存,把之前旧的价格数据展示给用户,估计用户那得抓狂。

所以缓存也不能滥用,要根据场景合理使用(偷懒也是个技术活,玩得不好是容易遭雷劈的o(╥﹏╥)o)!

093e612e42e6873b5d7439d4531751e4.png

缓存使用技术的常见场景

哪些场景适用于缓存技术?一般来讲满足如下情况就可以考虑使用缓存:

  1.    展示信息的实时性要求不高

  2.    涉及到对数据库中数据的大量读取

  3.    页面渲染的计算量比较大

例如,前段时间带着学生做的一个项目,页面中需要使用中国的行政区域信息,生成三级的导航栏(省下面有市、市下面有区县)。这种情况就非常适合使用缓存技术来提升页面渲染的速度。

66ea09695ab59d35d9f81bb2dee5cf27.png

093e612e42e6873b5d7439d4531751e4.png

页面渲染过程分析

我们可以分析下,如果渲染出这样的页面,服务器需要进行的工作。

先说明下,这里没有采用前后端分离的技术,也没有采用ajax请求进行省市区三级联动的效果。

所有的页面内容都是服务端全部渲染好之后返回客户端的(浏览器)。

我们来看下服务端处理页面的过程:

1. 首先服务器需要获取数据库中所有的中国行政区域信息。不多,也就3500+条数据而已.....

2. 拿到区域信息后还要分析3500条区域数据之间的级别关系,比如湖北省下面有哪些地级市、地级市下又有哪些区县…..再将这些数据填入到模板文件中;

3. 然后把模板文件被渲染成HTML文件,以实现三级导航栏的效果…...

实现上述过程服务端的计算量是很大的。网站访问量小还好,访问量上去了肯定hold不住。

好在中国的这些行政区域信息,变动是非常的小,难得调整一次,也就是说数据的实时性不高

所以,这就是一个非常好的可以使用缓存技术的场景。

下文就给大家实际的代码演示。

093e612e42e6873b5d7439d4531751e4.png

Django中的缓存框架

Django框架内置了缓存框架,可以非常的方便的为你的网站项目启用缓存。只需要通过配置文件,就可以指定网站的缓存策略以及缓存数据的保存位置。

Django中允许的缓存数据保存位置有如下几种:

1. Memcached

Memcached是一个完全基于内存的缓存数据库,也是 Django 原生支持的最快、最高效的缓存类型。

2. 数据库缓存

指定某个数据库中某张表作为存储缓存数据。

3. 文件系统缓存

把缓存的数据作为单独的文件进行保存,读取缓存数据也从文件中读。

4. 本地内存缓存

如果在配置文件中没有指定缓存的储存位置,那么将默认使用服务器本地内存缓存。

5. 自定义的缓存后台

如果你想用其它的缓存方式,比如使用Redis数据库来保存缓存数据,也可以自定义缓存后台。 093e612e42e6873b5d7439d4531751e4.png

激活网站的缓存服务

因为本文偏向于原理介绍,所以就先不探讨具体的缓存框架的详细细节(留给后面的文章吧!),为了方便演示,我们本次就采用文件系统的缓存方式。

首先激活网站缓存服务,并且设置缓存数据存储方式为保存到文件。只需要在项目的配置文件:settings.py中加入如下配置项:

CACHES = {     'default': {         'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',         'LOCATION': os.path.join(BASE_DIR, 'cache'),     } }

'default',表明这是网站的默认缓存策略,其中的'BACKEND'项就是用于指定缓存的后端,我们在这里指定使用Django中的内置的FileBasedCache,也就是基于文件的缓存。

'LOCATION' 项则用于指定缓存数据文件放置的路径。

在此我们就指定放在项目根路径下的cache文件夹中。

就是这样的简单的配置,我们就可以开启网站的缓存服务啦!

093e612e42e6873b5d7439d4531751e4.png

对页面应用缓存

在缓存的应用上,Django也提供了多种方式,主要就是以下这几种:

1. 网站全局缓存,将整个网站所有的页面由动态变为静态

2. 单页面缓存,将一个页面进行缓存,页面数据将从缓存中读取。

3. 对页面的局部片段进行缓存。

4. 提供缓存相关API让用户自定义缓存策略。

此次演示我们就用第三种方式:页面的局部片段进行缓存

来到三级区域导航栏的模板文件中,我们只需要使用django内置的template标签 {% cache %}就可以指定模板中的哪个片段内容进行缓存。

首先在模板文件的最上方导入cache标签:

{% load cache %}

找到三级导航栏对应的html代码部分,用 {%cache%}标签进行包裹。

{% cache 24*60*60 'default'  %}     "navbar"             ……        {% endcache %}

{%cache%}标签中有两个参数:

第一个参数为缓存过期时间,单位为秒。

第二个参数为指定使用的缓存策略的名称,也就是我们之前在settings.py文件中配置的‘default’

这样设置好之后,我们等待下开发服务器的重启,然后重新在浏览器访问这个页面。

我们会发现,在项目文件夹下,多了一个cache文件夹,文件夹中就是页面对应缓存数据文件,请见下图:

c2111da17722a759597456d2e6f71fc1.png

只要这条缓存数据还存在过期时间之内,也就是我们在{%cache%}标签中设置的24*60*60 秒,那么导航栏的部分,就不会从数据库中获取数据实时渲染,而是直接从缓存文件中读取已经渲染好的数据。

大家也可以自己做下实验,如果把数据库中某个区域的名称改掉,例如把”昌都地区”改为“昌都”,刷新页面,你会发现页面上还是显示“昌都地区”。

数据库中数据的变更并没有反映在页面上。原因是什么呢?大家可以自己分析一下,其实答案已经在文章之前的部分提到了。

最后,如果你想让数据库中数据的变更,能够显示在页面上,其实也很容易,把项目cache文件夹下的文件直接删掉,再重新请求页面就可以了。

赶紧尝试下,用缓存技术来提升自己网站页面的访问速度吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值