【RuoYi-Eggjs】:缓存,让你的应用飞起来

简介: 【RuoYi-Eggjs】缓存插件,支持内存、文件、Redis三种存储,提供统一API,开箱即用。通过wrap自动缓存、TTL控制、防雪崩策略,显著提升Egg.js应用性能,助力数据库查询、API响应加速,让系统高效稳定运行。

【RuoYi-Eggjs】:缓存,让你的应用飞起来

前言

在 Web 应用开发中,缓存是提升性能的关键手段。无论是减少数据库查询、加快 API 响应,还是降低服务器负载,缓存都扮演着重要角色。[ruoyi-eggjs-cache](https://github.com/undsky/ruoyi-eggjs-cache) 就是一个为 Egg.js 量身定制的缓存插件,基于强大的 cache-manager 生态,提供了开箱即用的缓存能力。

核心特性

🎯 三种存储方式,按需选择

插件支持三种缓存存储方式,每种都有其独特的使用场景:

1. 内存缓存(Memory)

  • 优势:速度最快,毫秒级响应
  • 劣势:应用重启后丢失,占用内存
  • 适用场景:频繁访问的小数据、临时数据

2. 文件系统缓存(FS)

  • 优势:持久化存储,不占用应用内存
  • 劣势:读写速度相对较慢
  • 适用场景:大数据缓存、需要持久化的数据

3. Redis 缓存(推荐)

  • 优势:速度快、持久化、支持分布式
  • 劣势:需要额外的 Redis 服务
  • 适用场景:生产环境、集群部署、多实例共享数据

🔧 统一的 API,简单易用

插件提供了四个核心方法,覆盖所有缓存操作场景:

// 1. set - 设置缓存
await app.cache.default.set('key', 'value', 300);  // 缓存 5 分钟

// 2. get - 获取缓存
const value = await app.cache.default.get('key');

// 3. del - 删除缓存
await app.cache.default.del('key');

// 4. wrap - 缓存包装器(最常用)
const result = await app.cache.default.wrap('key', async () => {
   
  return await fetchData();  // 仅在缓存不存在时执行
});

其中 wrap 方法是最实用的——它会自动判断缓存是否存在,存在则直接返回,不存在则执行回调函数并缓存结果。

快速上手

安装

npm i ruoyi-eggjs-cache --save

配置

1. 启用插件

// config/plugin.js
exports.cache = {
   
  enable: true,
  package: "ruoyi-eggjs-cache",
};

2. 基础配置(内存缓存)

// config/config.default.js
const path = require('path');

config.cache = {
   
  default: 'memory',  // 默认使用内存缓存
  ttl: 600,           // 缓存 10 分钟
  fs: {
   
    path: path.join(appInfo.baseDir, 'cache'),
    subdirs: false,
    zip: false,
  },
  redis: null,
};

3. Redis 配置(推荐生产环境)

// config/config.prod.js
config.cache = {
   
  default: 'redis',
  ttl: 600,
  redis: {
   
    host: '127.0.0.1',
    port: 6379,
    password: '',
    db: 0,
  },
};

实战场景

场景 1:数据库查询缓存

数据库查询是最常见的性能瓶颈,使用缓存可以显著提升响应速度:

// app/service/user.js
class UserService extends Service {
   
  async getUserById(userId) {
   
    const {
    app } = this;

    // 使用 wrap 自动管理缓存
    return await app.cache.default.wrap(`user:${
     userId}`, async () => {
   
      return await app.mysql.select('SELECT * FROM users WHERE id = ?', [userId]);
    });
  }

  async updateUser(user) {
   
    const {
    app } = this;

    // 更新数据库
    await app.mysql.update('UPDATE users SET name = ? WHERE id = ?', [user.name, user.id]);

    // 删除缓存,确保下次获取最新数据
    await app.cache.default.del(`user:${
     user.id}`);
  }
}

关键点

  • 查询时使用 wrap 自动缓存
  • 更新/删除时手动清除缓存

场景 2:API 响应缓存

对于查询频繁但变化不大的列表接口,缓存可以大幅降低服务器负载:

// app/controller/article.js
class ArticleController extends Controller {
   
  async list() {
   
    const {
    ctx, app } = this;
    const params = ctx.request.body;

    // 根据查询参数生成唯一的缓存 key
    const cacheKey = `article:list:${
     JSON.stringify(params)}`;

    const articles = await app.cache.default.wrap(cacheKey, async () => {
   
      return await ctx.service.article.getList(params);
    }, {
    ttl: 60 });  // 列表缓存 1 分钟

    ctx.body = {
    code: 200, data: articles };
  }
}

场景 3:配置数据缓存

系统配置数据变化频率极低,非常适合长时间缓存:

// app/service/config.js
class ConfigService extends Service {
   
  async getConfigByKey(configKey) {
   
    const {
    app } = this;

    return await app.cache.default.wrap(`config:${
     configKey}`, async () => {
   
      return await app.mysql.select('SELECT * FROM sys_config WHERE config_key = ?', [configKey]);
    }, {
    ttl: 3600 });  // 缓存 1 小时
  }

  async updateConfig(config) {
   
    const {
    app } = this;

    await app.mysql.update('UPDATE sys_config SET config_value = ? WHERE config_key = ?', 
      [config.configValue, config.configKey]);

    // 清除配置缓存
    await app.cache.default.del(`config:${
     config.configKey}`);
  }
}

场景 4:不同存储方式的组合使用

针对不同的数据特点,选择最合适的缓存方式:

// app/service/data.js
class DataService extends Service {
   
  // 高频访问的小数据 → 内存缓存
  async getHotData() {
   
    return await this.app.cache.memory.wrap('hot:data', async () => {
   
      return await this.fetchHotData();
    });
  }

  // 体积大的数据 → 文件系统缓存
  async getBigData() {
   
    return await this.app.cache.fs.wrap('big:data', async () => {
   
      return await this.fetchBigData();
    }, {
    ttl: 1800 });
  }

  // 多实例共享数据 → Redis 缓存
  async getSharedData() {
   
    return await this.app.cache.redis.wrap('shared:data', async () => {
   
      return await this.fetchSharedData();
    }, {
    ttl: 600 });
  }
}

缓存策略最佳实践

1. 合理设计缓存 Key

好的 Key 命名能让缓存管理更清晰:

// ✅ 推荐:使用有意义的前缀和参数
`user:${
     userId}`
`article:list:${
     category}:${
     page}`
`config:${
     configKey}`

// ❌ 不推荐:无意义的 Key
`u123`
`data`

2. 根据数据特点设置 TTL

// 频繁变化的数据 - 短 TTL
await app.cache.default.wrap('stock:price', async () => {
   
  return await fetchStockPrice();
}, {
    ttl: 60 });  // 1 分钟

// 相对稳定的数据 - 中 TTL
await app.cache.default.wrap('user:info', async () => {
   
  return await fetchUserInfo();
}, {
    ttl: 600 });  // 10 分钟

// 几乎不变的数据 - 长 TTL
await app.cache.default.wrap('system:config', async () => {
   
  return await fetchSystemConfig();
}, {
    ttl: 3600 });  // 1 小时

3. 避免缓存雪崩

缓存雪崩是指大量缓存同时过期,导致瞬间的数据库压力激增。解决方法是给 TTL 加上随机值:

// 在基础 TTL 上增加随机时间
const ttl = 300 + Math.floor(Math.random() * 60);  // 300-360 秒
await app.cache.default.set('key', 'value', ttl);

4. 及时清除过期缓存

在数据变更(增删改)时,记得清除相关缓存:

// 更新后清除单条缓存
await app.cache.default.del(`user:${
     userId}`);

// 删除多条缓存
await app.cache.default.del([`user:${
     userId}`, `user:list`]);

// 清空所有缓存(慎用)
await app.cache.default.reset();

性能优化建议

  1. 选择合适的缓存方式

    • 开发/测试:Memory
    • 生产单机:FS 或 Redis
    • 生产集群:Redis
  2. 合理设置 TTL

    • 避免设置过长导致数据不一致
    • 避免设置过短失去缓存意义
  3. 缓存粒度控制

    • 细粒度:单条数据缓存(如 user:123
    • 粗粒度:列表缓存(如 user:list
    • 根据业务场景选择
  4. 监控缓存命中率

    • 定期检查缓存使用情况
    • 优化低命中率的缓存策略

总结

ruoyi-eggjs-cache 是一个轻量且强大的 Egg.js 缓存插件,它的优势在于:

  • 多种存储:Memory、FS、Redis 三种方式,适应不同场景
  • API 简洁:统一的接口,学习成本低
  • 开箱即用:默认配置即可使用,无需复杂配置
  • 智能降级:Redis 不可用时自动降级,保障稳定性
  • 开发友好:开发环境自动短 TTL,调试无烦恼

无论是初创项目还是大型应用,合理使用缓存都能带来显著的性能提升。如果你正在使用 Egg.js,不妨试试这个插件,让你的应用飞起来!


目录
相关文章
|
6月前
|
人工智能 IDE 数据可视化
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
【RuoYi-SpringBoot3-Pro】将AI编程深度融入Java开发:基于Claude Code + Antigravity主力组合,集成openskills技能管理、OpenSpec需求规范工作流,支持智能创建/更新项目专属Skill,并实现IDEA与Antigravity一键切换,兼顾传统工程规范与AI提效。(239字)
1043 2
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
|
16天前
|
缓存 安全 前端开发
Qwen3.8-Max-0902 更新解读:价格不变但每次请求额外消耗 38 个输入 token
Qwen3.8-Max-0902版发布:编程能力跃升,CodeArena前端榜夺冠(1691分),8项编码测试全面超越前版;价格不变(输入$2/百万token、输出$6),但单次请求固定多耗38 token;100万上下文,支持图文输入与深度推理。
|
9天前
|
人工智能 API 语音技术
Token Plan 全新升级|Harness 工具包加持,一套订阅兼容 Qwen3.8‑Max/GLM‑5.2,对接 Cursor、OpenClaw 等主流 AI 工具
千问AI平台Token Plan重磅升级:单API-Key畅用Qwen、GLM等多模态大模型,原生兼容Cursor/OpenClaw等主流工具;免费赠送Harness联网搜索、代码解释器等Agent必备能力,7天滚动额度控预算,Lite/Standard/Pro三档可选,个人开发者一站式高性价比方案。
|
1月前
|
人工智能 JavaScript 前端开发
阿里云Qwen3.8-Max大模型介绍:模型功能、应用场景、最新活动参考
本文介绍阿里云通义千问最新旗舰Qwen3.8-Max,这款2.4万亿参数的基座模型实现全栈代码工程、多模态闭环执行、256K长上下文等能力突破,支持企业智能办公、全栈应用开发等复杂场景。当前通过阿里云百炼Token Plan可39元/月起订阅,叠加全天1折、夜间低至0.2折的限时福利,大幅降低开发者探索AGI能力的门槛。
|
6月前
|
存储 弹性计算 小程序
阿里云企业用户专属199元1年云服务器介绍:配置、实例性能、适用场景及购买规则解读
阿里云推出的199元1年通用算力型u1实例云服务器,配置为2核4G、5M带宽、80G ESSD Entry云盘,以“独享资源、稳定高效”特性成市场焦点。该云服务器适用Web服务、轻量级企业应用等场景。其属于“99计划”一部分,企业用户专享,新购与续费同价,活动截止日期为2027年3月31日,且限购1台。
|
2月前
|
存储 弹性计算 人工智能
阿里云服务器深度测评:38元轻量、99元ECS、199元企业版全方位解析
在数字化普及的当下,个人开发者、自媒体从业者、小微企业的上云需求持续暴涨,大家对云服务器的核心诉求逐渐统一:低成本、高稳定、易部署、适配多场景。2026年阿里云持续升级普惠上云政策,优化入门级、进阶级、企业级服务器产品矩阵,推出三款极具性价比的主力机型,分别是38元/年的轻量应用服务器、99元/年的ECS经济型实例、199元/年的企业款高配服务器。三款产品精准覆盖个人学习、小型建站、业务开发、中小企业商用等全场景需求,打破了传统云服务器高价难用、低价低配、续费涨价的行业痛点。本文将从**硬件配置、带宽性能、续费规则、适用场景、实操部署、优劣短板**六个维度,对三款机型进行全方位实测解析,搭配完
633 0
|
存储 安全 开发工具
深度解决 Git “fatal: refusing to merge unrelated histories” 错误解析什么是历史分支优雅草卓伊凡
深度解决 Git “fatal: refusing to merge unrelated histories” 错误解析什么是历史分支优雅草卓伊凡
1204 4
深度解决 Git “fatal: refusing to merge unrelated histories” 错误解析什么是历史分支优雅草卓伊凡
|
8月前
|
弹性计算 缓存 数据库
2026年阿里云新/老/学生/企业用户云服务器权益活动汇总与参与指南
2026年阿里云服务器优惠覆盖新老用户、企业与学生,核心有轻量秒杀、ECS“99/199计划”、学生/教师专属权益、企业迁移补贴等,参与路径清晰,按身份与场景操作即可锁定低价。以下是无营销的活动汇总与参与指南。
1029 2
|
8月前
|
监控 NoSQL 安全
【RuoYi-Eggjs】:基于 Bull Queue 的企业级定时任务调度系统
【RuoYi-Eggjs】基于 Bull Queue 与 Redis 实现企业级定时任务调度系统,支持动态管理、分布式执行、失败重试、日志监控及手动触发。集成 Cron 表达式解析、任务安全校验与执行统计,适用于数据同步、报表生成等场景,助力高可用任务调度。项目开源,易于扩展。
231 3
|
人工智能 并行计算 语音技术
Open-LLM-VTuber:宅男福音!开源AI老婆离线版上线,实时语音+Live2D互动还会脸红心跳
Open-LLM-VTuber 是一个开源的跨平台语音交互 AI 伴侣项目,支持实时语音对话、视觉感知和生动的 Live2D 动态形象,完全离线运行,保护用户隐私。
3109 10
Open-LLM-VTuber:宅男福音!开源AI老婆离线版上线,实时语音+Live2D互动还会脸红心跳

热门文章

最新文章