Redis 缓存数据库

内容已升级至全栈资料库专题页 — 本页保留岗位速查

本页内容已整合至更权威的专题页面

原来的 Redis 教程已由全栈资料库的专题图解页全面覆盖——包含请求全链路 SVG 图解、5大数据结构深度分析、缓存策略原理和面试高频考点。

建议直接学习以下专题页:原理图解+面试冲刺,深度远超本页原有内容。

运行原理图解

06-Redis 请求全链路

Redis 请求全链路 SVG 图解、5大数据结构底层实现、持久化 RDB/AOF、过期策略与淘汰机制、集群架构

面试备战库

02-Redis 深度指南

Redis 面试高频考点、数据结构选型决策树、缓存三大问题深度分析、分布式锁实现方案

面试备战库

05-Redis 面试冲刺攻略

Redis 高频面试题 Top 20、集群与哨兵、缓存击穿/穿透/雪崩对比、生产案例复盘

🏭 中际旭创岗位速查

以下是制造业数据可视化项目的 Redis 专用配置和 Node.js 实战代码,不在通用专题页中。

01 — 大屏缓存策略推荐

大屏仪表盘场景下,80% 的数据用 Cache Aside 就够了。OEE 每30秒刷新、告警实时推送、机台状态缓存,都是这个策略。只有设备控制指令这类「必须准确」的数据才考虑 Read Through。

数据类型推荐策略TTL刷新方式
OEE / 产量统计Cache Aside30s前端定时请求
机台状态Cache Aside10sWebSocket 推送
告警列表Write Behind5sPub/Sub 实时
设备控制指令Read Through不缓存直接查 DB
历史报表Cache Aside1h按需查询

02 — Node.js 大屏缓存实战代码

制造业大屏后端最常用的 Redis + MySQL 读写模式:

JavaScript (Node.js) — OEE 缓存读取(Cache Aside)
// 查询 OEE 数据:先查 Redis,没有再查 MySQL 并回填
async function getOeeData(lineId) {
  // 1. 先查 Redis 缓存
  const cached = await redis.get(`oee:${lineId}`);
  if (cached) return JSON.parse(cached);

  // 2. 缓存未命中,查 MySQL
  const rows = await db.query(
    'SELECT * FROM oee_daily WHERE line_id = ? ORDER BY date DESC LIMIT 30',
    [lineId]
  );

  // 3. 写入 Redis,TTL 30秒
  await redis.set(`oee:${lineId}`, JSON.stringify(rows), 'EX', 30);

  return rows;
}

写入时同步更新缓存:

JavaScript (Node.js) — 写入 MySQL + 更新 Redis
async function updateOeeData(lineId, data) {
  // 1. 先更新 MySQL
  await db.query(
    'INSERT INTO oee_daily (line_id, oee, date) VALUES (?, ?, NOW())',
    [lineId, data.oee]
  );

  // 2. 删除 Redis 缓存(下次查询时重新加载)
  await redis.del(`oee:${lineId}`);

  // 或者直接更新 Redis(适合高频更新场景)
  await redis.set(`oee:${lineId}`, JSON.stringify(data), 'EX', 30);
}

03 — 仪表盘数据 TTL 推荐表

⚠️ TTL 设置原则:不同数据不同过期时间

所有 Key 设相同 TTL = 缓存雪崩风险!大屏项目务必给不同类型数据设不同过期时间,加随机偏移量。

Redis CLI — 批量设置仪表盘缓存(含随机 TTL)
# OEE 数据:30s + 随机0~5s 偏移
$ redis-cli SET oee:line1 "..." EX 32
$ redis-cli SET oee:line2 "..." EX 28
$ redis-cli SET oee:line3 "..." EX 33

# 告警列表:5s 过期(实时性要求高)
$ redis-cli SET alerts:recent "..." EX 5

# 机台状态:10s 过期
$ redis-cli SET machine:status "..." EX 12

# 历史报表:1小时过期
$ redis-cli SET report:daily "..." EX 3605

04 — 缓存三大问题速查(大屏场景)

问题大屏场景解决方案
缓存穿透 前端传了不存在的产线 ID line999,Redis 没有 → MySQL 也没有 ① 缓存空值 SET oee:line999 "" EX 60
② 接口层校验 ID 合法性
缓存击穿 热点 Key(首页大屏 OEE)过期的瞬间,100个用户同时来查 ① 互斥锁 SETNX lock:oee:line1
② 热点 Key 永不过期 + 异步刷新
缓存雪崩 8条产线 OEE 同时过期,全部打到 MySQL ① TTL 加随机偏移(30±5s)
② 多级缓存(本地 L1 + Redis L2)
💡 大屏项目防雪崩配置模板

在 Node.js 中设置随机 TTL 的辅助函数:

function getRandomTTL(base, range = 5) {
  return base + Math.floor(Math.random() * range * 2) - range;
}
// 使用: redis.set('oee:line1', data, 'EX', getRandomTTL(30))