Redis學習(四)之“Redis實際應用”
阿新 • • 發佈:2021-01-05
1 Redis 客戶端
1.1 客戶端通訊原理
客戶端和伺服器通過 TCP 連線來進行資料互動, 伺服器預設的埠號為 6379 。 客戶端和伺服器傳送的命令或資料一律以 \r\n (CRLF 回車+換行)結尾。
抓包抓到的格式:
*2\r\n$3\r\nGET\r\n$8\r\nxhc\r\n
客戶端跟 Redis 之間 使用一種特殊的編碼格式(在 AOF 檔案裡面我們看到了),叫做 Redis Serialization Protocol (Redis 序列化協議)。特點:容易實現、解析快、可讀性強。客戶端發給服務端的訊息需要經過編碼,服務端收到之後會按約定進行解碼,反之亦然。
基於此,我們可以自己實現一個 Redis 客戶端。
步驟
- 建立 Socket 連線
- OutputStream 寫入資料(傳送到服務端)
- InputStream 讀取資料(從服務端介面)
基於這種協議,我們可以用 Java 實現所有的 Redis 操作命令。當然,我們不需要這麼做,因為已經有很多比較成熟的 Java 客戶端,實現了完整的功能和高階特性,並且提供了良好的效能。
官網推薦的 Java 客戶端有 3 個 Jedis,Redisson 和 Luttuce。
- Jedis : 一個非常小的而可靠的java客戶端
- lettuce:用於執行緒安全同步、非同步和反應式使用的高階Redis客戶端。支援群集、Sentinel、流水線和編解碼器
- Redisson:Redis伺服器上的分散式可擴充套件Java資料結構
1.2 Jedis
1.2.1 特點
Jedis 是我們最熟悉和最常用的客戶端。輕量,簡潔,便於整合和改造。
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("xhc", "666");
System.out.println(jedis.get("xhc"));
jedis.close ();
}
在Jedis中,多個執行緒使用一個連線的時候執行緒不安全。可以使用連線池,為每個請求建立不同的連線,基於 Apache common pool 實現。跟資料庫一樣,可以設定最大連線數等引數。Jedis 中有多種連線池的子類。
例如:ShardingTest.java
public static void main(String[] args) {
JedisPool pool = new JedisPool("192.168.1.102", 6379);
Jedis jedis = pool.getResource();
}
Jedis 有 4 種工作模式:
- 單節點
- 分片
- 哨兵
- 叢集
Jedis 有3種請求模式:
- Client模式:Client 模式就是客戶端傳送一個命令,阻塞等待服務端執行,然後讀取返回結果。
- Pipeline模式:Pipeline 模式是一次性發送多個命令,最後一次取回所有的返回結果,這種模式通過減少網路的往返時間和 io 讀寫次數,大幅度提高通訊效能。
- 事務模式:Transaction 模式即開啟 Redis 的事務管理,事務模式開啟後,所有的命令(除了 exec,discard,multi 和 watch)到達服務端以後不會立即執行,會進入一個等待佇列。