缓存

12003

1、概念

  • 为什么要加速

在软件开发中,加速通常指的是通过各种手段提高系统或应用程序的性能。性能问题可能源自数据处理速度慢、网络传输延迟、复杂的计算过程等多个方面。通过缓存加速,可以有效地解决一些性能瓶颈,提高系统的响应速度和整体性能。

  • 加速的优点

    • 加快网站的访问速度:前后端资源加速可以缩短用户访问页面的时间,加快页面的加载速度,提高用户体验,保留用户的访问流量。

    • 减少服务器负担:通过前后端资源加速,可以减少服务器的负担和网络带宽的消耗,避免因为文件过大导致服务器崩溃。

    • 提高安全性:通过前后端资源加速,可以将一些静态资源放到CDN加速节点上,并使用HTTPS协议进行加密传输,进一步提高访问安全性。

    • 节省成本和提高可扩展性:通过前后端资源加速,可以采用CDN网络来加速资源的传输,而CDN网络对于大型应用来说,不仅能够提高访问速度,而且还能够将大量的流量转移到CDN节点,避免造成服务器带宽压力,同时也能够节约服务器成本和提高应用的可扩展性。

2、主要的加速点

  • 前端静态资源

    • 通过 CDN 分发:将静态资源(如图片、样式表、JavaScript 文件)存储在全球各地的 CDN 节点上,使用户可以从距离更近的节点获取资源,提高加载速度。

    • 文件压缩和合并:对前端的静态资源进行压缩和合并,减小文件体积,加速传输和加载速度。

    • 使用缓存:通过浏览器缓存和服务端缓存策略,减少重复请求,提高访问速度。

  • 网络通道加速

    • 使用 HTTPS:采用 HTTPS 协议进行安全传输,同时利用 HTTP/2 协议的多路复用特性,减少连接数,提高并发访问速度。

    • DNS 解析优化:合理配置 DNS 解析,选择性地使用更快的 DNS 服务器,减少域名解析时间。

    • TCP 连接优化:调整 TCP 连接参数,如调整 TCP 拥塞控制算法,优化网络传输效率。

  • 后端数据缓存加速

    • 数据库缓存:使用缓存技术,将频繁查询的数据存储在缓存中,减少对数据库的访问,提高数据获取速度。

    • 结果集缓存:对一些计算成本较高的结果集,采用缓存策略,减少计算时间,提高响应速度。

    • 使用缓存中间件:引入缓存中间件,如 Redis、Memcached,提供高速、可扩展的缓存服务,加速数据获取和存储。

这些加速点覆盖了前端资源、网络通道和后端数据处理的多个方面,综合应用可以显著提升整体系统性能。

3、静态资源缓存加速

前端静态资源缓存加速可以提高页面加载速度、减少服务器负载和带宽消耗,下面介绍几种常见的方式。

  • 加速方式
  1. 修改HTTP响应头:在HTTP响应头部加入Expires和Cache-Control字段告诉浏览器和CDN缓存服务器该资源缓存的过期时间或者缓存策略。当资源在缓存有效期之内,浏览器或CDN缓存服务器就会发起一个304 Not Modified响应来从缓存中取得该资源。

  2. 版本号文件名:以文件版本号作为文件名,如果文件内容变化,文件名就变化,这样可以使浏览器重新获取该资源,避免使用过期的资源。例如:

    1. <link href="style.css?version=1.1" rel="stylesheet">
  3. 本地缓存:在用户本地使用localStorage或sessionStorage本地存储静态资源,下次访问时直接从本地缓存读取,加快页面访问速度。

  4. 预加载:在页面加载时使用link标记的rel属性为preload的来预加载静态资源,使后续的资源请求能够更快地完成。

  5. CDN加速:借助CDN缓存服务器来加速静态资源的传输,提高页面访问速度,减少带宽消耗

  • JianghuJs前端加速

    有两种方式:分别为通过Egg的框架配置和NPM包egg-static-cache。

  1. 通过Egg的框架配置
  • 在config/config.default.js中增加配置:
  1. // config.default.js
  2. const path = require('path');
  3. static: {
  4. dynamic: true,
  5. preload: false,
  6. maxAge: 31536000,
  7. buffer: true,
  8. dir: [
  9. { prefix: `/${appId}/public/`, dir: path.join(appInfo.baseDir, 'app/public') },
  10. { prefix: `/${appId}/public/`, dir: path.join(eggJianghuDir, 'app/public') },
  11. ],
  12. },

其中,maxAge表示静态资源的缓存时间(单位是秒),prefix表示前缀,dir表示静态资源的目录,dynamic表示是否开启缓存,preload表示是否在启动时预加载缓存,maxFiles表示缓存文件的个数上限,buffer表示是否缓存到内存中。

  1. // plugin.js
  2. exports.static = true;
  • enable表示是否开启缓存
  1. NPM包egg-static-cache
  • 安装egg-static-cache依赖包:

    1. npm install egg-static-cache --save
  • 在config.default.js中增加配置:

    1. // config.default.js
    2. exports.staticCache = {
    3. maxAge: 31536000,
    4. dynamic: true,
    5. prefix: '/public/',
    6. gzip: true,
    7. };
  • 在plugin.js中加入启用egg-static-cache的配置:

    1. // plugin.js
    2. exports.static = true;
    3. exports.staticCache = {
    4. enable: true,
    5. package: 'egg-static-cache',
    6. };
  • enable表示是否开启缓存,package表示依赖的NPM包名称。

  • 在Router中指定静态资源的访问:

  1. // Router.js
  2. app.router.get('/public/(*)', app.controller.home.resources);
  • 在Controller中实现前端资源缓存:
  1. // Controller.js
  2. const staticCache = require('egg-static-cache');
  3. async resources() {
  4. const { app, ctx } = this;
  5. await staticCache(app, ctx, {
  6. prefix: '/public/'
  7. })
  8. }

4、数据缓存加速

  • JianghuJs后端加速(_cache)

JianghuJs框架为减重,避免引入redis等中间件,所以使用缓存表来解决数据的缓存问题,用户可自行拓展使用。

  • 使用方式:

用户可使用定时任务或其他方式把数据经过一系列加工处理后存入_cache表,用户可直接获取使用。

  • 表设计
  1. CREATE TABLE `_cache` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `userId` varchar(255) NOT NULL COMMENT '用户Id',
  4. `content` longtext COMMENT '缓存数据',
  5. `recordStatus` varchar(255) DEFAULT 'active',
  6. `operation` varchar(255) DEFAULT 'insert' COMMENT '操作; insert, update, jhInsert, jhUpdate, jhDelete jhRestore',
  7. `operationByUserId` varchar(255) DEFAULT NULL COMMENT '操作者userId',
  8. `operationByUser` varchar(255) DEFAULT NULL COMMENT '操作者用户名',
  9. `operationAt` varchar(255) DEFAULT NULL COMMENT '操作时间; E.g: 2021-05-28T10:24:54+08:00 ',
  10. PRIMARY KEY (`id`)
  11. ) ENGINE = InnoDB COMMENT = '缓存表';