Spirng Cache(第三篇)Redis缓存配置

Spring Cache与Redis整合实战
本文介绍了如何将Spring Cache从内存缓存切换到Redis缓存,详细讲解了配置文件和自定义注解的方法,包括Redis缓存配置、自定义过期时间、缓存null值、全局缓存前缀等,并解决了RedisCacheResolver重复调用的问题。

Spirng Cache(第三篇)Redis缓存配置

从3.1版开始,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持。与事务 支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小

从Spring 4.1开始,通过JSR-107注释和更多自定义选项的支持,缓存抽象得到了显着改进。

这篇介绍下如果根据Spring 缓存的Redis实现。

Spring boot 1.5+Spring boot 2.0+版本,分别使用配置文件和注解实现。

切换到Redis缓存

把前面内存缓存切换到Redis缓存,只需要修改配置,业务代码不动。

修改配置文件 application.yml,添加Redis相关配置。redis 安装

添加Redis依赖

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

将上一章自定义配置都删除掉,不然会影响到Redis配置

application.yml配置

spring:
  redis:
    host: localhost
    port: 6379

这样就可以切换到Redis缓存了,别忘记重写Book 实体的equalshashCode

单元测试

@Test
public void findBook() {
   
   
    Book book1 = bookService.findBook(ISBN);
    Book book2 = bookService.findBook(ISBN);
    Book book3 = bookService.findBook(ISBN);
    assert book1.equals(book2);
    assert book1.equals(book3);
}

Redis缓存自定义配置 application.yml

此配置适用于Spring-boot1.5.x版本。

添加以下几项自定义配置

  • default-expiration 默认过期时间 单位秒
  • cache-null-values 缓存null值
  • key-prefix 全局缓存前缀 默认值 spring-cache
  • expires 指定缓存名称过期时间 单位秒

properties配置类,省略Get/Set方法

@ConfigurationProperties("spring.cache.redis")
public class RedisCacheProperties {
   
   
    /**
     * 全局默认过期时间 单位秒
     */
    private Long defaultExpiration;
    /**
     * 是否缓存null值
     */
    private boolean cacheNullValues = true;
    /**
     * 缓存前缀
     */
    private String keyPrefix = "spring-cache";
    /**
     * 指定缓存名称过期时间 单位秒
     */
    private Map<String, Long> expires;
}

覆盖Redis默认配置

@EnableCaching
@EnableConfigurationProperties({
   
   RedisCacheProperties.class, CacheProperties.class})
public class RedisCacheConfig implements RedisCachePrefix {
   
   

    private final RedisSerializer<String> serializer = new StringRedisSerializer();

    private final RedisCacheProperties redisCacheProperties;

    private final CacheProperties cacheProperties;

    public RedisCacheConfig(RedisCacheProperties redisCacheProperties, CacheProperties cacheProperties) {
   
   
        this.redisCacheProperties = redisCacheProperties;
        this.cacheProperties = cacheProperties;
    }
    /**
     * 覆盖redis 默认缓存管理器
     */
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
   
   
        RedisTemplate<Object, Object> redisTemplate = redisTemplate(redisConnectionFactory);

        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate, null, redisCacheProperties.isCacheNullValues());
        if (redisCacheProperties.getKeyPrefix() != null) {
   
   
            cacheManager.setUsePrefix(true);
        }
        cacheManager.setCachePrefix(this);
        List<String> cacheNames = this.cacheProperties.getCacheNames();
        if (!cacheNames.isEmpty()) {
   
   
            cacheManager.setCacheNames(cacheNames);
        }
        if (redisCacheProperties.getDefaultExpiration() != null) {
   
   
            cacheManager.setDefaultExpiration(redisCacheProperties.getDefaultExpiration());
        }
        if (!CollectionUtils
在选择使用 **Spring Cache** 还是 **手动实现 Redis 缓存** 时,需根据项目需求、开发效率、可维护性、扩展性等方面综合评估。下面是两者的对比分析和适用场景。 --- ### ✅ **Spring Cache 简介** Spring CacheSpring 提供的一套缓存抽象层,支持多种缓存实现(如 `Redis`、`Ehcache`、`Caffeine` 等),通过注解方式快速实现缓存逻辑,如: - `@Cacheable`:缓存方法返回值。 - `@CacheEvict`:清除缓存。 - `@CachePut`:更新缓存。 #### 示例: ```java @Service public class UserService { @Cacheable(value = "user", key = "#userId") public User getUserById(Long userId) { // 从数据库加载用户 return loadUserFromDB(userId); } } ``` --- ### ✅ **手动实现 Redis 缓存** 手动使用 Redis 客户端(如 `Jedis`、`Lettuce`、`RedisTemplate`)进行缓存操作,更灵活,但需要自行处理缓存的增删改查、序列化、键命名、失效时间、缓存穿透等问题。 #### 示例: ```java @Service public class UserService { @Autowired private RedisTemplate<String, User> redisTemplate; public User getUserById(Long userId) { String key = "user:" + userId; User user = redisTemplate.opsForValue().get(key); if (user == null) { user = loadUserFromDB(userId); redisTemplate.opsForValue().set(key, user, 5, TimeUnit.MINUTES); } return user; } } ``` --- ### 🔍 **对比分析** | 特性 | Spring Cache | 手动实现 Redis | |------|---------------|----------------| | **开发效率** | 高,通过注解自动管理缓存 | 低,需要手动编写缓存逻辑 | | **灵活性** | 较低,受注解限制 | 高,可以完全自定义逻辑 | | **可维护性** | 高,统一抽象层 | 中,需自行维护缓存逻辑 | | **扩展性** | 支持多缓存实现(Redis、Caffeine等) | 只能针对 Redis | | **复杂场景支持** | 对复杂逻辑支持较弱(如缓存预热、穿透、雪崩) | 可灵活处理各种缓存问题 | | **学习成本** | 低,注解方式简单 | 高,需掌握 Redis 操作细节 | --- ### ✅ **适用场景** | 场景 | 推荐方案 | |------|-----------| | 快速实现缓存功能,且逻辑简单 | ✅ Spring Cache | | 需要对缓存有精细控制(如缓存穿透处理、分布式锁等) | ✅ 手动实现 Redis | | 多种缓存策略并存(如本地+远程) | ✅ Spring Cache | | 高并发、缓存策略复杂、性能要求高 | ✅ 手动实现 Redis | --- ### ✅ 总结 - **小型项目或快速开发**:优先使用 `Spring Cache`,提升开发效率。 - **大型项目或需要精细化控制**:建议手动实现 Redis,更灵活可控。 - **折中方案**:可以结合使用,例如在通用场景用 `Spring Cache`,在关键业务中手动操作 Redis。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值