作家
登录

教你编写Node.js中间件,实现服务端缓存

作者: 来源: 2017-09-07 14:32:03 阅读 我要评论

【编辑推荐】

  1. 基于Node.js的开源博客体系Ghost 宣布1.8.1 版本
  2. JavaScript高等法度榜样设计高等技能
  3. JavaScript运算符规矩与隐式类型转换详解
  4. 最经典的前端面试题之一,你能答出什么幺蛾子?
  5. 早年端小白到技巧专家,这里有3点可履行的建议
【义务编辑:庞桂玉 TEL:(010)68476606】

教你编写Node.js中心件,实现办事端缓存

Express 作为 Node.js 的框架,如今成长可谓如日中天。我很爱好其灵活、易扩大的设计理念。尤其是该框架的中心件架构设计:使得在应用中参加新特点加倍标准化、成本最小化。这篇文┞仿,我会测验测验编写一个异常简单、小巧的中心件,完成办事端缓存功能,进而优化机能。

关于中心件

说到中心件,Express 官网对它的阐述是如许的:

“Express 是一个自身功能极简,美满是路由和中心件构成一个web开辟框架:大年夜本质上来说,一个 Express 应用就是在调用复荡蛐心件。”

也许你应用过各类各样的中心件进行开辟,然则可能并不睬解中心件道理,也没有深刻过 Express 源码,商量其实现。这里并不计算长篇大年夜论帮您分析,然则应用层面上大年夜致可以参考下图:

建议有兴趣、想深刻的读者本身分析,有任何问题迎接与我评论辩论。即便您不计算深刻,也不会影响对下文中心件编写的懂得。

关于办事端缓存

缓存已经被广泛应用,来进步页面机能。一说到缓存,可能读者脑海里立时冒出来:“客户端缓存,CDN 缓存,办事器端缓存......”。另一维度上,也挥蓦到:“200(from cache),expire,eTag......”等概念。

当然作为前端开辟者,我们必定要明白这些缓存概念,这些缓存理念是相对于某个具体用户拜访来说的,机能优化表如今单个用户上。比如说,我第一次打开页面 A,耗时超长,下一次打开页面因为缓存的感化,时光缩短了。

然则在办事器端,还存在别的一个维度,思虑一下如许的场景:

我们有一个静态页面 B,这个页面办事端须要大年夜数据库获取部分数据 b1,根据 b1 又要计算获得部分数据 b2,还得做各类嘉宾杂度操作,最终才能“东拼西凑”出须要返回的完全页面 B,全部过程耗时2s。

那么面对的灾害就是,user1 打开页面耗时2s,user2同样打开页面耗时2s......而这些页面都是静态页面 B,内容是完全一样的。为懂得决这个灾害,这时刻我们也须要缓存,这种缓存就叫先做办事端缓存(server-side cache)。

总结一下,办事端缓存的目标其实就是对于同一个页面请求,而返回(缓存的)同样的页面内容。这个过程完全自力于不合的用户。

膳绫擎的话有些拗口,可以参考英文表达更清楚:

The goal of server side cache is responding to the same content for the same request independently of the client’s request.

为了简单,我应用了请求 URL 作为 cache 的 key:

  • 当它(cache key)及其对应的 value 值存在时,便直接返回其 value 值;
  • 当它(cache key)及其对应的 value 值不存在时,我们将对 Express send 办法做一层拦截:在最终返回前,存入这对 key-value。

是以,下面展示的 demo 在第一次请求达到时,办事端消费5檬攀来返回 HTML;而接下来再次请求该页面,将会射中缓存,不过是哪个用户拜访,只须要几毫秒便可获得完全页面。

总结

Show me the code & Demo

其实上文提到的缓存概念异常简单,稍微有些后端经验的同窗都能很好懂得。然则这篇文┞仿除去科普根本概念外,更重要的就是介绍 Express 中心件思惟,并本身来实现一个办事端缓存中心件。

让我们开工吧!

我将会应用 npm 上 memory-cache 这个包,以便利进行缓存的读写。最终的中心件代码很简单:

  1. 'use strict' 
  2.  
  3. var mcache = require('memory-cache'); 
  4.  
  5. var cache = (duration) => { 
  6.   return (req, res, next) => { 
  7.     let key = '__express__' + req.originalUrl || req.url 
  8.     let cachedBody = mcache.get(key
  9.     if (cachedBody) { 
  10.       res.send(cachedBody) 
  11.       return 
  12.     } else

      推荐阅读

      戴尔曹志平:借助云联盟力量,为用户提供端到端解决方案

    【51CTO.com原创稿件】自客岁戴尔将来就绪中国“随便率性云”计谋和将来就绪企业袈淦联盟正式颁布后>>>详细阅读


    本文标题:教你编写Node.js中间件,实现服务端缓存

    地址:http://www.17bianji.com/lsqh/37212.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)