1. 程式人生 > 其它 >Redis學習(四)之“Redis實際應用”

Redis學習(四)之“Redis實際應用”

技術標籤:Redisredis

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 客戶端。
步驟

  1. 建立 Socket 連線
  2. OutputStream 寫入資料(傳送到服務端)
  3. 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)到達服務端以後不會立即執行,會進入一個等待佇列。

1.2.2 Sentinel 獲取連線原理

1.3 Luttece

1.4 Redisson

2 資料一致性

3 高併發問題