Spring Boot轻松整合Redis缓存实战

Spring Boot 整合 Redis 缓存

Redis 是一种高性能的键值存储数据库,常用于缓存、消息队列等场景。Spring Boot 提供了对 Redis 的自动配置支持,可以轻松实现缓存功能。以下是如何在 Spring Boot 项目中整合 Redis 缓存的详细步骤。

添加依赖

pom.xml 文件中添加 Spring Boot Redis 和缓存相关的依赖:

<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>

如果需要使用 Redis 的 Lettuce 客户端(默认),则无需额外配置;如果需要 Jedis,可以添加以下依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

配置 Redis 连接

application.propertiesapplication.yml 中配置 Redis 连接信息:

# Redis 服务器地址
spring.redis.host=localhost
# Redis 服务器端口
spring.redis.port=6379
# Redis 密码(如果没有密码可以省略)
spring.redis.password=
# 连接池配置(可选)
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

启用缓存支持

在 Spring Boot 主类或配置类上添加 @EnableCaching 注解以启用缓存功能:

@SpringBootApplication
@EnableCaching
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

配置 Redis 缓存管理器

可以通过自定义 RedisCacheManager 来配置缓存的过期时间、序列化方式等:

@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间为 10 分钟
                .disableCachingNullValues(); // 禁止缓存 null 值

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }
}

使用缓存注解

Spring 提供了以下常用缓存注解:

  1. @Cacheable:标记方法的返回值需要被缓存。
  2. @CachePut:更新缓存,通常用于更新操作。
  3. @CacheEvict:清除缓存,通常用于删除操作。

示例:缓存查询结果

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        // 模拟数据库查询
        return userRepository.findById(id).orElse(null);
    }
}

示例:更新缓存

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

示例:清除缓存

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

自定义缓存 Key

可以通过 SpEL 表达式自定义缓存的 Key:

@Cacheable(value = "users", key = "'user:' + #id")
public User getUserById(Long id) {
    // ...
}

缓存的 Key 将形如 user:1

缓存条件与条件排除

可以通过 conditionunless 属性控制缓存的条件:

@Cacheable(value = "users", key = "#id", unless = "#result == null")
public User getUserById(Long id) {
    // 仅当返回值不为 null 时缓存
    return userRepository.findById(id).orElse(null);
}

缓存同步模式

在多线程环境下,可以使用 sync 属性启用同步模式,避免缓存击穿:

@Cacheable(value = "users", key = "#id", sync = true)
public User getUserById(Long id) {
    // 同一时间只有一个线程可以执行方法,其他线程等待缓存结果
    return userRepository.findById(id).orElse(null);
}

测试缓存功能

编写测试类验证缓存是否生效:

@SpringBootTest
public class CacheTest {

    @Autowired
    private UserService userService;

    @Test
    public void testCache() {
        // 第一次调用,会执行方法并缓存结果
        User user1 = userService.getUserById(1L);
        
        // 第二次调用,直接从缓存获取,不会执行方法
        User user2 = userService.getUserById(1L);
        
        // 验证两次返回的对象是否为同一个实例
        Assert.assertSame(user1, user2);
    }
}

缓存监控与管理

可以通过 Redis 命令行工具或可视化工具(如 RedisInsight)查看缓存数据:

redis-cli
> KEYS *
> GET "users::1"

常见问题与解决方案

  1. 缓存穿透:查询不存在的数据导致大量请求直接打到数据库。可以通过缓存空值或使用布隆过滤器解决。
  2. 缓存雪崩:大量缓存同时失效导致数据库压力激增。可以设置不同的过期时间或使用缓存预热。
  3. 缓存击穿:热点 Key 失效导致大量请求直接打到数据库。可以使用互斥锁或永不过期策略。

通过以上步骤,可以在 Spring Boot 项目中高效整合 Redis 缓存,显著提升系统性能。

BbS.okacop092.info/PoSt/1120_139626.HtM
BbS.okacop093.info/PoSt/1120_395966.HtM
BbS.okacop094.info/PoSt/1120_891075.HtM
BbS.okacop095.info/PoSt/1120_497730.HtM
BbS.okacop096.info/PoSt/1120_992473.HtM
BbS.okacop097.info/PoSt/1120_078002.HtM
BbS.okacop098.info/PoSt/1120_481937.HtM
BbS.okacop099.info/PoSt/1120_483903.HtM
BbS.okacop114.info/PoSt/1120_315534.HtM
BbS.okacop829.info/PoSt/1120_518148.HtM
BbS.okacop092.info/PoSt/1120_050133.HtM
BbS.okacop093.info/PoSt/1120_842260.HtM
BbS.okacop094.info/PoSt/1120_951465.HtM
BbS.okacop095.info/PoSt/1120_460172.HtM
BbS.okacop096.info/PoSt/1120_230043.HtM
BbS.okacop097.info/PoSt/1120_728214.HtM
BbS.okacop098.info/PoSt/1120_618918.HtM
BbS.okacop099.info/PoSt/1120_743134.HtM
BbS.okacop114.info/PoSt/1120_065144.HtM
BbS.okacop829.info/PoSt/1120_430556.HtM
BbS.okacop092.info/PoSt/1120_266033.HtM
BbS.okacop093.info/PoSt/1120_623555.HtM
BbS.okacop094.info/PoSt/1120_616704.HtM
BbS.okacop095.info/PoSt/1120_601734.HtM
BbS.okacop096.info/PoSt/1120_779408.HtM
BbS.okacop097.info/PoSt/1120_463786.HtM
BbS.okacop098.info/PoSt/1120_513106.HtM
BbS.okacop099.info/PoSt/1120_537795.HtM
BbS.okacop114.info/PoSt/1120_625855.HtM
BbS.okacop829.info/PoSt/1120_584370.HtM
BbS.okacop092.info/PoSt/1120_256009.HtM
BbS.okacop093.info/PoSt/1120_027724.HtM
BbS.okacop094.info/PoSt/1120_338981.HtM
BbS.okacop095.info/PoSt/1120_595896.HtM
BbS.okacop096.info/PoSt/1120_768807.HtM
BbS.okacop097.info/PoSt/1120_053805.HtM
BbS.okacop098.info/PoSt/1120_298470.HtM
BbS.okacop099.info/PoSt/1120_074213.HtM
BbS.okacop114.info/PoSt/1120_605714.HtM
BbS.okacop829.info/PoSt/1120_985518.HtM
BbS.okacop092.info/PoSt/1120_168896.HtM
BbS.okacop093.info/PoSt/1120_415247.HtM
BbS.okacop094.info/PoSt/1120_772764.HtM
BbS.okacop095.info/PoSt/1120_733710.HtM
BbS.okacop096.info/PoSt/1120_199721.HtM
BbS.okacop097.info/PoSt/1120_613761.HtM
BbS.okacop098.info/PoSt/1120_018519.HtM
BbS.okacop099.info/PoSt/1120_290785.HtM
BbS.okacop114.info/PoSt/1120_847717.HtM
BbS.okacop829.info/PoSt/1120_030673.HtM
BbS.okacop092.info/PoSt/1120_992303.HtM
BbS.okacop093.info/PoSt/1120_591693.HtM
BbS.okacop094.info/PoSt/1120_645958.HtM
BbS.okacop095.info/PoSt/1120_171101.HtM
BbS.okacop096.info/PoSt/1120_341860.HtM
BbS.okacop097.info/PoSt/1120_391278.HtM
BbS.okacop098.info/PoSt/1120_094642.HtM
BbS.okacop099.info/PoSt/1120_687652.HtM
BbS.okacop114.info/PoSt/1120_854338.HtM
BbS.okacop829.info/PoSt/1120_275763.HtM
BbS.okacop092.info/PoSt/1120_349846.HtM
BbS.okacop093.info/PoSt/1120_248139.HtM
BbS.okacop094.info/PoSt/1120_566288.HtM
BbS.okacop095.info/PoSt/1120_049375.HtM
BbS.okacop096.info/PoSt/1120_269269.HtM
BbS.okacop097.info/PoSt/1120_269416.HtM
BbS.okacop098.info/PoSt/1120_740316.HtM
BbS.okacop099.info/PoSt/1120_285100.HtM
BbS.okacop114.info/PoSt/1120_579303.HtM
BbS.okacop829.info/PoSt/1120_199240.HtM
BbS.okacop092.info/PoSt/1120_876595.HtM
BbS.okacop093.info/PoSt/1120_917293.HtM
BbS.okacop094.info/PoSt/1120_973423.HtM
BbS.okacop095.info/PoSt/1120_024444.HtM
BbS.okacop096.info/PoSt/1120_927617.HtM
BbS.okacop097.info/PoSt/1120_847363.HtM
BbS.okacop098.info/PoSt/1120_521467.HtM
BbS.okacop099.info/PoSt/1120_294505.HtM
BbS.okacop114.info/PoSt/1120_438752.HtM
BbS.okacop829.info/PoSt/1120_043937.HtM

#牛客AI配图神器#

全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 10:05
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务