前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Express使用服务端缓存

Express使用服务端缓存

作者头像
用户6256742
发布2022-07-06 14:23:43
1.3K0
发布2022-07-06 14:23:43
举报
文章被收录于专栏:网络日志网络日志

Web 应用通常在服务端获取数据库中的数据,然后返回到前端渲染,在对时效性要求不高的数据中大量的请求、频繁的数据库读取会导致服务端压力过大。我们使用Express框架时可以对返回信息进行缓存,在指定时间内进行访问自动返回之前的数据。

Express最主要的插件基础都是使用中间件来完成,本次缓存插件也开发后使用中间件的形式进行使用。使用memory-cache或者lru-cache进行缓存保存。

中间件代码:

memory-cache

代码语言:javascript
复制
import type { NextFunction, Response, Request } from "express";
import mcache from "memory-cache";
const cache = (req: Request, res: any, next: NextFunction) => {
  let key = req.originalUrl || req.url;//以接口路径作为key
  let cachedBody = mcache.get(key);
  //   检测key是否有对应的数据.如果有就直接返回
  if (cachedBody) {
    res.json(cachedBody);
    return;
  } else {
    //复制一个 json函数一个用来取值一个用来返回值
    //重写JSON方法,在路由函数调用JSON方法时获取到需要缓存的数据,然后通过复制的jsonResponse进行返回
    res.jsonResponse = res.json;
    res.json = (value: any) => {
      res.jsonResponse(value);
      mcache.put(key, value, 10000 * 1000);
    };
    next();
  }
};

export default cache;

本项目也正在使用这个插件使用Express+TypeScript编写的缓存中间件,缓存自定义10000秒时间有效。同时使用memory-cache插件进行缓存数据管理。

lru-cache

代码语言:javascript
复制
import type { NextFunction, Response, Request } from "express";
import LRUCache from "lru-cache";
const mcache = new LRUCache({
  max: 200,
  ttl: 1 * 60 * 60 * 1000, // 1小时缓存
});

/** 
 * 缓存中间件
*/
const cache = (req: Request, res: any, next: NextFunction) => {
  let key = req.originalUrl || req.url;//以接口路径作为key
  let cacheData = mcache.get(key);
  //   检测key是否有对应的数据.如果有就直接返回
  if (cacheData) {
    res.json(cacheData);
    return;
  } else {
    //复制一个 json函数一个用来取值一个用来返回值
    //重写JSON方法,在路由函数调用JSON方法时获取到需要缓存的数据,然后通过复制的jsonResponse进行返回
    res.jsonResponse = res.json;
    res.json = (value: any) => {
      res.jsonResponse(value);
     mcache.get(key, value);
    };
    next();
  }
};

export default cache;
export { mcache };

思路:

  1. 定义中间件并且使用路径作为对象的key
  2. 判断是否有缓存,如果有直接返回保存的对象
  3. 如果没有,复制一个res.json函数,之后重写res.json,使得之后的路由函数在调用res.json时我们可以获取到他的值
  4. 使用复制出来的res.json (res.jsonResponse) 返回数据,并且将返回的数据保存在memory-cache中
  5. 在需要缓存的路由中导入,并且挂在中间件的位置上

效果:

第一次(缓存数据):

第二次(读取缓存):

对于缓存插件的选择并不固定,我们可以选择使用周下载量更多的插件:lru-cachel来进行缓存,但是这个插件虽然支持的参数多但是如果只是简单的缓存接口数据使用这个是饭圈没有必要的,memory-cachelru-cache的选择要看具体业务情况而定。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 中间件代码:
  • memory-cache
  • lru-cache
  • 思路:
  • 效果:
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档