| 对比项 | Jedis | Spring Data Redis |
|---|---|---|
| 层级 | 底层客户端驱动 | Spring 高层封装框架 |
| API 风格 | 原生 API,jedis.set()、get(),命令和 redis 命令几乎一一对应 |
RedisTemplate,序列化封装,opsForValue/opsForHash 等 |
| 连接模型 | 阻塞 IO,需要手动维护连接池(JedisPool) | 底层驱动决定;用 Jedis 则使用 JedisPool;Lettuce 是 Netty 非阻塞,单连接多线程安全 |
| 线程安全 | Jedis 实例非线程安全,不能多线程共用同一个 Jedis 对象,必须从池里拿连接 | RedisTemplate 是线程安全,可以单例注入使用 |
| 序列化 | 需要自己手动序列化 / 反序列化(对象转字符串) | 自带序列化器(JdkSerializationRedisSerializer,坑很多,项目一般改成 Jackson2JsonRedisSerializer) |
| 使用场景 | 原生开发,精细控制底层 Redis 命令 | SpringBoot 项目,快速集成 Redis,主流企业方案 |
Redis Java 客户端
一、Redis Java 客户端概述
Redis 的 Java 客户端有多种实现,常用的主流方案分为两类:
- Jedis:Redis 官方推出的 Java 客户端,提供与原生 Redis 命令一一对应的 API。
- Spring Data Redis:Spring 生态的组成部分,对 Redis 底层客户端进行高度封装,在 Spring 项目中可大幅简化 Redis 开发。
二、Jedis 客户端
Jedis 是 Redis 官方提供的原生 Java 客户端,直接封装 Redis 命令,使用方式与命令行操作高度一致。
1. Maven 依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2. 基础使用示例
写入数据
@Test
public void testSet() {
// 1. 连接 Redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2. 操作 Redis
jedis.set("name", "张三");
// 3. 关闭连接
jedis.close();
}
读取数据
@Test
public void testGet() {
// 1. 连接 Redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2. 操作 Redis
String name = jedis.get("name");
System.out.println(name);
// 3. 关闭连接
jedis.close();
}
三、Spring Data Redis
Spring Data Redis 是 Spring 生态的组成部分,在 Spring Boot 项目中通过简单配置即可访问 Redis,对底层 Jedis 客户端做了高度封装。核心类为 RedisTemplate,提供了统一的操作 API、异常处理、序列化机制以及发布订阅等能力。
核心封装特性
- 自动管理连接池,提供高度封装的
RedisTemplate工具类 - 按数据类型对 API 进行归类封装,对应不同的操作接口:
ValueOperations:字符串(简单 Key-Value)操作HashOperations:哈希(Map 类型)数据操作ListOperations:列表类型数据操作SetOperations:集合类型数据操作ZSetOperations:有序集合类型数据操作
1. Maven 依赖
Spring Boot 项目直接引入启动器:
<!-- Spring Data Redis 启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置文件(application.yml)
spring:
data:
redis:
host: 127.0.0.1
port: 6379
database: 0
3. ValueOperations:字符串(Key-Value)操作
@SpringBootTest
public class TestValueOperations {
@Autowired
private RedisTemplate redisTemplate;
/**
* 写入数据
*/
@Test
public void setValue() {
redisTemplate.opsForValue().set("name", "gao1");
}
/**
* 读取数据
*/
@Test
public void getValue() {
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name);
}
/**
* 删除数据
*/
@Test
public void deleteValue() {
redisTemplate.delete("name");
}
}
4. ListOperations:列表类型操作
@SpringBootTest
public class TestListOperations {
@Autowired
private RedisTemplate redisTemplate;
/**
* 右压栈:后添加的元素排在列表尾部
*/
@Test
public void testRightPush() {
redisTemplate.opsForList().rightPush("nameList1", "刘备");
redisTemplate.opsForList().rightPush("nameList1", "关羽");
redisTemplate.opsForList().rightPush("nameList1", "张飞");
}
/**
* 获取右压栈列表全部元素
*/
@Test
public void testGetRightList() {
// 0 表示第一个元素,-1 表示最后一个元素
List list = redisTemplate.opsForList().range("nameList1", 0, -1);
System.out.println(list);
}
/**
* 左压栈:后添加的元素排在列表头部
*/
@Test
public void testLeftPush() {
redisTemplate.opsForList().leftPush("nameList2", "刘备");
redisTemplate.opsForList().leftPush("nameList2", "关羽");
redisTemplate.opsForList().leftPush("nameList2", "张飞");
}
/**
* 获取左压栈列表全部元素
*/
@Test
public void testGetLeftList() {
List list = redisTemplate.opsForList().range("nameList2", 0, -1);
System.out.println(list);
}
/**
* 根据索引查询元素
*/
@Test
public void testSearchByIndex() {
String s = (String) redisTemplate.opsForList().index("nameList1", 1);
System.out.println(s);
}
/**
* 移除列表中指定元素
*/
@Test
public void testRemoveByValue() {
redisTemplate.opsForList().remove("nameList1", 1, "关羽");
}
}
5. HashOperations:哈希(Map)类型操作
@SpringBootTest
public class TestHashOperations {
@Autowired
private RedisTemplate redisTemplate;
/**
* 写入哈希字段
*/
@Test
public void testSetValue() {
redisTemplate.opsForHash().put("nameHash", "a", "唐僧");
redisTemplate.opsForHash().put("nameHash", "b", "悟空");
redisTemplate.opsForHash().put("nameHash", "c", "八戒");
redisTemplate.opsForHash().put("nameHash", "d", "沙僧");
}
/**
* 获取所有字段名
*/
@Test
public void testGetKeys() {
Set keys = redisTemplate.opsForHash().keys("nameHash");
System.out.println(keys);
}
/**
* 获取所有字段值
*/
@Test
public void testGetValues() {
List values = redisTemplate.opsForHash().values("nameHash");
System.out.println(values);
}
/**
* 根据字段名获取值
*/
@Test
public void testGetValueByKey() {
Object object = redisTemplate.opsForHash().get("nameHash", "b");
System.out.println(object);
}
/**
* 删除指定字段
*/
@Test
public void testRemoveByKey() {
redisTemplate.opsForHash().delete("nameHash", "c");
}
}
6. SetOperations:集合类型操作
@SpringBootTest
public class TestSetOperations {
@Autowired
private RedisTemplate redisTemplate;
/**
* 向集合添加元素
*/
@Test
public void setValue() {
redisTemplate.opsForSet().add("nameSet", "操作");
redisTemplate.opsForSet().add("nameSet", "刘备");
redisTemplate.opsForSet().add("nameSet", "孙权");
}
/**
* 获取集合所有元素
*/
@Test
public void getValue() {
Set members = redisTemplate.opsForSet().members("nameSet");
System.out.println(members);
}
/**
* 删除集合中指定元素
*/
@Test
public void deleteValue() {
redisTemplate.opsForSet().remove("nameSet", "孙权");
}
/**
* 删除整个集合
*/
@Test
public void deleteAllValue() {
redisTemplate.delete("nameSet");
}
}