Python--Redis实战:第二章:使用Redis构建Web应用:第三节:网页缓存

news/2024/11/9 20:59:31
上一篇文章: Python--Redis实战:第二章:使用Redis构建Web应用:第二节:使用Redis实现购物车
下一篇文章: Python--Redis实战:第二章:使用Redis构建Web应用:第四节:数据行缓存

在动态生成网页的时候,通常会使用模板语言【templating language】来简化网页的生成操作。需要手写每个页面的日子已经一去不复返:现在的Web页面通常由包含首部、尾部、侧栏菜单、工具条、内容域的模板生成,有时候模板还用于生成JavaScript。

尽管【Fake Web Retailer】也能够动态地生成内容,但这个网站上的很多页面实际上并不会经常发生大的变化:虽然会向分类中添加新商品、移除旧商品、有时有特价促销、有时甚至还有【热卖商品】页面,但是在一般情况下,网站只有账号设置、以往订单、购物车【结账信息】以及其他少数几个页面才包含需要每次载入都要动态生成的内容。

假设:通过对浏览数据进行分析,我们发现我们网站所处理的95%的Web页面每天最多只会改变一次,这些页面的内容实际上并不需要动态生成,而我们的工作就是想办法不再生产这些页面。减少网站的动态生成内容上面所花的时间,可以降低网站处理相同负载所需的服务器数量,并让网站的速度变得更快。【研究表明,减少用户等待页面载入的时间,可以增加用户使用网站的欲望,并改善用户对网站的印象。】

所有标准的Python应用框架都提供了在处理请求之前或者之后添加层【layer】的能力,这些层同城被称为中间件【middleware】或者插件【plugin】。我们将创建一个这样的层来调用Redis缓存函数:对于一个不能被缓存的请求,函数将直接生成并返回页面;而对于可以被缓存的请求,函数首先尝试从缓存里面取出并返回被缓存的页面,如果缓存页面不存在,那么函数会生成页面并将其缓存在Redis里面5分钟,最后再将页面返回给调用者。

def cache_request(conn,request,callback):
    if not can_cache(conn,request):
        #对于不能被缓存的请求,直接调用毁掉函数
        return callback(request)
    #将请求转换成一个简单的字符串建,方便之后进行查找
    page_key='cache:'+hash_request(request)
    #尝试查找被缓存的页面
    content=conn.get(page_key)

    if not content:
        #如果页面没有被缓存,那么生成页面
        content=callback(request)
        #将新生成的页面存放到缓存里面
        conn.setex(page_key,content,300)
    return content

对于我们的网站上面95%的可被缓存并且频繁被载入的内容来说,上面缓存函数可以让网站在5分钟之内无须再为它们动态生成视图页面。取决于网页的内容有多复杂,这一改动可以将包含大量数据的页面的延迟值从20~50毫秒降低至查询一次Redis所需的时间:查询本地Redis的延迟值通常低于1毫秒,而查询位于同一数据中心的Redis的延时值通常低于5毫秒。对于那么需要访问数据库的页面来说,这个缓存函数对于减少页面载入时间和降低数据库负载的作用会更加显著。

在这一节中,我们学习了如何使用Redis来减少载入不常该表页面所需的时间,那么对于那些经常发生变化的页面,我们是否也能够使用Redis来减少他们的载入时间呢?

答案是肯定的,接下来我们将介绍实现这一目标的具体做法。

上一篇文章: Python--Redis实战:第二章:使用Redis构建Web应用:第二节:使用Redis实现购物车
下一篇文章: Python--Redis实战:第二章:使用Redis构建Web应用:第四节:数据行缓存

http://www.niftyadmin.cn/n/1978337.html

相关文章

工作组与域网络的特点与区别

一直以来有读者问我,域网络中的“域”到底是什么意思,它与工作组网络相比到底有哪些优势?以及工作网络与域网络各处适用于哪种情况下。其实这个问题非常典型,许多网友并不清楚。在网上也没有一个真正象样的解释,大家可…

磁盘修复与挂载

一次预见本地nfs挂载,server端未启动导致客户端挂载一直挂不上去~ #对磁盘的检修,必须先卸载 fsck /dev/vda1-y 不提示错误,直接修复-t 文件类型fsck -t ext4 -y /dev/vda1 #mount挂载点 mountmount 挂载分区 挂载点-t 类型-o 挂载选…

创建并使用一个地震Content Provider

已经创建了一个应用程序,它能够显示最近的地震列表。现在,你有一个极好的机会来和其它应用程序共享这些信息。 通过一个Content Provider来暴露这些数据,你或其他人都可以创建基于这些数据的应用程序,而不用加倍网络流量和相关的X…

操作dom获取datatable中的某一行的某一列的数据

需求描述&#xff1a;编辑的时候&#xff0c;点击的那一行&#xff0c;进入后台的验证方法&#xff0c;验证通过后&#xff0c;再进入编辑页面&#xff0c;进入的时候需要把本行<tr>数据中的某一列<td>的值传递过去 思路表述&#xff1a;之前我想的是&#xff0c;给…

MES四大市场需求各异

MES四大市场需求各异各个国家和地区对MES需求不尽相同。众所周知&#xff0c;制造业一直追求的三大境界是最短的市场响应时间、最高的产品质量以及最低的生产成本。随着环境的变化&#xff0c;企业追求这三者的方法和所面临的挑战也随之改变。管理的扁平化是对企业的一个内在要…

纯干货!live2d动画制作简述以及踩坑

本文来自网易云社区&#xff0c;转载务必请注明出处。1. 概述live2d是由日本Cybernoids公司开发&#xff0c;通过扭曲像素位置营造伪3d空间感的二维动画软件。官网下载安装包直接安装可以得到两种软件&#xff0c;分别是Cubism Modeler和Cubism Animator&#xff0c;最后我们还…

使用Silverlight Toolkit 等级控件---Rating

乍一看到这个控件&#xff0c;就让我想起了电影里的“悬赏缉拿”的海报。在头像下面有一排星&#xff0c;根据实心星的数目来标识该罪犯的‘危险程度’。其实在一些电影网站上也 有对某部片子打星的功能。而在Silverlight Toolkit 3就是真的提供了这么一个控件&#xff0c;通过…

mysql 开发进阶篇系列 48 物理备份与恢复(xtrabackup 的增量备份与恢复,以及备份总结)...

一.增量备份概述 xtrabackup 和innobackupex 二个工具都支持增量备份&#xff0c;这意味着能复制自上次备份以来更改的数据。可以在每个完整备份之间执行许多增量备份&#xff0c;因此&#xff0c;您可以设置一个备份过程&#xff0c;例如每周一次完整备份和每天一次增量备份…