正确配置是:key统一用stringredisserializer,value按类型选择——简单值用stringredisserializer,java对象用genericjackson2jsonredisserializer;必须避免混用序列化器,否则反序列化失败或返回null。

在 Spring 中使用 RedisTemplate 实现灵活的 Redis 键值缓存操作,核心在于合理配置序列化器、掌握常用操作方法,并结合业务场景封装可复用逻辑。关键不是“能存能取”,而是“存得对、取得准、删得稳、过期可控”。
正确配置 RedisTemplate 的序列化方式
默认的 JdkSerializationRedisSerializer 会导致 key 和 value 出现乱码(如 \xac\xed\x00\x05t\x00\x03foo),且不兼容其他语言客户端。推荐统一使用 StringRedisSerializer 处理 key,value 根据类型选择:
- 简单字符串、数字:key 和 value 都用
StringRedisSerializer - Java 对象(如 User):key 用
StringRedisSerializer,value 用GenericJackson2JsonRedisSerializer(支持泛型和空值) - 注意:不要混用序列化器,否则反序列化会失败或返回 null
常用键值操作及典型用法
RedisTemplate 提供了丰富的方法,但日常高频使用的其实就几个:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
存单个值:
opsForValue().set("user:1001", user, Duration.ofHours(2))—— 支持设置过期时间 -
取单个值:
opsForValue().get("user:1001"),返回Object,需强转或用泛型封装 -
批量存取:
opsForValue().multiSet(Map.of("k1", v1, "k2", v2))、opsForValue().multiGet(Arrays.asList("k1","k2")) -
原子计数:
opsForValue().increment("counter:login", 1),适合统计类场景 -
条件写入:
opsForValue().setIfAbsent("lock:order:123", "true", Duration.ofSeconds(30)),实现简单分布式锁
封装通用缓存工具类提升复用性
直接在业务层调用 RedisTemplate 容易重复写类型转换和异常处理。建议封装一个泛型工具类,例如:
- 提供
<t> T get(String key, Class<t> clazz)</t></t>方法,内部自动做 JSON 反序列化 - 提供
set(String key, Object value, Duration timeout),统一处理 null 值与空对象校验 - 支持自定义 key 前缀(如
cache:user:),避免不同模块 key 冲突 - 对
opsForHash()、opsForSet()等结构也做类似封装,按需扩展
注意线程安全与连接资源管理
RedisTemplate 本身是线程安全的,可被多个线程共享使用(Spring 默认单例)。但要注意:
- 不要在每次操作中 new 一个
RedisTemplate,应通过@Autowired注入 - 若需不同序列化策略(如某些接口要存二进制),可配置多个
RedisTemplateBean 并用@Qualifier区分 - 连接池由
LettuceConnectionFactory或JedisConnectionFactory管理,确保配置合理的max-active和min-idle,防止连接耗尽
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










