关于 Spring自定义缓存管理器 的详细说明,包含两种实现方式的对比和代码示例,并附表格总结

以下是关于 Spring自定义缓存管理器 的详细说明,包含两种实现方式的对比和代码示例,并附表格总结:


1. 自定义缓存管理器的两种方法

方法1:通过配置文件调整RedisCacheManager

适用场景 :简单配置,如修改键前缀、超时时间等。
原理 :基于Spring Boot的自动配置,通过修改application.properties参数实现。

方法2:完全自定义代码创建RedisCacheManager

适用场景 :复杂自定义(如自定义序列化器、多级缓存、动态配置等)。
原理 :通过@Bean显式创建RedisCacheManager实例,完全控制配置。


2. 方法1:通过配置文件消除键前缀并设置超时时间

步骤
  1. 禁用键前缀 :设置spring.cache.redis.key-prefix=为空。
  2. 设置全局超时时间 :通过spring.cache.redis.time-to-live配置。
配置示例
properties 复制代码
# application.properties
spring.cache.type=redis
spring.cache.redis.key-prefix= # 禁用前缀
spring.cache.redis.time-to-live=1800000 # 全局超时时间:30分钟
效果
  • 缓存键无前缀(如直接使用user:1001)。
  • 所有缓存项默认过期时间为30分钟。

3. 方法2:完全自定义代码创建RedisCacheManager

步骤
  1. 创建配置类 :通过@Bean定义RedisCacheManager
  2. 配置序列化器、超时时间等 :使用RedisCacheConfiguration
代码示例
java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.*;

import java.time.Duration;

@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 1. 定义缓存配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 键序列化为字符串
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // 值序列化为JSON
                .entryTtl(Duration.ofMinutes(30)); // 默认超时时间30分钟

        // 2. 禁用键前缀
        config = config.prefixCacheNameWithFalse(); // 关键代码:禁用前缀

        // 3. 创建RedisCacheManager
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(config)
                .build();
    }
}
关键点
  • 禁用前缀prefixCacheNameWithFalse()
  • 自定义序列化 :如StringRedisSerializerGenericJackson2JsonRedisSerializer
  • 动态配置 :可为不同缓存设置不同的超时时间(如通过RedisCacheWriter)。

4. 对比表格

方法 适用场景 配置方式 代码示例片段 是否支持复杂自定义
配置文件调整 简单配置(前缀、超时) 修改application.properties spring.cache.redis.key-prefix=
自定义代码 复杂配置(序列化、多级缓存) 通过@Bean显式创建RedisCacheManager RedisCacheConfiguration config = ...

5. 关键配置参数说明

方法1(配置文件)
参数 描述 示例值
spring.cache.redis.key-prefix 缓存键的全局前缀(设为空禁用) ""(禁用前缀)
spring.cache.redis.time-to-live 全局缓存过期时间(毫秒) 1800000(30分钟)
方法2(代码配置)
参数 描述 示例值
serializeKeysWith() 自定义键的序列化方式 StringRedisSerializer
serializeValuesWith() 自定义值的序列化方式 GenericJackson2JsonRedisSerializer
entryTtl() 设置默认超时时间 Duration.ofMinutes(30)
prefixCacheNameWith() 启用/禁用缓存名称作为前缀(如prefixCacheNameWithFalse()禁用) prefixCacheNameWithFalse()

6. 注意事项

  1. 方法1的局限性

    • 仅能通过有限的配置参数调整(如前缀、超时),无法自定义序列化器或复杂逻辑。
    • 全局配置可能覆盖单个缓存的自定义设置。
  2. 方法2的优势

    • 完全控制配置(如多级缓存、动态超时)。
    • 需要依赖注入RedisConnectionFactoryRedisTemplate
  3. 禁用键前缀的注意事项

    • 确保缓存键唯一,避免不同业务的键冲突。
    • 若需多级缓存,可通过cacheManager(builder -> builder.withCacheConfiguration(...))为不同缓存命名空间设置前缀。

7. 完整代码示例(方法2)

java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
        // 1. 定义默认配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30))
                .serializeKeysWith(SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .prefixCacheNameWithFalse(); // 禁用前缀

        // 2. 为特定缓存设置不同配置(可选)
        config = config.disableCachingNullValues(); // 禁止缓存空值

        // 3. 创建缓存管理器
        return RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
    }
}

总结

通过上述两种方法,可以灵活控制Redis缓存管理器的配置。对于简单需求,优先使用配置文件调整;对于复杂场景(如自定义序列化、多级缓存),推荐通过代码完全自定义。

相关推荐
兰亭序咖啡3 分钟前
学透Spring Boot — 014. Spring MVC的自动配置
spring boot·spring·mvc
兰亭序咖啡29 分钟前
学透Spring Boot — 018. 优雅支持多种响应格式
java·spring boot·后端
小雨凉如水33 分钟前
docker 常用命令
java·docker·eureka
高山流水&上善1 小时前
医药档案区块链系统
java·springboot
南汐以墨1 小时前
探秘JVM内部
java·jvm
Craaaayon1 小时前
Java八股文-List集合
java·开发语言·数据结构·list
西元.1 小时前
详解 Redis repl_backlog_buffer(如何判断增量同步)
数据库·redis·缓存
信徒_2 小时前
Spring 怎么解决循环依赖问题?
java·后端·spring
2301_794461572 小时前
多线程编程中的锁策略
java·开发语言
老华带你飞2 小时前
木里风景文化|基于Java+vue的木里风景文化管理平台的设计与实现(源码+数据库+文档)
java·数据库·vue.js·毕业设计·论文·风景·木里风景文化管理平台