Jedis是Redis官方推荐的Java客户端库,提供了对Redis数据库的全面支持,适用于单机、哨兵及集群模式。作为最老牌的Java Redis客户端,其API设计直观,与Redis命令高度对应,例如set、get等方法与原生命令一致,降低了学习成本。
简单使用
引入依赖:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version>
</dependency>
使用示例:
package com.morris.redis.demo.jedis;import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Map;/*** jedis的简单使用*/
public class JedisDemo {public static void main(String[] args) {// 创建Jedis实例(默认端口6379)try (Jedis jedis = new Jedis("127.0.0.1", 6380)) {// 若需认证(如设置密码)// jedis.auth("your_password");// 字符串类型的使用jedis.set("key1", "value1"); // 设置键值String value = jedis.get("key1"); // 获取值(返回"value1")jedis.incr("counter"); // 自增数值(可用于计数器场景)// hash类型的使用jedis.hset("user:1", "name", "John"); // 设置哈希字段String name = jedis.hget("user:1", "name"); // 获取字段值Map<String, String> user = jedis.hgetAll("user:1"); // 获取全部字段// list类型的使用jedis.rpush("list1", "element1", "element2"); // 右侧插入元素List<String> list = jedis.lrange("list1", 0, -1); // 获取全部元素String popped = jedis.lpop("list1"); // 左侧弹出元素// 测试连接System.out.println("连接状态: " + jedis.ping()); // 输出"PONG"表示成功} // try-with-resources自动关闭连接}
}
连接池优化(推荐生产环境使用)
Jedis使用连接池的核心目的是解决直连模式下的性能瓶颈与资源管理问题。由于每次直连Redis都需新建TCP连接(三次握手)并在操作后关闭(四次挥手),高频请求时网络延迟占比可能高达97%,而连接池通过复用已建立的连接,将单次操作耗时从40ms级降至微秒级。此外,Jedis实例非线程安全,连接池为每个线程分配独立连接,规避多线程竞争风险。
package com.morris.redis.demo.jedis;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** jedis连接池的使用*/
public class JedisPoolDemo {public static void main(String[] args) {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(400); // 最大连接数config.setMaxIdle(400); // 最大空闲连接config.setMinIdle(100); // 最小空闲连接config.setMaxWaitMillis(5000); // 最大等待5秒config.setTestOnBorrow(false); // 禁用借出检测config.setTestWhileIdle(true); // 开启空闲检测config.setTimeBetweenEvictionRunsMillis(30000); // 每30秒检测空闲连接config.setLifo(false); // 使用FIFO均衡负载try (JedisPool pool = new JedisPool(config, "127.0.0.1", 6379)) {Jedis jedis = pool.getResource();jedis.set("xx", "oo");System.out.println(jedis.get("xx"));// 执行操作...jedis.close(); // 归还连接到池}}
}
与SpringBoot的结合使用
需在pom.xml中添加spring-boot-starter-data-redis和Jedis客户端依赖,并排除默认的Lettuce客户端(也可以不排除,但是需要在配置文件中需要指定client-type)。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
在application.yml中配置Redis服务器地址及连接池参数,指定client-type为jedis。
spring:data:redis:host: 127.0.0.1port: 6379
# password: your_passwordjedis:pool:max-active: 200 # 最大活跃连接数max-idle: 100 # 最大空闲连接min-idle: 50 # 最小空闲连接max-wait: 3000ms # 获取连接最大等待时间client-type: jedis # 需要手动指定jedis,否则默认是lettuce
RedisTemplate序列化配置,自定义RedisTemplate以避免默认的JDK序列化问题:
package com.morris.redis.demo.jedis;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setConnectionFactory(factory);return template;}
}
RedisTemplate的使用:
package com.morris.redis.demo.jedis;import com.morris.redis.demo.RedisDemoApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;/*** RedisTemplate的使用*/
@SpringBootApplication
public class JedisSpringBootDemo {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(JedisSpringBootDemo.class, args);RedisTemplate redisTemplate = (RedisTemplate) applicationContext.getBean("redisTemplate");redisTemplate.opsForValue().set("oo", "xx");System.out.println(redisTemplate.opsForValue().get("oo"));applicationContext.close();}
}
jedis哨兵模式的使用
Jedis配置哨兵模式下的Redis地址需通过哨兵节点列表和主节点名称实现,并结合连接池参数优化。
spring:data:redis:sentinel:master: mymasternodes: 127.0.0.1:16380,127.0.0.1:16381,127.0.0.1:16382jedis:pool:max-active: 200 # 最大活跃连接数max-idle: 100 # 最大空闲连接min-idle: 50 # 最小空闲连接max-wait: 3000ms # 获取连接最大等待时间client-type: jedis # 需要手动指定jedis,否则默认是lettuce
jedis cluster的使用
配置文件中配置集群节点:
spring:data:redis:jedis:pool:max-active: 200 # 最大连接数max-idle: 100 # 最大空闲连接数min-idle: 50 # 最小空闲连接数max-wait: 3000ms # 获取连接的最大等待时间client-type: jedis # 客户端类型使用 jedis(默认是 lettuce)# redis集群模式cluster:nodes: 127.0.0.1:3001,127.0.0.1:3002,127.0.0.1:3003max-redirects: 5
Jedis在初始化时,通过cluster slots命令获取集群中所有槽与节点的对应关系,并将这些信息缓存在本地(JedisClusterInfoCache类中)。每次操作时,客户端直接根据本地缓存确定Key所属的槽及对应的节点,无需依赖服务端重定向。
如果请求发送到错误的节点(如槽迁移或节点故障),Redis会返回MOVED错误,此时Jedis会重新执行cluster slots命令更新本地映射,并重试请求。默认最多重试5次,超过则抛出Too many cluster redirection异常。
Jedis为每个Redis节点创建独立的连接池(JedisPool),确保高并发下的资源复用和线程安全。