🧘 祺祺·技术笔记

← 返回首页

Spring Boot 集成 Redis 缓存实战

Spring Data Redis 配合 Spring Cache Abstraction,可以非常方便地在 Spring Boot 项目中引入缓存层。本文记录在实际项目中配置和使用 Redis 缓存的经验。

一、依赖引入与基础配置

在 pom.xml 中添加依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

配置文件 application.yml 中指定 Redis 连接信息:

spring:
  redis:
    host: localhost
    port: 6379
    timeout: 2000ms
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 2
    cache:
      type: redis

连接池使用 Lettuce(Spring Boot 2.x 后的默认客户端),性能优于 Jedis,且支持异步和响应式编程。

二、缓存配置类

创建 Redis 缓存配置类,设置 Key 和 Value 的序列化方式以及默认过期时间:

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(30))
            .serializeKeysWith(
                RedisSerializationContext.SerializationPair.fromSerializer(
                    new StringRedisSerializer()))
            .serializeValuesWith(
                RedisSerializationContext.SerializationPair.fromSerializer(
                    new Jackson2JsonRedisSerializer<>(Object.class)))
            .disableCachingNullValues();

        return RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .build();
    }
}

三、使用缓存注解

Spring Cache 提供了四个核心注解。以用户信息查询为例:

@Cacheable

查询时先检查缓存,有则直接返回,没有则执行方法并将结果缓存:

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    return userMapper.selectById(id);
}

@CachePut

更新数据后同时更新缓存:

@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    userMapper.updateById(user);
    return user;
}

@CacheEvict

删除数据后清除缓存:

@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    userMapper.deleteById(id);
}

四、缓存策略选择

实际项目中不同场景需要不同的缓存策略:

五、缓存穿透/击穿/雪崩应对

缓存穿透

查询一个不存在的数据,由于缓存中没有,每次都会查数据库。解决方案:

缓存击穿

某个热点 key 在过期瞬间有大量并发请求同时到达。解决方案:

缓存雪崩

大量 key 在同一时间过期,导致请求全部落到数据库。解决方案:

六、监控与调优

使用 Redis 自带的 INFO 命令可以查看缓存命中率等指标。结合 Spring Boot Actuator 的 /actuator/metrics 可以查看缓存操作的统计信息,便于识别热点和优化缓存策略。生产环境中建议开启 Redis 的慢查询日志,定位耗时较高的命令。

七、总结

合理使用 Redis 缓存可以显著提升系统性能,但缓存策略需要根据业务场景精心设计。一味地加缓存而不考虑一致性、过期策略等问题,可能会引入数据不一致、缓存雪崩等更棘手的问题。建议先梳理业务场景,明确哪些数据适合缓存、缓存多久、如何更新,再动手实施。