跳至主要內容
缓存实战(对比前端缓存策略)

1. Redis 缓存的基本模式

// 前端:还记得请求缓存吗?
const cache = new Map();

async function fetchUser(id) {
    if (cache.has(id)) {
        return cache.get(id);          // 缓存命中
    }
    const data = await api.getUser(id); // 查数据库
    cache.set(id, data);               // 写入缓存
    return data;
}

Mr.Ding大约 4 分钟redis缓存穿透击穿雪崩前端转后端
常用命令 & 机制(对比 JS API)

1. 过期时间(TTL)— ≈ setTimeout 自动删除

# 设置 key 的同时指定过期时间
SET code "9527" EX 300        # 300 秒后自动删除

# 单独设置过期
SET code "9527"
EXPIRE code 300               # 300 秒后过期

# 查看剩余时间
TTL code                     # → 267(还有 267 秒)
TTL code                     # → -1 表示永不过期
TTL code                     # → -2 表示 key 已不存在

# 移除过期时间
PERSIST code

# 设置过期时间(毫秒)
SET code "9527" PX 300000    # 300 秒(毫秒为单位)

# 更精准:过期时间戳
EXPIREAT code 1800000000     # 在指定时间戳过期

Mr.Ding大约 4 分钟redis命令过期事务前端转后端
五种基础数据类型(对比 JS 数据结构)

Redis 数据结构总览

┌────────────────────────────────────────────────────────┐
│                    Redis 数据类型                         │
├──────────┬──────────────────┬──────────────────────────┤
│ 类型     │ 底层结构          │ 前端类比                  │
├──────────┼──────────────────┼──────────────────────────┤
│ String   │ 动态字符串        │ string + number           │
│ List     │ 双向链表/压缩列表  │ Array(push/pop)        │
│ Hash     │ 哈希表            │ Map<string, string>      │
│ Set      │ 哈希表            │ Set                      │
│ Zset     │ 跳表 + 哈希表     │ 有序 Set(自动排序)      │
└──────────┴──────────────────┴──────────────────────────┘

Mr.Ding大约 4 分钟redis基础数据结构前端转后端
Redis 学习路线 — 前端开发者视角

为什么前端要学 Redis?

场景 之前怎么做 有了 Redis
接口缓存 自己写 Map/WeakMap 缓存 Redis 自带过期、LRU 淘汰
Session 登录态 localStorage / JWT Redis 集中存 Session,多服务器共享
消息通知 WebSocket / 轮询 Redis Pub/Sub
排行榜 JS sort 排序 Redis Zset 有序集合直接搞定
计数器 请求后端接口查数据库 Redis INCR 原子自增
限流 手动计数 Redis 过期时间做滑动窗口

Mr.Ding大约 1 分钟redis学习路线缓存前端转后端
Java 操作 Redis(Jedis / Spring Data Redis)

1. 客户端选择

客户端 特点 类似前端
Jedis 轻量,直连 Redis(非线程安全需连接池) ioredis 基础用法
Lettuce 异步+同步,线程安全,基于 Netty ioredis 高级用法
Spring Data Redis Spring Boot 整合,封装度高 ORM 封装层

Mr.Ding大约 4 分钟redisjavaJedisLettuceSpring Data Redis全栈前端转后端
Node.js 操作 Redis(ioredis 实战)

1. 安装与连接

npm install ioredis
const Redis = require('ioredis');

// 连接 Redis(默认 localhost:6379)
const redis = new Redis();

// 指定配置
const redis = new Redis({
    host: 'localhost',
    port: 6379,
    password: '123456',
    db: 0,                    // 数据库编号(默认 0~15)
    retryStrategy: (times) => {
        // 断线重连策略
        return Math.min(times * 50, 2000);  // 最多等 2 秒
    },
});

// 连接字符串方式
const redis = new Redis('redis://:password@localhost:6379/0');

// 测试连接
redis.ping().then(res => {
    console.log('Redis 连接', res === 'PONG' ? '✅' : '❌');
});

Mr.Ding大约 4 分钟redisNode.jsioredis全栈前端转后端
持久化 & 主从架构

一、Redis 为什么快?

所有数据都在内存中
每个命令单线程执行(无锁竞争)
高效的数据结构(跳表、压缩列表)
IO 多路复用(类似 Node.js 的事件循环)

前端理解:Redis 是内存数据库 ≈ JS 变量存在内存中,MySQL 存在磁盘上。所以 Redis 读写在微秒级,MySQL 在毫秒级


Mr.Ding大约 4 分钟redis持久化RDBAOF主从
发布订阅(对比 JS EventEmitter / WebSocket)

1. Pub/Sub 模式理解

// 前端已经熟悉的 EventEmitter(Node.js)或 addEventListener
const EventEmitter = require('events');
const emitter = new EventEmitter();

// 订阅
emitter.on('user:login', (data) => {
    console.log('用户登录:', data);
});

// 发布
emitter.emit('user:login', { userId: 1, time: Date.now() });

Mr.Ding大约 4 分钟redis发布订阅PubSub消息前端转后端
Session 与分布式应用(对比前端 localStorage)

1. 为什么需要集中管理 Session?

// ❌ 前端存登录态的做法
localStorage.setItem('token', 'jwt_token_xxx');
// 每次请求带 token,服务器验证签名

Mr.Ding大约 4 分钟redisSession分布式登录前端转后端