springboot redis 缓存入门与实战

发布于:2025-09-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

Spring Boot3 Redis 项目地址

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

Redis 介绍

        Redis 是一款高性能的 内存数据库(支持持久化),兼具缓存、NoSQL 存储、分布式锁等核心能力;Spring Boot 3 作为主流的 Java 开发框架,通过 spring-boot-starter-data-redis starter 简化了 Redis 的整合流程,降低了开发门槛。

Redis 核心

        开源内存数据库,支持 String、Hash、List、Set、ZSet 等数据结构,主打高性能(QPS 达 10W+)、低延迟,常用于缓存、分布式锁、会话存储等场景。Spring Boot 3 为 Redis 提供了两个核心操作类:RedisTemplate 和 StringRedisTemplate,两者定位不同,需根据场景选择。

1. StringRedisTemplate

  • 定位:专门处理 String 类型 的 Redis 操作(键和值均为 String)。
  • 默认配置:使用 StringRedisSerializer 序列化键和值,序列化后的数据在 Redis 中 可读性强(无乱码)。
  • 适用场景:存储简单字符串(如验证码、会话 ID、计数器等)。

2. RedisTemplate

  • 定位:通用 Redis 操作类,支持 任意类型 的键和值(通过泛型 RedisTemplate<K, V> 约束)。
  • 默认配置问题:默认使用 JdkSerializationRedisSerializer 序列化,会导致 Redis 中存储的是 二进制数据(可读性差,且需实体类实现 Serializable 接口),不推荐直接使用默认配置
  • 优化方案:自定义 RedisTemplate,使用 Jackson2JsonRedisSerializer 序列化(支持 JSON 格式,可读性强,无需实现 Serializable)。

Redis 示例

1. 前置条件

  • JDK 17+(推荐 JDK 17 或 21)
  • 构建工具:Maven 3.6+
  • 开发工具:IntelliJ IDEA
  • Redis 环境: Redis 6.x+       

2. 代码位置

        请参考项目地址中 springboot-cache/springboot-redis 模块代码。

Redis 高级

        Spring Boot 3 不仅支持 Redis 基础操作,还能便捷整合其高级特性(如缓存抽象、分布式锁、发布订阅)。基于 Redis 的缓存抽象,Spring 提供了 缓存注解(如 @Cacheable),结合 Redis 可快速实现缓存功能,无需手动调用 RedisTemplate

步骤 1:启用缓存

        在启动类上添加 @EnableCaching 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching // 启用 Spring 缓存抽象
public class RedisDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisDemoApplication.class, args);
    }
}

步骤 2:使用缓存注解

        常用注解说明及示例:

注解 作用
@Cacheable 方法执行前先查缓存,有则返回缓存值;无则执行方法,将结果存入缓存。
@CachePut 执行方法后,将结果存入缓存(覆盖旧值,常用于更新操作)。
@CacheEvict 删除缓存(常用于删除操作,支持批量删除)。
@Caching 组合多个缓存操作(如同时 @Cacheable 和 @CacheEvict)。

示例代码:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    /**
     * 查询用户:优先查缓存(key 为 "user:userId"),无则查数据库并缓存(1 小时过期)
     */
    @Cacheable(
            value = "user", // 缓存名称(对应 Redis 中的 key 前缀:user::xxx)
            key = "#userId", // 缓存 key 的后缀(SpEL 表达式,#userId 为方法参数)
            unless = "#result == null", // 结果为 null 时不缓存
            timeout = 3600 // 缓存过期时间(秒)
    )
    public User getUserById(Long userId) {
        // 模拟数据库查询(实际项目中替换为 MyBatis/JPA 调用)
        System.out.println("查询数据库:userId = " + userId);
        return new User(userId, "张三", 25, "zhangsan@xxx.com");
    }

    /**
     * 更新用户:执行方法后更新缓存(覆盖旧值)
     */
    @CachePut(
            value = "user",
            key = "#user.id", // 用用户 ID 作为 key
            unless = "#user == null"
    )
    public User updateUser(User user) {
        // 模拟数据库更新
        System.out.println("更新数据库:user = " + user);
        return user;
    }

    /**
     * 删除用户:执行方法后删除缓存
     */
    @CacheEvict(
            value = "user",
            key = "#userId"
    )
    public void deleteUser(Long userId) {
        // 模拟数据库删除
        System.out.println("删除数据库:userId = " + userId);
    }
}

Redis 指南

1. 序列化方式选择

序列化器 优点 缺点 推荐度
Jackson2JsonRedisSerializer 可读性强、支持复杂对象、无需实现 Serializable 需配置类型信息(避免反序列化丢失类型) ★★★★★
StringRedisSerializer 可读性强、轻量 仅支持 String 类型 ★★★★☆
JdkSerializationRedisSerializer 无需额外配置、支持所有实现 Serializable 的类 可读性差(二进制)、需实现 Serializable ★★☆☆☆

        结论:优先使用 Jackson2JsonRedisSerializer(自定义 RedisTemplate)。

2. 连接池配置优化

  • max-active:根据并发量调整(如 16-64,避免过大导致 Redis 压力)。
  • max-idle:建议与 max-active 一致(避免频繁创建连接)。
  • max-wait:设置为 1-3 秒(避免无限等待,快速失败)。
  • timeout:设置为 1-3 秒(避免网络波动导致的长时间阻塞)。

3. 缓存问题解决方案

问题 原因 解决方案
缓存穿透 请求不存在的 key,穿透缓存直击数据库 1. 缓存空值(短期过期);2. 使用布隆过滤器
缓存击穿 热点 key 过期,大量请求直击数据库 1. 互斥锁(如 Redisson 锁);2. 热点 key 永不过期
缓存雪崩 大量 key 同时过期,数据库压力骤增 1. 过期时间加随机值(分散过期);2. 集群部署 Redis

4. 数据一致性保障

        缓存与数据库同步的核心原则:先更新数据库,后操作缓存(避免脏数据)。

  • 更新操作:更新数据库 → 删除缓存(推荐,避免更新缓存失败导致脏数据)。
  • 删除操作:删除数据库 → 删除缓存。

总结        

        Spring Boot 3 整合 Redis 简化了开发流程,通过 RedisTemplate/StringRedisTemplate 可快速操作 Redis 基础数据结构,结合 Spring 缓存抽象、Redisson 分布式锁等高级特性,能满足企业级应用的核心需求。实际开发中需注意序列化配置、连接池优化、缓存一致性等问题,确保系统高性能、高可用。Redis 的场景覆盖 缓存、分布式协调、计数、消息、排序 等多个领域,核心是利用其 高性能、多结构、原子性 的特性解决传统数据库或单体应用的痛点。实际使用时需根据业务需求选择合适的数据结构和命令,同时注意内存管理、持久化策略和高可用部署(如主从、集群)。


网站公告

今日签到

点亮在社区的每一天
去签到