Jedis快速入门

一、前言:为什么选择 Jedis?

在 Java 生态中,操作 Redis 有多个客户端可选,如 Jedis 、Lettuce 、Redisson 。

其中,Jedis 因其:

  • ✅ 轻量级(无 Netty 依赖)
  • ✅ API 简洁直观(方法名与 Redis 命令高度一致)
  • ✅ 社区成熟、文档丰富

成为许多中小型项目的首选 Redis 客户端。

本文将带你从零开始:

✅ 搭建 Jedis 环境

✅ 掌握核心 API 使用

✅ 配置连接池

✅ 避开常见坑点


二、环境准备

1. Maven 依赖(推荐最新稳定版)

XML 复制代码
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.4.7</version> <!-- 截至 2025 年主流版本 -->
</dependency>

⚠️ 注意:Jedis 4.x 要求 Java 8+ ,且默认使用 Redis 6+ 协议。

2. 启动本地 Redis 服务

确保已安装并启动 Redis:

bash 复制代码
# 启动 Redis(默认端口 6379)
redis-server

💡 若未安装,可使用 Docker 快速启动

bash 复制代码
docker run -d --name redis -p 6379:6379 redis:7.0

三、快速上手:单连接操作

⚠️ 仅用于测试!生产环境必须用连接池

java 复制代码
import redis.clients.jedis.Jedis;

public class JedisDemo {
    public static void main(String[] args) {
        // 1. 创建 Jedis 对象(默认 localhost:6379)
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            
            // 2. 测试连接
            System.out.println("Redis 连接状态: " + jedis.ping()); // 输出 PONG

            // 3. String 操作
            jedis.set("name", "张三");
            System.out.println("name = " + jedis.get("name"));

            // 4. Hash 操作
            jedis.hset("user:1001", "age", "25");
            jedis.hset("user:1001", "city", "北京");
            System.out.println("用户城市: " + jedis.hget("user:1001", "city"));

            // 5. List 操作
            jedis.lpush("tasks", "task1", "task2");
            System.out.println("任务列表: " + jedis.lrange("tasks", 0, -1));

            // 6. 设置过期时间(秒)
            jedis.expire("name", 10); // 10秒后自动删除
        }
    }
}

✅ 关键点:

  • 使用 try-with-resources 自动关闭连接
  • 方法命名与 Redis CLI 命令几乎一致(如 set → SET)

四、生产必备:配置连接池(JedisPool)

直接创建 Jedis 对象会频繁建立/销毁 TCP 连接,性能极差!
必须使用 JedisPool 连接池。

1. 创建连接池工具类

java 复制代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolUtil {
    private static JedisPool jedisPool;

    static {
        // 配置连接池参数
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);          // 最大连接数
        config.setMaxIdle(10);           // 最大空闲连接
        config.setMinIdle(2);            // 最小空闲连接
        config.setMaxWaitMillis(2000);   // 获取连接最大等待时间(ms)
        config.setTestOnBorrow(true);    // 借出连接时测试连通性

        // 创建连接池(无密码)
        jedisPool = new JedisPool(config, "localhost", 6379, 2000);
        
        // 若有密码,使用:
        // jedisPool = new JedisPool(config, "localhost", 6379, 2000, "your_password");
    }

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

    public static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close(); // 归还连接到池
        }
    }
}

2. 使用连接池操作 Redis

java 复制代码
public class UserService {
    public void saveUser(String userId, String name) {
        Jedis jedis = null;
        try {
            jedis = JedisPoolUtil.getJedis();
            jedis.hset("user:" + userId, "name", name);
            System.out.println("用户保存成功");
        } finally {
            JedisPoolUtil.close(jedis);
        }
    }
}

✅ 最佳实践:

  • jedis.close() 不是关闭连接,而是归还到连接池
  • 必须放在 finally 块中,防止连接泄漏

五、常用数据类型操作示例

Redis 类型 Jedis 方法示例
String set(key, value), get(key), incr(key)
Hash hset(key, field, value), hget(key, field), hgetAll(key)
List lpush(key, values...), rpop(key), lrange(key, start, end)
Set sadd(key, members...), smembers(key), sismember(key, member)
Sorted Set zadd(key, score, member), zrevrange(key, 0, 9), zscore(key, member)

示例:实现排行榜(ZSet)

java 复制代码
Jedis jedis = JedisPoolUtil.getJedis();
try {
    // 添加玩家分数
    jedis.zadd("game:rank", 95.0, "playerA");
    jedis.zadd("game:rank", 98.0, "playerB");

    // 获取 Top 3
    Set<String> top3 = jedis.zrevrange("game:rank", 0, 2);
    System.out.println("Top 3: " + top3);
} finally {
    JedisPoolUtil.close(jedis);
}

六、Spring Boot 中集成 Jedis(可选)

虽然 Spring Boot 官方推荐 Lettuce,但你仍可手动集成 Jedis:

1. 排除默认 Lettuce

java 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2. 配置 application.yml

java 复制代码
spring:
  redis:
    host: localhost
    port: 6379
    password: 
    jedis:
      pool:
        max-active: 20
        max-idle: 10
        min-idle: 2
        max-wait: 2000ms

🔔 但注意:Spring Data Redis 对 Jedis 的支持不如 Lettuce 完善,新项目建议优先考虑 Lettuce。


七、常见问题与避坑指南

❌ 坑 1:忘记关闭 Jedis 连接

后果 :连接池耗尽,系统卡死
解决 :始终用 try-finally 或 try-with-resources

❌ 坑 2:在多线程中共享同一个 Jedis 实例

原因 :Jedis 不是线程安全 的!
正确做法:每个线程从连接池获取独立实例

❌ 坑 3:存储大 Value(如 10MB JSON)

风险 :阻塞 Redis 单线程,影响其他请求
建议:Value 控制在 10KB 以内,大对象考虑压缩或分片


八、Jedis vs Lettuce:如何选择?

特性 Jedis Lettuce
线程安全 ❌ 否 ✅ 是(基于 Netty)
性能 高(轻量) 高(异步非阻塞)
资源占用 低 较高(Netty 开销)
Spring Boot 默认 否 ✅ 是
适用场景 中小型项目、简单场景 高并发、响应式编程

📌 建议:

  • 学习/小项目 → Jedis(简单直观)
  • 企业级/高并发 → Lettuce

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
Fatbobman(东坡肘子)2 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
温暖小土3 小时前
在 CentOS 上安装 Redis Stack
linux·redis·centos
Mikko76 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
无言听风雨丶6 小时前
Redis 运维实战与排错
运维·数据库·redis
字节探索11 小时前
Redis 分布式锁:从 SETNX 误删到看门狗自动续期的原理与实践
redis·分布式
真上帝的左手12 小时前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件
bksczm12 小时前
C++Redis开发(Ubuntu 22.04)
数据库·redis·缓存
goehou13 小时前
缓存该删还是该改,LLM 服务里的双写问题
redis·缓存·llm·一致性·系统设计
余槐i13 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化
IT规划师14 小时前
Redis 数据类型全解 - ZSet:两个编码,七种玩法(五)
redis·.net