jedis使用及注意事項
Jedis
Jedis 是(shi)一個 Java 客戶端(duan),用(yong)于與 Redis 數據庫(ku)進行交互。它(ta)提(ti)供了一系列簡單易用(yong)的 API,使(shi)得在 Java 應用(yong)程序中使(shi)用(yong) Redis 變得非常方(fang)便。以下是(shi) Jedis 的使(shi)用(yong)方(fang)法及一些(xie)注(zhu)意事項(xiang)。
Jedis的優勢
Lettuce客(ke)(ke)戶端(duan)(duan)及Jedis客(ke)(ke)戶端(duan)(duan)比較如下:
- Lettuce:
- Lettuce客戶端沒有連接保活探測,錯誤連接存在連接池中會造成請求超時報錯。
- Lettuce客戶端未實現testOnBorrow等連接池檢測方法,無法在使用連接之前進行連接校驗。
- Jedis:
- Jedis客戶端實現了testOnBorrow、testWhileIdle、testOnReturn等連接池校驗配置。
- 開啟testOnBorrow在每次借用連接前都會進行連接校驗,可靠性最高,但是會影響性能(每次Redis請求前會進行探測)。
- testWhileIdle可以在連接空閑時進行連接檢測,合理配置閾值可以及時剔除連接池中的異常連接,防止使用異常連接造成業務報錯。
- 在空閑連接檢測之前,連接出現問題,可能會造成使用該連接的業務報錯,此處可以通過參數控制檢測間隔(timeBetweenEvictionRunsMillis)。
因此,Jedis客戶端在面(mian)對連(lian)接異常(chang),網(wang)絡抖動(dong)等場景下的(de)異常(chang)處理和檢測能力明(ming)顯強于Lettuce,可靠性更(geng)強。
Jedis 使用
1. 引入依賴
如果你使用 Maven,可以在 pom.xml 中添加以下依賴:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.2.0</version> <!-- 請檢查最新版本 -->
</dependency>
2. 創建 Jedis 實例
創(chuang)建(jian)一(yi)個 Jedis 實(shi)例,連接到 Redis 服務器:
import redis.clients.jedis.Jedis;
public class JedisExample {
public static void main(String[] args) {
// 創建一個 Jedis 實例,連接到 localhost:6379
Jedis jedis = new Jedis("localhost", 6379);
// 進行身份驗證(如果需要)
// jedis.auth("your_password");
// 測試連接
System.out.println("連接成功: " + jedis.ping());
// 關閉連接
jedis.close();
}
}
3. 常用操作
- 字符串操作:
// 設置值
jedis.set("key", "value");
// 獲取值
String value = jedis.get("key");
System.out.println("獲取的值: " + value);
- 哈希操作:
// 設置哈希
jedis.hset("user:1000", "name", "Alice");
jedis.hset("user:1000", "age", "30");
// 獲取哈希
String name = jedis.hget("user:1000", "name");
System.out.println("用戶姓名: " + name);
- 列表操作:
// 添加元素到列表
jedis.lpush("mylist", "item1");
jedis.lpush("mylist", "item2");
// 獲取列表元素
List<String> list = jedis.lrange("mylist", 0, -1);
System.out.println("列表內容: " + list);
- 集合操作:
// 添加元素到集合
jedis.sadd("myset", "member1");
jedis.sadd("myset", "member2");
// 獲取集合成員
Set<String> members = jedis.smembers("myset");
System.out.println("集合成員: " + members);
注意事項
-
連接管理:
- 每次操作前創建和關閉 Jedis 實例會導致性能問題,建議使用連接池。
- 可以使用
JedisPool來管理連接。 - Jedis可以使用tr-with-resources管理資源
import redis.clients.jedis.JedisPool; import redis.clients.jedis.Jedis; public class JedisPoolExample { public static void main(String[] args) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); // 最大連接數 config.setMaxIdle(50); // 最大空閑連接數 config.setMinIdle(10); // 最小空閑連接數 config.setTestOnBorrow(true); // 在獲取連接時檢查連接有效性 config.setTestWhileIdle(true); // 在空閑時檢查連接有效性 config.setMinEvictableIdleTimeMillis(60000); // 空閑連接最小存活時間,60S config.setTimeBetweenEvictionRunsMillis(30000); // 清理線程運行時間間隔,30S JedisPool pool = new JedisPool(config, "localhost", 6379); try (Jedis jedis = pool.getResource()) { System.out.println("連接成功: " + jedis.ping()); } catch (Exception e) { e.printStackTrace(); } finally { pool.close(); } } } -
異常處理:
- 在使用 Jedis 時,應當處理可能的異常,例如連接失敗、超時等。
-
線程安全:
- Jedis 實例不是線程安全的,因此不應在多個線程之間共享同一個實例。使用連接池可以避免這個問題。
-
Redis 配置:
- 確保 Redis 服務正常運行,并根據需求調整 Redis 配置(如最大連接數、超時時間等)。
-
數據過期:
- Redis 提供了鍵的過期功能,可以通過
expire命令設置鍵的有效時間,以防止數據長時間占用內存。
- Redis 提供了鍵的過期功能,可以通過
-
監控與優化:
- 監控 Redis 性能指標(如內存使用、命令執行時間等),并根據實際情況進行優化。
連接池推薦配置
| 參數 | 配置介紹 | 配置建議 |
|---|---|---|
| maxTotal | 最大連接,單位:個 | 根據Web容器的Http線程數來進行配置,估算單個Http請求中可能會并行進行的Redis調用次數,例如:Tomcat中的Connector內的maxConnections配置為150,每個Http請求可能會并行執行2個Redis請求,在此之上進行部分預留,則建議配置至少為:150 x 2 + 100= 400 限制條件:單個Redis實例的最大連接數。maxTotal和客戶端節點數(CCE容器或業務VM數量)數值的乘積要小于單個Redis實例的最大連接數。例如:Redis主備實例配置maxClients為10000,單個客戶端maxTotal配置為500,則最大客戶端節點數量為20個。 |
| maxIdle | 最大空閑連接,單位:個 | 配置與maxTotal一致。 |
| minIdle | 最小空閑連接,單位:個 | 一般來說建議配置為maxTotal的X分之一,例如此處常規配置建議為:100。對于性能敏感的場景,為了防止經常連接數量抖動造成影響,可以配置與maxIdle一致,例如:400。 |
| maxWaitMillis | 最大獲取連接等待時間,單位:毫秒 | 獲取連接時最大的連接池等待時間,根據單次業務最長容忍的失敗時間減去執行命令的超時時間得到建議值。例如:Http最長容忍的失敗時間為15s,Redis請求的timeout設置為10s,則此處可以配置為5s。 |
| timeout | 命令執行超時時間,單位:毫秒 | 單次執行Redis命令最大可容忍的超時時間,根據業務程序的邏輯進行選擇,出于對網絡容錯等考慮建議配置為不小于210ms。特殊的探測邏輯或者環境異常檢測等,可以適當調整達到秒級。 |
| minEvictableIdleTimeMillis | 空閑連接逐出時間,大于該值的空閑連接一直未被使用則會被釋放,單位:毫秒 | 如果希望系統不會經常對連接進行斷鏈重建,此處可以配置一個較大值(xx分鐘),或者此處配置為-1并且搭配空閑連接檢測進行定期檢測。 |
| timeBetweenEvictionRunsMillis | 空閑連接探測時間間隔,單位:毫秒 | 根據系統的空閑連接數量進行估算,例如系統的空閑連接探測時間配置為30s,則代表每隔30s會對連接進行探測,如果30s內發生異常的連接,經過探測后會進行連接排除。根據連接數的多少進行配置,如果連接數太大,配置時間太短,會造成請求資源浪費。對于幾百級別的連接,常規來說建議配置為30s,可以根據系統需要進行動態調整。 |
| testOnBorrow | 向資源池借用連接時是否做連接有效性檢測(ping),檢測到的無效連接將會被移除。 | 對于業務連接極端敏感的,并且性能可以接受的情況下,可以配置為True,一般來說建議配置為False,啟用連接空閑檢測。 |
| testWhileIdle | 是否在空閑資源監測時通過ping命令監測連接有效性,無效連接將被銷毀。 | True |
| testOnReturn | 向資源池歸還連接時是否做連接有效性檢測(ping),檢測到無效連接將會被移除。 | False |
| maxAttempts | 在JedisCluster模式下,您可以配置maxAttempts參數來定義失敗時的重試次數。 | 建議配置3-5之間,默認配置為5。根據業務接口最大超時時間和單次請求的timeout綜合配置,最大配置不建議超過10,否則會造成單次請求處理時間過長,接口請求阻塞。 |