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

九、结语

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

相关推荐
接着奏乐接着舞。8 小时前
【2026】73道Redis 常见面试题与参考答案
数据库·redis·后端·缓存
ApacheSeaTunnel11 小时前
用 Apache SeaTunnel 同步 DynamoDB 到 Redis,一个配置文件就够
redis·开源·seatunnel·数据同步·dynamodb
MetaLite14 小时前
SpringBoot防重复提交-加一把Redis锁就够吗
spring boot·redis·后端
Seraphina3615 小时前
记一次实验:利用缓存服务器规范化技术进行网页缓存欺骗
经验分享·笔记·网络安全·缓存
草莓熊Lotso2 天前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
小白勇闯网安圈2 天前
String、Hash、List、Set 四大数据结构与通用命令
redis
云存储小天使2 天前
训练效率提升50%以上:GooseFS 写缓存及其在具身智能数据处理中的应用
缓存·腾讯云·对象存储·goosefs
2601_962071172 天前
八. Spring Boot2 整合连接 Redis(超详细剖析)
spring boot·redis·后端
程序员夏洛2 天前
Redis 数据过期后的删除策略是什么?
数据库·redis·缓存
鱼鳞_2 天前
热门八股-Redis
数据库·redis·缓存