🎬 HoRain 云小助手个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

🔰 核心概念:Spring Cache 与 Redis

⚙️ 项目配置步骤

📗 核心注解的使用

💡 进阶特性与注意事项

💎 实践建议


Spring Cache与Redis的整合确实能大幅提升应用性能。下面是一个简明指南,帮你快速上手。

🔰 核心概念:Spring Cache 与 Redis

  • Spring Cache:这是Spring框架提供的缓存抽象层,它定义了一套统一的缓存操作接口。使用Spring Cache的好处在于,你可以通过简单的注解来管理缓存,而无需关心底层缓存的具体实现,使得代码更简洁且易于维护。

  • Redis:一个高性能的内存键值数据库,常被用作分布式缓存后端。当Spring Cache与Redis结合时,Redis就成为了缓存数据的实际存储位置。

这种组合让你能够用简单的注解来管理缓存,同时享受Redis高性能和分布式特性的好处。

⚙️ 项目配置步骤

将Spring Cache与Redis集成到Spring Boot项目中,只需几个关键步骤。

  1. 添加依赖:在pom.xml中引入必要的依赖,主要是Spring Boot为缓存和Redis提供的Starter。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  2. 配置Redis连接:在application.ymlapplication.properties中配置Redis服务器的基础信息。

    spring:
      redis:
        host: localhost
        port: 6379
        # password: your-password  # 如果Redis设置了密码,需要配置此项
        database: 0
  3. 启用缓存并自定义序列化:创建一个配置类,主要完成两件事:

    • 使用@EnableCaching注解开启缓存功能。

    • 配置RedisCacheManager,关键之一是设置序列化方式。默认的JDK序列化方式可读性差,通常建议改为JSON序列化(如Jackson)。

    @Configuration
    @EnableCaching
    public class RedisConfig {
        @Bean
        public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key使用字符串序列化
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value使用JSON序列化
                .entryTtl(Duration.ofMinutes(30)) // 设置全局缓存过期时间
                .disableCachingNullValues(); // 不缓存null值
            return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();
        }
    }

📗 核心注解的使用

配置完成后,就可以在业务层(Service)的方法上使用缓存注解了。以下是三个最核心的注解:

注解

作用

适用场景

示例

@Cacheable

将方法返回值存入缓存。后续调用相同参数时,直接返回缓存值,不执行方法体。

数据查询

@Cacheable(value = "user", key = "#id")

@CacheEvict

从缓存中删除数据。

数据更新、删除

@CacheEvict(value = "user", key = "#user.id")

@CachePut

总是执行方法体,并用返回值更新缓存。

数据新增、强制更新

@CachePut(value = "user", key = "#user.id")

代码示例

@Service
public class UserService {
    // 查询用户:如果缓存有则直接返回,没有则执行方法并缓存结果
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        // 模拟从数据库查询
        return userRepository.findById(id).orElse(null);
    }
    // 更新用户:先更新数据库,然后清除缓存(失效模式)
    @CacheEvict(value = "users", key = "#user.id")
    public void updateUser(User user) {
        userRepository.save(user);
    }
    // 新增用户:执行方法,并将结果放入缓存(双写模式)
    @CachePut(value = "users", key = "#user.id")
    public User addUser(User user) {
        userRepository.save(user);
        return user;
    }
}

💡 进阶特性与注意事项

掌握基础使用后,了解这些进阶特性和常见问题能让你的缓存方案更稳健。

  • 防止缓存击穿:对于热点数据,如果缓存恰好过期,大量并发请求可能瞬间压垮数据库。可以在@Cacheable中设置sync = true属性,这样在缓存失效后,只有一个线程能去查询数据库,其他线程会等待。

  • 缓存失效策略:处理数据更新时,通常有两种策略确保缓存与数据库的一致性:

    • 失效模式(常用):使用@CacheEvict,在更新数据后直接删除缓存。下次查询时自动从数据库加载最新数据并缓存。

    • 双写模式:使用@CachePut,在更新数据后同时更新缓存。这要求方法有返回值且是更新后的最新数据。

  • 缓存相关问题

    • 缓存穿透(查询不存在的数据):可通过在配置中设置cache-null-values: true来缓存空对象,防止反复查询数据库。

    • 缓存雪崩(大量缓存同时失效):为不同的缓存设置随机的过期时间(TTL),避免同时失效。

💎 实践建议

  • 缓存键(Key)设计:使用key属性明确指定缓存键,避免使用默认生成规则可能导致的冲突。灵活运用SpEL表达式,如 key = "#id"key = "'user' + #user.id"

  • 序列化兼容性:使用JSON序列化(如GenericJackson2JsonRedisSerializer)后,存储在Redis中的数据是可读的,并且更容易被其他非Java语言理解。

希望这份指南能帮助你顺利上手。如果在具体配置或注解使用中遇到问题,可以随时提出。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐