第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)

上一篇我们讲清了 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 不是用来存数据的,
而是用来让系统"更快、更稳、更抗压"的。

相关推荐
洋洋技术笔记1 天前
Spring Boot配置管理最佳实践
spring boot
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
大道至简Edward2 天前
Spring Boot 2.7 + JDK 8 升级到 Spring Boot 3.x + JDK 17 完整指南
spring boot·后端
洋洋技术笔记2 天前
Spring Boot启动流程解析
spring boot·后端
怒放吧德德2 天前
Spring Boot 实战:RSA+AES 接口全链路加解密(防篡改 / 防重放)
java·spring boot·后端
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
QQ5110082853 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
追风筝的人er3 天前
企业管理系统如何实现自定义首页与千人千面?RuoYi Office 给出了完整方案
vue.js·spring boot·spring cloud
Java水解3 天前
你真的会打印日志吗?基于 Spring Boot 的全方位日志指南
spring boot·后端