上一篇我们讲清了 Redis 在后端的定位:
它不是数据库,而是系统的性能调节器与状态中心。
这一篇不谈概念,直接落地:
做一个 最小可运行缓存系统。
目标只有四件事:
- 查询接口缓存
- 缓存失效策略
- 防缓存穿透
- 登录态缓存
一、准备环境
1. 启动 Redis(本地或服务器)
Mac / Linux:
redis-server
测试连接:
redis-cli ping
返回 PONG 说明成功。
2. Spring Boot 引入依赖
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3. application.yml 配置
bash
spring:
redis:
host: 127.0.0.1
port: 6379
二、第一个缓存:查询接口
场景
bash
查商品详情
逻辑目标:
bash
先查 Redis
没有 → 查数据库
查到 → 回填 Redis
示例代码(伪代码逻辑)
java
public Product getProduct(Long id) {
String key = "product:" + id;
// 1. 查缓存
Product p = redis.get(key);
if (p != null) return p;
// 2. 查数据库
p = db.query(id);
// 3. 回填缓存
redis.set(key, p, 10分钟);
return p;
}
效果:
- 第一次慢
- 后面极快
三、缓存失效策略
缓存不是永久的,否则数据会脏。
常见策略三种:
1. TTL 自动过期(最常用)
java
redis.set(key, value, 600秒);
2. 更新时主动删除
java
更新商品 → 删除缓存
3. 延迟双删(进阶)
java
更新 → 删除缓存 → 延迟1秒再删一次
用于高并发一致性。
四、防缓存穿透(必须会)
问题:
java
用户查一个不存在的 ID
每次都打数据库
解决:
空值缓存
java
if (db查不到) {
redis.set(key, "null", 60秒);
}
五、登录态缓存(高频场景)
Redis 非常适合存登录状态。
模型:
java
userId → token
token → 状态
伪代码:
java
loginSuccess(userId, token) {
redis.set("token:" + token, userId, 7天);
}
实现能力:
- 强制下线
- 单点登录
- 多端控制
六、简单限流(加分项)
场景:
java
登录接口防刷
逻辑:
java
count = redis.incr(ipKey);
if (count == 1) redis.expire(ipKey, 60秒);
if (count > 10) 拒绝访问;
七、实战结构图
java
浏览器
↓
Spring Boot
↓
Redis ← 缓存 / 登录态 / 限流
↓
MySQL
Redis 在这里承担的是:
- 查询加速
- 状态存储
- 并发控制
八、工程级注意事项
| 问题 | 解决 |
|---|---|
| 内存爆炸 | 设置 TTL |
| Key 混乱 | 命名规范 |
| 数据不一致 | 更新删除缓存 |
| 穿透攻击 | 空值缓存 |
一句话终极理解
Redis 不是用来存数据的,
而是用来让系统"更快、更稳、更抗压"的。