一、Jedis
1. Jedis官网地址
https://github.com/redis/jedis
2. 快速入门
(1)引入Maven依赖
xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
(2)建立Redis直连
java
private Jedis jedis;
@BeforeEach
void setUp(){
//建立连接
jedis = new Jedis("192.168.100.129", 6379);
//设置密码
jedis.auth("1234");
//选择数据库
jedis.select(0);
}
(3)测试String类型操作
java
@Test
void testString(){
//添加
String result = jedis.set("name", "阳哥");
System.out.println(result);
//获取
String name = jedis.get("name");
System.out.println(name);
}
(4)释放连接资源
java
@AfterEach
void tearDown(){
if(jedis != null){
jedis.close();
}
}
3. Jedis连接池
使用原因
Jedis原生直连线程不安全 ;频繁创建、销毁TCP连接会产生大量性能开销,项目生产环境推荐使用Jedis连接池复用连接。
连接池工具类
java
public class JedisConnectionFactory {
private static JedisPool jedisPool;
static {
// 配置连接池参数
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8); // 最大总连接数
poolConfig.setMaxIdle(8); // 最大空闲连接数
poolConfig.setMinIdle(0); // 最小空闲连接数
poolConfig.setMaxWaitMillis(1000); // 获取连接最大等待毫秒数
// 初始化连接池
jedisPool = new JedisPool(poolConfig,
"192.168.100.129", 6379, 1000, "1234");
}
// 从连接池获取Jedis连接
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
二、SpringDataRedis
简介
SpringDataRedis是Spring家族中用于数据访问的子模块,专门封装Redis客户端操作,底层支持Lettuce (默认,基于Netty异步非阻塞)与Jedis 两种客户端,提供统一RedisTemplateAPI简化Redis各类数据类型操作。
核心能力:
- 统一封装Redis五大常用数据类型操作API
- 原生支持发布订阅、哨兵、Redis集群
- 支持响应式编程、多种序列化方案
- 提供集合封装,可直接用Java集合方式操作Redis
1. 快速入门
(1)导入依赖
xml
<!-- SpringBoot Redis Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
(2)application.yml 配置文件
yaml
spring:
data:
redis:
host: 192.168.100.129
port: 6379
password: 1234
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
(3)注入模板并测试
java
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
//写入数据
redisTemplate.opsForValue().set("name", "小王");
//获取数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}
RedisTemplate 分类API对照表
| API | 返回值类型 | 说明 |
|---|---|---|
| redisTemplate.opsForValue() | ValueOperations | 操作String字符串类型 |
| redisTemplate.opsForHash() | HashOperations | 操作Hash哈希类型 |
| redisTemplate.opsForList() | ListOperations | 操作List列表类型 |
| redisTemplate.opsForSet() | SetOperations | 操作Set无序集合类型 |
| redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet有序集合 |
| redisTemplate 本身 | RedisTemplate | 通用Redis全局命令(删除key、设置过期时间、查询key等) |
三、SpringDataRedis 序列化机制详解
1. 默认序列化规则与问题
RedisTemplate默认使用 JDK原生序列化 :
存入Redis时会把Java对象序列化为二进制字节数组,读取时再反序列化转回对象。
两大缺点
- 可读性极差 :Redis客户端查看key/value会显示乱码二进制串(对应你截图里的
\xac\xed前缀乱码),无法直观查看存储内容; - 内存冗余大 :JDK序列化会附带类路径、版本号等额外元信息,占用更多Redis存储空间。

2. 两种主流优化序列化方案
方案一:自定义RedisTemplate,全局JSON序列化
替换默认JDK序列化器,Key/HashKey使用字符串序列化 ,Value/HashValue使用Jackson JSON序列化,存入Redis为标准JSON格式,兼顾可读性与便捷性。
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(factory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置key、hashKey 序列化方式为字符串
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//设置value、hashValue 序列化方式为JSON
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
优点:直接存入Java对象,框架自动序列化/反序列化,业务代码极简;
缺点:JSON中会额外携带
@class字段记录实体类全限定名,依旧存在少量内存浪费。
方案二:使用原生 StringRedisTemplate(推荐)
SpringBoot内置StringRedisTemplate,所有key、value强制只能存储String字符串 ,无任何默认序列化乱码问题。
需要存储Java对象时,手动借助ObjectMapper完成 对象 ↔ JSON字符串 互转。
示例代码
java
// Jackson提供,负责Java对象与JSON字符串双向转换
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
void testUser(){
//创建实体对象
User user = new User("虎哥", 21);
//手动序列化:Java对象 → JSON字符串
String json = objectMapper.writeValueAsString(user);
//写入Redis
stringRedisTemplate.opsForValue().set("user:200", json);
//读取Redis字符串
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
//手动反序列化:JSON字符串 → Java对象
User user1 = objectMapper.readValue(jsonUser, User.class);
System.out.println(user1);
}
优点:Redis存储纯JSON文本,无多余字段,内存占用最小、无乱码、排查数据极其方便;
缺点:存取对象需要手动序列化与反序列化,少量增加代码量。
补充说明
ObjectMapper属于Jackson框架核心工具类,SpringBoot web依赖已自动引入,无需额外导包