第14章 Express性能优化

性能优化是确保 Express 应用在高并发环境下能够高效运行的重要环节。优化得当可以显著提升应用的响应速度和稳定性。本章将详细介绍 Express 应用的各种性能优化方法和技巧。

缓存策略

缓存是提升应用性能的常用手段。它通过存储频繁访问的数据,减少数据库查询和计算的次数,从而提升响应速度。

HTTP 缓存

利用 HTTP 头可以实现浏览器缓存,常用的头字段包括 Cache-ControlETagExpires

app.get('/data', (req, res) => {res.set('Cache-Control', 'public, max-age=3600');  // 缓存1小时res.json({ data: 'some data' });
});
应用级缓存

可以使用内存缓存或外部缓存系统(如 Redis)来缓存数据。在 Express 中,可以使用 memory-cachenode-cache 模块。

npm install memory-cache
const cache = require('memory-cache');app.get('/data', (req, res) => {let data = cache.get('data');if (!data) {data = fetchDataFromDatabase();  // 假设这是一个同步函数cache.put('data', data, 3600 * 1000);  // 缓存1小时}res.json({ data });
});
使用 Redis 缓存

Redis 是一个高性能的键值存储,可以用于缓存数据库查询结果或其他频繁访问的数据。

npm install redis
const redis = require('redis');
const client = redis.createClient();app.get('/data', (req, res) => {client.get('data', (err, data) => {if (data) {return res.json({ data: JSON.parse(data) });}data = fetchDataFromDatabase();  // 假设这是一个同步函数client.setex('data', 3600, JSON.stringify(data));  // 缓存1小时res.json({ data });});
});
负载均衡

负载均衡可以分摊请求到多个服务器上,提升应用的处理能力。常用的负载均衡方案包括 Nginx 和 HAProxy。

使用 Nginx 负载均衡

Nginx 是一个高性能的 HTTP 和反向代理服务器,可以用于负载均衡。

配置 Nginx 负载均衡:

http {upstream myapp {server 127.0.0.1:3000;server 127.0.0.1:3001;}server {listen 80;location / {proxy_pass http://myapp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}
使用 PM2 进行集群管理

PM2 是一个用于 Node.js 应用的进程管理器,支持集群模式,可以充分利用多核 CPU 的性能。

安装 PM2:

npm install pm2 -g

启动应用的集群模式:

pm2 start app.js -i max  // 根据 CPU 核心数启动多个实例
性能监控与分析

性能监控和分析可以帮助识别性能瓶颈,及时发现和解决问题。

使用 New Relic

New Relic 是一个应用性能管理服务,提供详细的性能监控和分析功能。

安装 New Relic:

npm install newrelic

配置 New Relic:

// 在应用的入口文件(如 app.js)中添加以下代码
require('newrelic');

newrelic.js 文件中配置 New Relic:

exports.config = {app_name: ['My Application'],license_key: 'your_license_key',logging: {level: 'info'}
};
使用 Node.js 内置工具

Node.js 提供了一些内置工具,用于性能分析和监控。例如,可以使用 --prof 标志进行性能分析:

node --prof app.js

生成的分析文件可以使用 node --prof-process 工具进行处理和分析:

node --prof-process isolate-0xNNNNNNNNNN-v8.log > processed.txt
使用 Prometheus 和 Grafana

Prometheus 是一个开源的监控系统,可以与 Grafana 结合使用,提供强大的监控和可视化功能。

安装 Prometheus 客户端:

npm install prom-client

在 Express 应用中集成 Prometheus:

const client = require('prom-client');
const collectDefaultMetrics = client.collectDefaultMetrics;
collectDefaultMetrics({ timeout: 5000 });app.get('/metrics', (req, res) => {res.set('Content-Type', client.register.contentType);res.end(client.register.metrics());
});

然后可以在 Prometheus 中配置抓取 /metrics 端点的数据,并在 Grafana 中进行可视化。

代码优化

代码优化是性能优化的重要环节,以下是一些常用的代码优化技巧。

使用异步非阻塞代码

Node.js 是单线程的,因此应避免阻塞操作,尽量使用异步非阻塞代码。

// 使用异步非阻塞的方式读取文件
const fs = require('fs');fs.readFile('file.txt', (err, data) => {if (err) throw err;console.log(data.toString());
});
减少中间件的数量

中间件是 Express 的核心,但过多的中间件会影响性能。应尽量减少不必要的中间件,优化中间件的使用顺序。

使用 Gzip 压缩

启用 Gzip 压缩可以显著减少响应体积,提高传输速度。

安装 compression 中间件:

npm install compression

在应用中启用 Gzip 压缩:

const compression = require('compression');
app.use(compression());
优化数据库查询

数据库查询往往是性能瓶颈,应尽量优化查询语句,使用索引,并合理缓存结果。

性能优化是一个持续的过程,涉及缓存策略、负载均衡、性能监控、代码优化等多个方面。通过合理的优化手段,可以显著提升 Express 应用的性能和稳定性。在实际项目中,应根据具体情况选择合适的优化方案,不断监控和改进,以实现最佳的性能表现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dpdk编译安装以及接收udp报文(基于ubuntu)

目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载: DPDK 下载版本:DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…

Python 教程(五):理解条件语句和循环结构

目录 专栏列表前言条件语句if 语句elif 语句else 语句示例 循环结构for 循环while 循环break 和 continue实例演示 循环控制语句range 函数enumerate 函数 模式匹配总结 在前四篇教程中,我们学习了 Python 的基本语法和数据结构。本篇教程,我们将深入探讨…

lua 游戏架构 之 游戏 AI (八)ai_tbl 行为和优先级

定义一系列的AI行为类型和它们的优先级,以及一个映射表ai_tbl来关联每种AI行为类型与对应的脚本文件和优先级。以下是对代码的详细解释: lua 游戏架构 之 游戏 AI (一)ai_base-CSDN博客https://blog.csdn.net/heyuchang666/artic…

【ACM独立出版,高录用】第四届物联网与机器学习国际学术会议(IoTML 2024,8月23-25)

2024年第四届物联网与机器学习国际学术会议(IoTML 2024)将于2024年8月23-25日在中国南昌召开。 会议将围绕着物联网和机器学习开展,探讨本领域发展所面临的关键性挑战问题和研究方向,以期推动该领域理论、技术在高校和企业的发展和…

【全国大学生电子设计竞赛】2022年A题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~

大厂面试:小红书大数据面试题及参考答案(3万字长文)

目录 Hadoop 和 Spark 的区别和优劣 Spark Shuffle 原理,Hash Shuffle 和 Sort Shuffle 线程池,阻塞队列有界无界,救急线程 JVM 内存模型 栈溢出的场景和应对方法 方法区是否能溢出,如果溢出的话储存的那些类信息怎么办 MySQL 索引设计原则 当数据量很大时,count(…

信息收集总结

关注内容 1. 企业股权架构:了解公司的股权结构,确定控股子公司,收集边缘业务系统资产。 2. 网站备案:获取公司的备案信息,包括根域名及其子域名。 3. 对外发布的产品:收集公司公开发布的产品信息&…

剑指Meta?1230 亿参数,Mistral 发布 Large 2 旗舰 AI 模型

7 月 25 日消息,AI 竞赛日益激烈,Meta 公司昨日推出开源 Llama 3.1 模型之后,法国人工智能初创公司 Mistral 也加入了竞争行列,在今日凌晨推出了新一代旗舰模型 Mistral Large 2。 Mistral AI 发布 Mistral Large 2,1…

[算法题]添加字符

题目链接: 添加字符 因为数据量很小, 所以直接两层遍历暴力求解, 依次将字符串 A 与字符串 B 相同位进行比对, 每轮记录当前轮次不相等的位数是几位, 并与历史上记录的比较取小值, 图示: 经过比较后, 题解就为 1, 空白处不用管, 因为题意是可以在开头和末尾添加字符的, 添加与…

c生万物系列(加减乘除模篇)

为了提高c语言的运行效率,我们需要采用更高效的运算,那么切入点就是随处可见的基本运算符合,从底层架构考虑,加减乘除的效率比位运算低很多,为了能够更好迎合CPU的二进制,有必要取代基本的加减乘除以及求余…

【“微软蓝屏”事件暴露了网络安全哪些问题?】建设安全稳固的网络基础设施

目录 前言一、软件更新流程中的风险管理和质量控制机制(一)测试流程及风险识别(二)风险管理策略(三)质量控制措施 二、预防类似大规模故障的最佳方案或应急响应对策(一)冗余系统设计…

2024最火的知识付费系统小程序+PC+H5三端数据互通支持采集资源开源版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统含带 裂变模式 可以助力好友来获取资源共享 分站功能 独立后台 会员功能 卡密功能 二级分销功能等 自行研究看 后期有更新新版会在持续发布 目前版本是3.5 是我花三天时间修复的 …

科研论文之Word论文编辑

这篇文章介绍在word中怎么编辑论文,包括论文的模板、论文的字体设置、论文的插图、论文的参考文献等等。 为便利知识传播,我的所有文章都不会设置收费专栏。但文章写作不易,如有可能麻烦打赏一下,金额随意。收款码见下图&#xff…

《程序猿入职必会(5) · CURD 页面细节规范 》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

nodejs - MongoDB 学习笔记

一、简介 1、MongoDB 是什么 MongoDB 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/ 2、数据看是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序。 3、数据库的作用 主要作用是 管理数据…

RedHat9 | Ansible 编写循环和条件任务

环境版本说明 RedHat9 [Red Hat Enterprise Linux release 9.0]Ansible [core 2.13.3]Python [3.9.10]jinja [3.1.2] 1. 利用循环迭代任务 通过利用循环,管理员无需编写多个使用同一模块的任务。Ansible支持使用loop关键字对一组项目迭代任务,通过配置…

音视频入门基础:WAV专题(3)——FFmpeg源码中,判断某文件是否为WAV音频文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.wav 可以判断出某个文件是否为WAV格式的音频文件: 所以FFmpeg是怎样判断出某个文件是否为WAV格式的音频文件呢?它内部其实是通过wav_probe函数来判断的。从文章《FFmpeg源码:av_prob…

Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附水印

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)

注:另一种方式参考 关于TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前,我们可以先了解一下什么是序列化与反序列…

关于Redis持久化和集群模式(主从,哨兵,去中心化)使用和介绍

持久化: 持久化介绍 把内存中的数据存储到磁盘的过程。同时也可以把磁盘中的数据加载到内存中 持久化实现 redis实现持久化的方式提供了两种: RDB快照模式,数据备份和恢复速度快。 缺点: 数据完整性差。数据可能丢失多。 AOF日志追加: 数据完整性高。 缺点: 数据备…