0
0
0

Jedis 与 Spring Data Redis 学习笔记

2021-02-24
2026-10-23
文章摘要
|

一、Jedis 与 Spring Data Redis

  • Jedis:Java Redis 客户端,提供与 Redis 命令对应的 API。

  • Spring Data Redis:Spring 生态中的 Redis 操作抽象,提供
    RedisTemplate 等工具,可配合 Jedis 或 Lettuce 使用。

  • 线程安全:单个 Jedis 实例不应被多个线程共享,生产环境通常使用
    JedisPool 管理连接。Spring Boot 常见版本默认使用
    Lettuce,具体取决于版本和依赖。

Jedis、Spring Data Redis、Jackson 都是外部依赖,不是 Java 8 自带的。

二、RedisTemplate 常用操作

方法 Redis 类型 常见用途


opsForValue() String 字符串、计数器
opsForHash() Hash 对象字段
opsForList() List 列表、队列
opsForSet() Set 去重集合
opsForZSet() ZSet 排行榜

三、为什么 Redis 中会出现乱码?

Redis 最终存储的是字节数据,Java 数据需要经过序列化器转换后才能写入。

常见情况下,RedisTemplate 默认使用 JDK 原生序列化,所以在 Redis
客户端中查看时可能出现不可读的二进制内容。这不是没有序列化,而是使用了
JDK 序列化格式。

JDK 原生序列化通常不作为新项目业务缓存的首选,原因包括: -
数据不方便直接查看和调试; - 与 Java
类及序列化规则耦合较强,类名或结构变化可能影响旧数据读取; -
可能产生额外数据开销; - 反序列化不可信数据存在安全风险。

四、对象存储推荐使用 JSON

常见做法有两种:

  1. 使用 StringRedisTemplate,先通过 Jackson 将对象转换为 JSON
    字符串,再存入 Redis。

  2. 使用配置了 JSON 序列化器的 RedisTemplate,由模板自动完成转换。

示例:StringRedisTemplate + Jackson

假设项目已有 User 类,且 Spring 容器中已配置 ObjectMapper:

// 保存对象
String json = objectMapper.writeValueAsString(user);
stringRedisTemplate.opsForValue().set("user:1001", json);

// 读取对象
String value = stringRedisTemplate.opsForValue().get("user:1001");
User user = value == null ? null
        : objectMapper.readValue(value, User.class);

Redis 中的值会是类似下面的 JSON:

{"id":1001,"name":"Tom"}

StringRedisTemplate 不会自动将 Java 对象转换为
JSON
;对象需要先转成 JSON 字符串。Jackson 不是 Java 8 自带的,Spring
Boot Web 项目通常已引入相关依赖。

五、StringRedisTemplate 与 RedisTemplate 怎么选?

存字符串、Token、验证码 StringRedisTemplate
存对象,希望数据可读 StringRedisTemplate + Jackson
希望直接存取 Java 对象 配置 JSON 序列化器的 RedisTemplate

两者的关键区别在于默认序列化方式。StringRedisTemplate 是
RedisTemplate<String, String> 的专用实现。

六、面试速记

  • Jedis 是什么? Java Redis 客户端;单个 Jedis
    实例不应被多个线程共享,常用连接池管理连接。

  • Spring Data Redis 是什么? Spring 的 Redis
    操作抽象,RedisTemplate 是常用模板。

  • RedisTemplate 为什么可能显示乱码? 常见原因是默认使用 JDK
    原生序列化,数据以二进制形式存储。

  • StringRedisTemplate 会自动转 JSON 吗? 不会;需手动用 Jackson
    转换,或给 RedisTemplate 配置 JSON 序列化器。

  • 为什么常选 JSON?
    可读性好、方便调试、跨语言更方便;但字段和数据格式变更仍需考虑兼容性。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论