node缓存框架memory-cache

2021-02-11 15:53:08

参考地址 Simple server side cache for Express with Node.js——Express 实现简单的服务器端缓存【翻译】

第一次翻译,不是很好,但大概意思应该还可以。有错误,请多多指正。

    express是我目前为止见过扩展性最好的web框架。它的中间件结构使它可以轻松地以标准化方式添加额外的功能。
    本次主题,我们将会讨论一个很小很简单,但功能非常强大、有用的中间件。它将会帮助你提升你的express Web程序的性能,而且无需任何依赖。

关于服务端缓存


    无论是在 desktop, mobile or web哪一方面,Cache都常被我们用来提升程序性能。当处理web应用程序的时候,虽然可以使用当前所有浏览器都支持的响应头来进行客户端缓存,从而提升页面加载效率。但当一个内容非常繁杂的页面需要2s来进行HTML输出的时候,即使启用客户端缓存该页面,服务器仍然需要针对每一个来访用户进行页面渲染。想想一个大型的新闻门户网站首页,难道他们要针对每一个用户一遍又一遍地处理HTML吗?
    这时候服务器缓存就派上用场了。使用服务器缓存的目标是对相同的客户端请求返回相同的内容。在上面的例子里,第一个请求仍然需要2s处理HTML,但是接下来请求将会命中缓存,服务器可以在几毫秒内发送响应内容。
    有很多种方法可以实现服务器缓存,例如NGINX以及类似于CloudFlare的CDN。在这里,我们将会使用nodejs和express来轻松简便地实现它。

代码展示


    我们的目标是轻松实现服务器缓存。接下来,我们开始吧!
    我们将充分利用 memory-cache npm模块来将内容添加到缓存中。中间件如下:

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()
    }
  }
}12345678910111213141516171819

    它将把请求的url作为key值进行缓存查询。一旦查询到缓存,将会直接发送响应报文。否则,就会在响应报文发送到客户端之前,对响应进行缓存。然后调用下一个中间件。
    这里有一个非常简单的例子——关于如何缓存一个繁重的处理页面。

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
})12345

     注意,上述路由包含两个中间件。一个是关于缓存,另一个是真正用于处理请求的中间件。在这种情况下,当该路由收到第一次请求的时候,将不会立刻返回响应,而是会停留5s。但是在接下来的10s,连续的请求将会直接从缓存中得到响应,而不需要再去等待5s。有得必有失,该方法的缺点在你的响应报文中含有动态内容的时候将会展现出来。在上面的路由中,如果我们将当前时间作为参数传递给视图引擎,那么缓存过期(10s)之前响应内容中都会含有相同的日期。

    这里非常棒的一点就是,以上方法适用于HTML,JSON,XML以及其他任何内容类型的响应。

    你可以轻松地引入该中间件到已存在的站点中,来缓存任何你想要缓存的路由。

    注意:不要缓存 GET  POST 方法

    在这个例子中,我们使用了在内存中缓存内容的NPM模块,这有利有弊。

        - 在内存中缓存速度最快
        - 使用简单,不需要添加额外的依赖。
        - 如果服务器或进程出现故障,缓存将会丢失
        - 由于每个进程在自己的内存区间存储缓存内容,所以Node.js的多个进程之间内存不共享。

    要解决大部分问题的一个选择是使用诸如 Redis 的分布式缓存服务。它可以仅仅通过一个npm 模块 express-redis-cache中间件来实现。

'use strict'var express = require('express');var app = express();var mcache = require('memory-cache');

app.set('view engine', 'jade');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()
    }
  }
}

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
})app.get('/user/:id', cache(10), (req, res) => {
  setTimeout(() => {    if (req.params.id == 1) {
      res.json({ id: 1, name: "John"})
    } else if (req.params.id == 2) {
      res.json({ id: 2, name: "Bob"})
    } else if (req.params.id == 3) {
      res.json({ id: 3, name: "Stuart"})
    }
  }, 3000) //setTimeout was used to simulate a slow processing request
})app.use((req, res) => {
  res.status(404).send('') //not found
})app.listen(3000, function () {  console.log('Example app listening on port 3000!')
})123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051


  • 2019-09-04 16:24:17

    Ubuntu apt-get更换为阿里源

    ​进入阿里巴巴开源镜像页面,找到ubuntu,点击后面的帮助,可以看到类似下面的介绍,加入就好。切记下面的第三步。

  • 2019-09-04 16:32:56

    Ubuntu tar 解压缩命令详解

    tar 解压缩命令详解,这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

  • 2019-09-04 16:50:35

    CMake入门笔记

    Make是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

  • 2019-09-05 20:51:15

    在Android上使用FFmpeg压缩视频

    libavcodec-提供了更加全面的编解码实现的合集 libavformat-提供了更加全面的音视频容器格式的封装和解析以及所支持的协议 libavutil-提供了一些公共函数 libavfilter-提供音视频的过滤器,如视频加水印、音频变声等 libavdevice-提供支持众多设备数据的输入与输出,如读取摄像头数据、屏幕录制 libswresample,libavresample-提供音频的重采样工具 libswscale-提供对视频图像进行色彩转换、缩放以及像素格式转换,如图像的YUV转换 libpostproc-多媒体后处理器

  • 2019-09-05 20:54:21

    在Android 中使用FFmpeg命令

    到这里就可以运行FFmpeg命令了。一直我也是这样使用,但是我在做这个项目Cut的时候发现连续调用多次FFmpeg命令会报错(在项目需要,先改变分镜头的速度,再合成视频)。 为什么会这样的呢?

  • 2019-09-06 10:30:20

    ffmpeg错误码

    AVERROR_BSF_NOT_FOUND = -1179861752 AVERROR_BUG = -558323010 AVERROR_DECODER_NOT_FOUND = -1128613112 AVERROR_DEMUXER_NOT_FOUND = -1296385272 AVERROR_ENCODER_NOT_FOUND = -1129203192 AVERROR_EOF = -541478725 AVERROR_EXIT = -1414092869 AVERROR_FILTER_NOT_FOUND = -1279870712 AVERROR_INVALIDDATA = -1094995529 AVERROR_MUXER_NOT_FOUND = -1481985528 AVERROR_OPTION_NOT_FOUND = -1414549496 AVERROR_PATCHWELCOME = -1163346256 AVERROR_PROTOCOL_NOT_FOUND = -1330794744 AVERROR_STREAM_NOT_FOUND = -1381258232 AVERROR_BUG2 = -541545794 AVERROR_UNKNOWN = -1313558101