上一篇文章: Python--Redis实战:第二章:使用Redis构建Web应用:第四节:数据行缓存
下一篇文章: Python--Redis实战:第三章:Redis命令:第一节:字符串
网站能够从用户的访问、交互、购买行为中收集到有价值的信息。例如:若是咱们只想关注那些浏览量最高的页面,那么咱们能够尝试修改页面的格局、配色甚至是页面上展现的其余连接。每个修改尝试都能改变用户对一个页面或者后续页面的体验,或好或坏,甚至还能影响用户的购买行为。web
前面介绍了若是记录用户浏览过的商品或者用户添加到购物车中的商品、如何经过缓存web页面来减小页面载入时间并提高页面的响应速度。不过遗憾的是,咱们对咱们的网站作的过了火:咱们网站总共包含100 000件商品,而冒然的缓存全部商品页面将耗尽整个网站的所有内存!通过一番调研以后,咱们决定只对其中10 000件商品的页面进行缓存。数据库
前面曾经介绍过,每一个用户都有一个相应的记录用户浏览商品历史的有序集合,尽管使用这些有序集合能够计算出用户最近浏览的商品,但进行这种计算却须要消耗大量的时间。为了解决这个问题,咱们决定在update_token()
函数里面添加一行代码:segmentfault
#更新令牌 import time def update_token(conn,token,user,item=None): timestamp=time.time() #h获取当前时间戳 conn.hset('login:',token,user) #维持令牌与已登录用户之间的映射 conn.zadd('recent:',token,timestamp) #记录领哦哎最后一次出现的时间 if item: conn.zadd('viewed:'+token,item,timestamp) #记录用户浏览郭的商品 conn.zremrangebyrank('viewed:'+token,0,-26) #移除旧的记录,值保留用户最近浏览过的25个商品 #新增下面一行代码 conn.zincrby('viewed:',item,-1)
新增长的代码记录了全部商品的浏览次数,并根据浏览次数对商品进行了排序,被浏览得最多的商品将被放到有序集合的索引0位置上,而且具备整个有序集合最少的分值。随着时间的流逝,商品的浏览次数会呈现两极分化的状态,一些商品的浏览次数愈来愈多,而另外一些商品的浏览次数则愈来愈少。除了缓存最常被浏览得商品以外,程序还须要发现那些变得愈来愈流行的新商品,并在合适的时候缓存他们。缓存
为了让商品浏览次数排行榜可以保持最新,咱们须要按期修剪有序集合的长度并调整已有元素的分值,从而使得新流行的商品也能够在排行榜里面占据一席之地。以前已经介绍过从有序集合里面移除元素的方法,而调整元素分值的动做则能够经过zinterstore命令来完成。zinterstore命令能够组合起一个或多个有序集合,并将有序集合包含的每一个分值都乘以一个给定的数值【用户能够为每一个有序集合分别指定不一样的相乘数值】。每一个5分值,函数就会删除全部排名在20 000名以后的商品,并将删除以后剩余的全部商品的浏览次数减半。服务器
def rescale_viewed(conn): while not QUIT: #删除全部排名在20 000名以后的商品 conn.zremrangebyrank('viewed:',0,-20001) #将浏览次数下降为原来的一半 conn.zinterstore('viewed:',{'viewed:':.5}) #5分钟以后再次执行该操做 time.sleep(300)
经过记录商品的浏览次数,并按期对记录浏览次数的有序集合进行修剪和分值调整,咱们为咱们的网站创建起了一个持续更新的最常浏览商品的排行榜。ide
#判断页面是否须要被缓存 def can_cache(conn,request): #尝试从页面里面取出商品ID item_id=extract_item_id(request) #检查这个页面可否额比缓存以及这个页面是否为商品页面 if not item_id or is_dynamic(request): return False #取得商品的浏览次数排名 rank=conn.zrank('viewed:',item_id) #根据商品的浏览次数排名来判断是否须要缓存这个页面 return rank is not None and rank<10000
经过使用前面介绍的几个函数,咱们的网站如今能够统计商品被浏览的次数,并以此来缓存用户常常浏览的10 000个商品页面。若是咱们想以最少的代价来存储更多的页面,那么能够考虑先对页面进行压缩,而后再缓存到Redis里面;或者使用【Edge Side Includes】计数移除页面中的部份内容;又或者对模板进行提早优化【pre-optimize】,移除全部非必要的空格字符。这些技术可以减小内存消耗并增长Redis可以缓存的页面数量,为访问量不断增加的网站带来额外的性能提高。函数
本章介绍了几种用于下降网站数据库负载和Web服务器负载的方法,这些例子里面介绍的都是真实的Web应用程序当今正在使用的思路和方法。性能
上一篇文章: Python--Redis实战:第二章:使用Redis构建Web应用:第四节:数据行缓存
下一篇文章: Python--Redis实战:第三章:Redis命令:第一节:字符串