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

九、结语

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

相关推荐
ofoxcoding29 分钟前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
NeilYuen3 小时前
gRPC结合FAISS构建AI助手语义缓存模块(一):设计
人工智能·缓存·faiss
taocarts_bidfans4 小时前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts
退休倒计时6 小时前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
炘爚6 小时前
Linux——Redis
数据库·redis·缓存
csjane10796 小时前
Redisson 限流原理
java·redis
ThanksGive6 小时前
Go 服务里的 Redis 锁惊群问题:一次本地合流优化实践
redis
小挪号底迪滴7 小时前
Redis 和 MySQL 数据不一致怎么办?缓存更新策略实战
redis·mysql·缓存
闪电悠米8 小时前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua