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

九、结语

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

相关推荐
Database_Cool_39 分钟前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙1 小时前
【Redis】1.Redis特性
数据库·redis·缓存
chexus1 小时前
21. 深入 Nginx HTTP 缓存源码:CDN功能
nginx·http·缓存
二宝哥14 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
时空无限19 小时前
vllm 缓存对模型启动时间的影响
缓存·vllm
ShiXZ21320 小时前
Redis docker-compose 部署指南
redis·docker·eureka
青山木1 天前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS8291 天前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
咏方舟【长江支流】1 天前
【开源】跨语言·跨平台·跨数据库(6) ——一种ORM缓存的接口实现和容错处理
数据库·缓存·开源·咏方舟-长江支流·用宝框架
爬也要爬着前进2 天前
redis主从搭建
数据库·redis·缓存