stringredistemplate可实现全量纯文本无损读写,因其默认stringredisserializer以utf-8原样存取key/value,避免json序列化、class元信息及编码转换;需确保value为非null string、显式设过期时间、get直接返回string、批量用multiget,禁用对象直传与强制转型。

要用 StringRedisTemplate 实现全量纯文本 String 格式、无损读写缓存,核心是“不引入任何序列化干扰”,让 key 和 value 始终保持原始字符串形态,不自动转 JSON、不带 class 元信息、不隐式编码转换。
明确只用 StringRedisTemplate,不用 RedisTemplate
两者序列化策略不同:
- StringRedisTemplate 默认使用 StringRedisSerializer,key 和 value 都按 UTF-8 字节原样存取,适合纯文本场景。
- RedisTemplate 默认用 JDK 序列化,value 会变成二进制字节流,读出来是乱码或 ClassCastException,完全不适合文本缓存。
所以直接注入 StringRedisTemplate,不要试图给它换 serializer,也不要用 RedisTemplate 强转或混用。
写入时:确保 value 是 String,且不为空
避免传入 null 或非 String 类型(如 Integer、Map),否则会触发隐式 toString() 或序列化异常:
- 写前显式转成 String:
stringRedisTemplate.opsForValue().set("user:name", user.getName().toString()) - 禁止直接塞对象:
stringRedisTemplate.opsForValue().set("user:1001", user)❌(会调用 Object.toString(),结果不可控) - 若需缓存结构化数据(如用户信息),先手动转 JSON 字符串:
JSON.toJSONString(user),再 set;读取后用 JSON 反解析,全程保持 value 是 String - 务必设置过期时间:
set(key, value, 10, TimeUnit.MINUTES),防止长期堆积
读取时:直接 get,不做强制转型
StringRedisTemplate.opsForValue().get(key) 返回就是 String 类型,无需 cast,也绝不能强转为其他类型:
- 正确:
String name = stringRedisTemplate.opsForValue().get("user:name"); - 错误:
User u = (User) stringRedisTemplate.opsForValue().get("user:1001");❌(编译失败或 ClassCastException) - 若存的是 JSON 字符串,读取后用 JSON 工具解析:
JSON.parseObject(value, User.class) - 注意返回可能为 null(key 不存在或已过期),需判空处理
批量与边界情况处理
纯文本场景下,还要防几个典型问题:
- key 中避免空格、控制字符、\n\r;建议统一用英文冒号分隔,如
"cache:user:1001" - 批量读取用
multiGet(keys),返回List<string></string>,其中 null 表示对应 key 不存在 - 大文本(>100KB)写入前建议 gzip 压缩再存为 String(Base64 编码),否则 Redis 单 key 内存压力大、网络传输慢
- 删除用
delete(key),支持单个或集合,不会误删非 String 类型数据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











