Jedis快速入门

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

在 Java 生态中,操作 Redis 有多个客户端可选,如 JedisLettuceRedisson

其中,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 命令几乎一致(如 setSET

四、生产必备:配置连接池(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-finallytry-with-resources

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

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

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

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


八、Jedis vs Lettuce:如何选择?

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

📌 建议

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

九、结语

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

相关推荐
IT大白鼠1 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz1 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
全栈弄潮儿²⁰²⁴1 天前
AI Agent 开发实战(30):限流、缓存与成本控制
人工智能·gpt·缓存·agent·限流·agi·成本控制
lbb 小魔仙1 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
夕除1 天前
redis--018
redis
两锭子1 天前
Redis基础
redis
烟沙九洲1 天前
Redis 缓存穿透、缓存击穿、缓存雪崩
数据库·redis
字节探索1 天前
Redis 只会当缓存用?这 10 大实战场景,让你的系统快到飞起
redis·后端
于樱花森上飞舞2 天前
【Redis】哨兵详解
java·开发语言·数据库·redis
Rain的Java大神之路2 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试