概述

Jedis 与 Redis 之间的关系,涉及到客户端库(Client Library)与数据库服务器(Database Server)。

一、Redis 是什么?

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统,通常被用作:

  1. 高性能的缓存系统;
  2. 消息队列(支持发布/订阅);
  3. 数据库(持久化可选);
  4. 分布式锁等;
    Redis 本身是一个独立运行的服务端程序,使用 C 语言编写,通过网络(默认端口 6379)对外提供服务。

二、Jedis 是什么?

Jedis 是一个用 Java 编写的 Redis 客户端库(Client Library)。它封装了与 Redis 服务器通信的底层细节(如网络连接、协议解析等),为 Java 开发者提供了一套简单、直观的 API 来操作 Redis。

三、Jedis 与 Redis 有哪些区别与联系?

(一)区别

对比项RedisJedis
类型服务端(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 就是这个中间层。
具体原因如下:

  1. 封装网络通信:
  • Redis 使用 TCP 协议通信,Jedis 帮你管理连接、发送数据、接收响应,你不需要手动写 Socket 代码。
  1. 实现 RESP 协议:
  • Redis 使用一种叫 RESP(Redis Serialization Protocol)的协议来传输命令和数据。
  • Jedis 内部已经实现了这个协议的编码与解码,你只需调用 .get()、.set() 等方法即可。
  1. 提供简洁的 API:
  • 直接使用 Java 方法操作 Redis,如:
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("key", "value");
String value = jedis.get("key");
  • 比直接发送原始命令字符串更安全、易用。
  1. 连接池支持:
  • Jedis 支持 JedisPool,可以复用连接,提高性能,避免频繁创建/销毁连接。
  1. 异常处理与重连机制:
  • Jedis 提供了对网络异常、超时等的处理机制,增强程序健壮性。

五、其他 Java Redis 客户端

Jedis 并不是唯一的 Redis Java 客户端,还有:

  1. Lettuce:基于 Netty 的非阻塞、响应式客户端,支持 Redis 集群、哨兵等,现代 Spring 项目常用。
  2. Redisson:提供了分布式对象(如分布式锁、Map、Queue 等),功能更高级。

但 Jedis 因其简单、轻量、性能好,仍然是很多项目的首选。

六、类比理解

Redis 就像一家银行(提供存取服务),Jedis 就是你去银行办理业务的“柜员”或“APP”。你(Java 程序)不能直接走进金库拿钱,必须通过柜员(Jedis)来帮你和银行(Redis)沟通。

七、代码应用

(一)准备工作

  1. 安装并启动 Redis 服务:
  • 确保你的 Redis 服务器已经安装并正在运行(默认端口 6379)。
  • 你可以通过以下命令测试 Redis 是否正常运行:
redis-cli ping
# 如果返回 PONG,说明 Redis 正常
  1. 添加 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(); // 不是关闭,而是归还到连接池
            }
        }
    }
}

(五)连接步骤总结

步骤:

  1. 启动 Redis 服务;
  2. 添加 Jedis 依赖;
  3. 使用 new Jedis(host, port) 连接;
  4. 使用 auth(password) 认证(如有);
  5. 调用 set(), get() 等方法操作数据;
  6. 使用完毕调用 close() 或归还连接池。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐