广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >Node.js中怎么利用中间件实现服务端缓存
  • 119
分享到

Node.js中怎么利用中间件实现服务端缓存

2024-04-02 19:04:59 119人浏览 泡泡鱼
摘要

node.js中怎么利用中间件实现服务端缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。关于服务端缓存缓存已经被广泛应用,来提高页面性能。一

node.js中怎么利用中间件实现服务端缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

关于服务端缓存

缓存已经被广泛应用,来提高页面性能。一说到缓存,可能读者脑海里马上冒出来:“客户端缓存,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.

因此,下面展示的 demo 在***次请求到达时,服务端耗费5秒来返回  html;而接下来再次请求该页面,将会***缓存,不过是哪个用户访问,只需要几毫秒便可得到完整页面。

Show me the code & Demo

其实上文提到的缓存概念非常简单,稍微有些后端经验的同学都能很好理解。但是这篇文章除去科普基本概念外,更重要的就是介绍 Express  中间件思想,并自己来实现一个服务端缓存中间件。

让我们开工吧!

最终 Demo 代码,欢迎访问它的GitHub地址。

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

'use strict'  var mcache = require('memory-cache');  var cache = (duration) => {   return (req, res, next) => {     let key = '__express__' + req.originalUrl || req.url     let cachedBody = mcache.get(key)     if (cachedBody) {       res.send(cachedBody)       return     } else {       res.sendResponse = res.send       res.send = (body) => {         mcache.put(key, body, duration * 1000);         res.sendResponse(body)       }       next()     }   } }

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

  • 当它(cache key)及其对应的 value 值存在时,便直接返回其 value 值;

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

缓存的有效时间是10秒。

最终在判断之外,我们的中间件把控制权交给下一个中间件。

最终使用和测试如下代码:

app.get('/', cache(10), (req, res) => {   setTimeout(() => {     res.render('index', { title: 'Hey', message: 'Hello there', date: new Date()})   }, 5000) //setTimeout was used to simulate a slow processing request })

我使用了 setTimeout 来模拟一个超长(5s)的操作。

打开浏览器控制面板,发现在10秒缓存到期以内:

Node.js中怎么利用中间件实现服务端缓存

至于为什么 cache 中间件要那样子写、next() 为什么是中间件把控制权传递,我并不打算展开去讲。有兴趣的读者可以看一下 Express  源码

还有几个小问题

仔细看我们的页面,再去体会一下实现代码。也许细心的读者能发现一个问题:刚才的实现我们缓存了整个页面,并将 date: new Date() 传入了  jade 模版 index.jade 里。那么,在***缓存的条件下,10秒内,页面无法动态刷新来同步,直到10秒缓存到期。

同时,我们什么时候可以使用上述中间件,进行服务端缓存呢?当然是静态内容才可以使用。同时,PUT, DELETE 和 POST  操作都不应该进行类似的缓存处理。

同样,我们使用了 npm 模块:memory-cache,它存在优缺点如下:

  • 读写迅速而简单,不需要其他依赖;

  • 当服务器或者这个进程挂掉的时候,缓存中的内容将会全部丢失。

  • memcache 是将缓存内容存放在了自己进程的内存中,所以这部分内容是无法在多个 node.js 进程之间共享的。

如果这些弊端 really matter,在实际开发中我们可以选择分布式的 cache 服务,比如 Redis。同样你可以在 npm  上找到:express-redis-cache 模块使用。

看完上述内容,你们掌握Node.js中怎么利用中间件实现服务端缓存的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网VUE频道,感谢各位的阅读!

--结束END--

本文标题: Node.js中怎么利用中间件实现服务端缓存

本文链接: https://www.lsjlt.com/news/74210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js中怎么利用中间件实现服务端缓存
    Node.js中怎么利用中间件实现服务端缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。关于服务端缓存缓存已经被广泛应用,来提高页面性能。一...
    99+
    2022-10-19
  • Spring Boot中怎么利用Redis 实现缓存操作
    这期内容当中小编将会给大家带来有关Spring Boot中怎么利用Redis 实现缓存操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存的应用场景二、更新缓存的策略三、运行 springboot-...
    99+
    2023-06-17
  • thinkphp中怎么利用redis实现秒杀缓存功能
    thinkphp中怎么利用redis实现秒杀缓存功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1,安装redis,根据自己的php版本安装对应的redis扩...
    99+
    2023-06-19
  • SpringBoot2 中怎么利用Redis数据库实现缓存管理
    SpringBoot2 中怎么利用Redis数据库实现缓存管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Redis简介Spring Boot中除了对常用...
    99+
    2023-06-02
  • node.js怎么使用express-fileupload中间件实现文件上传
    本篇内容介绍了“node.js怎么使用express-fileupload中间件实现文件上传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本...
    99+
    2023-06-17
  • SpringBoot2中怎么利用FastDFS 中间件实现文件分布式管理
    本篇文章给大家分享的是有关SpringBoot2中怎么利用FastDFS 中间件实现文件分布式管理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、FastDFS作用FastD...
    99+
    2023-06-02
  • Node.js中怎么利用JXcore实现打包
    本篇文章给大家分享的是有关Node.js中怎么利用JXcore实现打包,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Node.js JXcor...
    99+
    2022-10-19
  • 在vue移动端项目中怎么实现页面缓存
    这篇文章主要介绍在vue移动端项目中怎么实现页面缓存,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景在移动端中,页面跳转之间的缓存是必备的一个需求。例如:首页=>列表页=>详情页。从首页进入列表页,列表...
    99+
    2023-06-14
  • odoo中怎么使用redis实现缓存
    本篇内容主要讲解“odoo中怎么使用redis实现缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“odoo中怎么使用redis实现缓存”吧!Odoo中使用Redis实现缓存可以提高系统性能,避...
    99+
    2023-07-05
  • 利用Python中SocketServer 实现客户端与服务器间非阻塞通信
    利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in)类挂...
    99+
    2022-06-04
    客户端 通信 服务器
  • node.js中怎么利用postman模拟HTTP服务器与客户端交互
    这篇文章给大家介绍node.js中怎么利用postman模拟HTTP服务器与客户端交互,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、node搭建HTTP服务器node中使用 http 模块来创建 HTTP 服务器,...
    99+
    2023-06-20
  • golang Gin上传文件返回前端及中间件怎么实现
    这篇文章主要介绍“golang Gin上传文件返回前端及中间件怎么实现”,在日常操作中,相信很多人在golang Gin上传文件返回前端及中间件怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-30
  • node.js中怎么利用流实现读写同步
    node.js中怎么利用流实现读写同步,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。如下所示://10个数 10个字节,每次读4...
    99+
    2022-10-19
  • 怎么在Android中利用SharedPreferences实现存储
    怎么在Android中利用SharedPreferences实现存储?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SharedPreferences 特点即便是...
    99+
    2023-05-31
    android sharedpreferences roi
  • 怎么在Html5中实现应用程序缓存
    这篇文章给大家介绍怎么在Html5中实现应用程序缓存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、作用离线浏览 - 根据文件规则把资源缓存在本地,脱机依然能够访问资源,联网会直接使用缓存在本地的文件。优化加载速度,...
    99+
    2023-06-09
  • vue中怎么实现服务端渲染
    本篇文章为大家展示了vue中怎么实现服务端渲染,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、什么是服务端渲染客户端请求服务器,服务器根据请求地址获得匹配的组件,...
    99+
    2022-10-19
  • SQLServer中怎么利用存储过程实现单条件分页
    SQLServer中怎么利用存储过程实现单条件分页,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SQLServer Proced...
    99+
    2022-10-18
  • Java中怎么利用HBase实现客户端编程
    这篇文章将为大家详细讲解有关Java中怎么利用HBase实现客户端编程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 准备工作下载后安装jdk包(这里使用的是jdk-6u10-rc2-b...
    99+
    2023-06-17
  • Oracle中怎么利用Openfiler实现共享存储
    这期内容当中小编将会给大家带来有关Oracle中怎么利用Openfiler实现共享存储,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、root用户,rac1、rac2关...
    99+
    2022-10-18
  • Android中怎么利用SharedPreference实现数据储存
    今天就跟大家聊聊有关Android中怎么利用SharedPreference实现数据储存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。不同于文件形式的存储方式,SharedPrefe...
    99+
    2023-06-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作