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),確保高并發下的資源復用和線程安全。