Redis高階特性

惟是致良知發表於2020-09-30

隨著Redis越來越火,除了基本提供的五種基本資料型別,也提供了其他資料結構和特性。另外,其獨特的Module載入機制也帶來了極大的可擴充套件性。

 

漏斗限流

在業務中我們可能對一些呼叫、執行進行限流。而redis就為我們提供了一種方式。

限流涉及的指標有

  • 容量

  • 流出速率

 

管道

管道不是Redis獨有的。本質上redis 客戶端通過對管道中的指令列表改變讀寫順序來節省IO。

伺服器依舊是收到一條訊息,執行一條訊息,回覆一條訊息。

 

 

Geo

我們知道,地球是一個球體,並對其進行了位置劃分,經度(-180, 180],緯度(-90, 90)。

 

Rax

Rax 是 Redis 內部比較特殊的一個資料結構,它是一個有序字典樹 (基數樹 Radix Tree),按照 key 的字典序排列,支援快速地定位、插入和刪除操作。Redis 五大基礎資料結 構裡面,能作為字典使用的有 hash 和 zset。hash 不具備排序功能,zset 則是按照 score 進 行排序的。rax 跟 zset 的不同在於它是按照 key 進行排序的

 

HyperLogLog

可用版本: >= 2.8.9 時間複雜度: 當命令作用於單個 HyperLogLog 時, 複雜度為 O(1) , 並且具有非常低的平均常數時間。 當命令作用於 N 個 HyperLogLog 時, 複雜度為 O(N) , 常數時間也比處理單個 HyperLogLog 時要大得多。 當 PFCOUNT key [key …] 命令作用於單個鍵時, 返回儲存在給定鍵的 HyperLogLog 的近似基數, 如果鍵不存在, 那麼返回 0 。

當 PFCOUNT key [key …] 命令作用於多個鍵時, 返回所有給定 HyperLogLog 的並集的近似基數, 這個近似基數是通過將所有給定 HyperLogLog 合併至一個臨時 HyperLogLog 來計算得出的。

通過 HyperLogLog 資料結構, 使用者可以使用少量固定大小的記憶體, 來儲存集合中的唯一元素 (每個 HyperLogLog 只需使用 12k 位元組記憶體,以及幾個位元組的記憶體來儲存鍵本身)。

命令返回的可見集合(observed set)基數並不是精確值, 而是一個帶有 0.81% 標準錯誤(standard error)的近似值。

 

 

Stream

我們知道,利用redis實現一個訊息佇列,比如:

1、採用list:一端 rpush/lpush 入隊,另一端lpop 和 rpop 出隊。不過它存在空閒連線的問題,伺服器自動會斷開空閒的連線。

2、使用 PUB/SUB,訂閱/釋出模式

3、利用 Sorted-Set 來實現,將時間戳作為 score。這樣也做訊息延遲。

不過上述方式均存在一個問題:訊息可靠性問題。三種方式在伺服器當機時,存在丟訊息的可能。

Stream是 Redis 5增加,訊息連結串列,持久化。

 

 

 

相關文章