Jedis 与 Redis之间有什么区别与联系?为什么Redis命令在java中要用Jedis实现?
·
目录
概述
Jedis 与 Redis 之间的关系,涉及到客户端库(Client Library)与数据库服务器(Database Server)。
一、Redis 是什么?
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统,通常被用作:
- 高性能的缓存系统;
- 消息队列(支持发布/订阅);
- 数据库(持久化可选);
- 分布式锁等;
Redis 本身是一个独立运行的服务端程序,使用 C 语言编写,通过网络(默认端口 6379)对外提供服务。
二、Jedis 是什么?
Jedis 是一个用 Java 编写的 Redis 客户端库(Client Library)。它封装了与 Redis 服务器通信的底层细节(如网络连接、协议解析等),为 Java 开发者提供了一套简单、直观的 API 来操作 Redis。
三、Jedis 与 Redis 有哪些区别与联系?
(一)区别
| 对比项 | Redis | Jedis |
|---|---|---|
| 类型 | 服务端(Server) | 客户端库(Client Library) |
| 语言 | C 语言编写 | Java 编写 |
| 功能 | 数据存储、缓存、消息队列等 | 提供 Java API 连接和操作 Redis |
| 运行环境 | 独立运行在服务器上 | 运行在 Java 应用程序中 |
| 通信协议 | 使用 Redis 协议(RESP) | 实现了 RESP 协议,与 Redis 通信 |
| 是否必须 | 是(核心存储) | 否(Java 操作 Redis 的方式之一) |
(二)联系
- Jedis 通过 Redis 协议(RESP)与 Redis 服务器通信。
- Jedis 的所有操作最终都会转换为 Redis 命令发送给 Redis 服务器执行。例如:jedis.set(“name”, “Tom”) → 实际发送 SET name Tom 给 Redis 执行。
- Redis 是数据库服务,Jedis 是 Java 操作 Redis 的客户端工具。Java 使用 Jedis 是为了方便、高效、安全地与 Redis 通信。
四、为什么 Redis 命令在 Java 中要用 Jedis 来实现?
因为 Java 程序不能直接“理解”或“发送”Redis 命令,必须通过一个中间层来完成网络通信和协议解析。Jedis 就是这个中间层。
具体原因如下:
- 封装网络通信:
- Redis 使用 TCP 协议通信,Jedis 帮你管理连接、发送数据、接收响应,你不需要手动写 Socket 代码。
- 实现 RESP 协议:
- Redis 使用一种叫 RESP(Redis Serialization Protocol)的协议来传输命令和数据。
- Jedis 内部已经实现了这个协议的编码与解码,你只需调用 .get()、.set() 等方法即可。
- 提供简洁的 API:
- 直接使用 Java 方法操作 Redis,如:
Jedis jedis = new Jedis("localhost", 6379); jedis.set("key", "value"); String value = jedis.get("key");
- 比直接发送原始命令字符串更安全、易用。
- 连接池支持:
- Jedis 支持 JedisPool,可以复用连接,提高性能,避免频繁创建/销毁连接。
- 异常处理与重连机制:
- Jedis 提供了对网络异常、超时等的处理机制,增强程序健壮性。
五、其他 Java Redis 客户端
Jedis 并不是唯一的 Redis Java 客户端,还有:
- Lettuce:基于 Netty 的非阻塞、响应式客户端,支持 Redis 集群、哨兵等,现代 Spring 项目常用。
- Redisson:提供了分布式对象(如分布式锁、Map、Queue 等),功能更高级。
但 Jedis 因其简单、轻量、性能好,仍然是很多项目的首选。
六、类比理解
Redis 就像一家银行(提供存取服务),Jedis 就是你去银行办理业务的“柜员”或“APP”。你(Java 程序)不能直接走进金库拿钱,必须通过柜员(Jedis)来帮你和银行(Redis)沟通。
七、代码应用
(一)准备工作
- 安装并启动 Redis 服务:
- 确保你的 Redis 服务器已经安装并正在运行(默认端口 6379)。
- 你可以通过以下命令测试 Redis 是否正常运行:
redis-cli ping
# 如果返回 PONG,说明 Redis 正常
- 添加 Jedis 依赖:
如果你使用的是 Maven 项目,在 pom.xml 中添加:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.0</version> <!-- 推荐使用最新稳定版本 -->
</dependency>
如果你使用的是 Gradle,在 build.gradle 中添加:
implementation 'redis.clients:jedis:5.1.0'
(二)使用 Jedis 连接 Redis(基础示例)
示例代码:连接本地 Redis 并执行 set/get 操作。
import redis.clients.jedis.Jedis;
public class JedisExample {
public static void main(String[] args) {
// 1. 创建 Jedis 实例,连接本地 Redis
Jedis jedis = new Jedis("localhost", 6379); // 地址和端口
try {
// 2. 测试连接
String response = jedis.ping();
System.out.println("Redis 响应: " + response); // 应输出 PONG
// 3. 执行 Redis 命令
jedis.set("name", "Alice");
String name = jedis.get("name");
System.out.println("name = " + name);
// 4. 设置过期时间(可选)
jedis.expire("name", 60); // 60秒后过期
} catch (Exception e) {
e.printStackTrace();
} finally {
// 5. 关闭连接(重要!)
if (jedis != null) {
jedis.close();
}
}
}
}
(三)连接远程 Redis(带密码)
如果 Redis 设置了密码(通过 requirepass yourpassword 配置),你需要进行认证:
Jedis jedis = new Jedis("your-redis-host", 6379);
jedis.auth("yourpassword"); // 认证密码
jedis.select(0); // 选择数据库(可选,默认是 0)
(四)使用连接池(推荐用于生产环境)
频繁创建/关闭连接会影响性能。推荐使用 JedisPool 连接池来管理连接。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolExample {
private static JedisPool jedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20); // 最大连接数
config.setMaxIdle(10); // 最大空闲连接
config.setMinIdle(5); // 最小空闲连接
config.setTestOnBorrow(true); // 借出时测试连接
// 创建连接池
jedisPool = new JedisPool(config, "localhost", 6379, 2000, "yourpassword"); // 超时时间2秒,有密码
}
public static Jedis getResource() {
return jedisPool.getResource();
}
public static void main(String[] args) {
Jedis jedis = null;
try {
jedis = getResource();
System.out.println(jedis.ping());
jedis.set("user:1", "Tom");
System.out.println(jedis.get("user:1"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close(); // 不是关闭,而是归还到连接池
}
}
}
}
(五)连接步骤总结
步骤:
- 启动 Redis 服务;
- 添加 Jedis 依赖;
- 使用 new Jedis(host, port) 连接;
- 使用 auth(password) 认证(如有);
- 调用 set(), get() 等方法操作数据;
- 使用完毕调用 close() 或归还连接池。
更多推荐
所有评论(0)