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

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

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

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

假设:经过对浏览数据进行分析,咱们发现咱们网站所处理的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应用:第四节:数据行缓存
相关文章
相关标签/搜索