redis資料結構與精準限流

2021-10-02 05:40:38 字數 1956 閱讀 2305

redies

key -value

value存在如下型別:

setsortedset

mapstring

list 

list-列表:

ziplist:壓縮列表:

類似陣列,但不同於陣列,

1)單一壓縮列表中支援儲存不同大小的資料,所以更加節省空間,這也是壓縮的含義。

2) 因為上面的特性,壓縮列表不可以通過下標直接定位元素

為什麼要使用壓縮雜湊表:沒有多餘的指標等,節省空間

使用條件如下:

列表資料個數小於512個

列表中儲存的單個資料小於64位元組

雙向鍊錶

除了節點定義包含 左節點 值 右節點之外,

它額外定義乙個 list 結構體,來組織鍊錶的首、尾指標,還有長度等資訊。這樣,在使用的時候就會非常方便。

hash-字典:

1)壓縮列表:條件同上

2)雜湊表:會自動擴容(為了效能)和縮容(節約記憶體);

在擴容的時候,一般的做法是做大量的資料遷移和hash值的重新計算,會導致服務停頓。redis採用的方式就是採用漸進是的擴容和縮容策略。

set-集合:

1)有序陣列,場景:資料都是整數,並且元素個數小於512個

2)雜湊表

sortedset-有序集合:

壓縮列表:元素小於64位元組,元素個數小於128個

跳表為了斷電時能夠恢復已有的資料:

所以能夠進行持久化,可以手動觸發或者是配置(時間+改動次數),持久化的方案:

1)清除原有的儲存結構,僅僅儲存資料到磁碟中,節約磁碟,但是恢復慢。

2)保留原有的儲存結構,

3)記錄操作過的指令,但是一直累加嗎

為什麼redis剛開始都是採用壓縮列表?

因為壓縮列表比較節省空間,而且壓縮列表因為支援不同大小的資料,導致並不能根據下標直接定位資料,只能遍歷獲取;但是資料量大了以後,需要獲取連續的大的空間就不太好。

鑑許可權流背後的資料結構

鑑權url處理,用/分割,獲取不同的

雜湊表儲存 url 和 規則之間的關係。 key:url  value:規則

精準匹配:kmp,sunday

字首匹配:trie樹,組織成有序陣列這種資料結構。當在匹配的過程中,我們可以利用二分查詢演算法,決定從乙個節點應該跳到哪乙個子節點。

模糊匹配:參考回溯演算法的正規表示式。

如何實現精準限流:

固定時間視窗限流演算法:

選點時間點,之後沒有請求進入,計數器加1.在當前時間視窗內,出現訪問次數超過限流值的情況時,我們拒絕後續的訪問請求。當進入下乙個時間視窗,計數器清零。

問題:無法應對兩個時間視窗臨接時間的突發流量。

限流規則:每秒鐘不能超過 100 次介面請求。第乙個 1s 時間視窗內,100 次介面請求都集中在最後 10ms 內。在第二個1s的時間視窗內,100次介面請求都集中在最開始的10ms內。雖然兩個時間視窗內流量都符合限流要求(≤100 個請求),但在兩個時間視窗臨界的 20ms 內,會集中有 200 次介面請求。

對固定時間視窗限流演算法稍加改造。我們可以限制任意時間視窗(比如1s)內,介面請求數都不能超過某個閾值( 比如 100 次)。因此,相對於固定時間視窗限流演算法,這個演算法叫滑動時間視窗限流演算法。

流量經過滑動時間視窗限流演算法整形之後,可以保證任意乙個 1s 的時間視窗內,都不會超過最大允許的限流值,從流量曲線上來看會更加平滑。那具體到實現層面,我們該如何來做呢?

我們假設限流的規則是,在任意 1s 內,介面的請求次數都不能大於 k 次。我們就維護乙個大小為 k+1 的迴圈佇列,用來記錄 1s 內到來的請求。注意,這裡迴圈佇列的大小等於限流次數加一,因為迴圈佇列儲存資料時會浪費乙個儲存單元。當有新的請求到來時,我們將與這個新請求的時間間隔超過 1s 的請求,從佇列中刪除。然後,我們再來看迴圈佇列中是否有空閒位置。如果有,則把新請求儲存在佇列尾部(tail 指標所指的位置);如果沒有,則說明這 1 秒內的請求次數已經超過了限流值 k,所以這個請求被拒絕服務。

redis 資料結構與物件

簡單說下redis的資料結構,這些在網上也都有很詳細的解釋,redis 設計與實現 這本書基於redis3.0的,但是現在已經5.0 了,所以有些資料結構發生了變化,其中我自己實現發現了一部分,可能還有沒發現的。慢慢實踐吧 簡單動態字串是在c語音傳統的字串基礎上構建的,其資料結構為 struct s...

Redis資料結構與物件

redis使用五種型別物件實現實現鍵值對資料庫 字串 列表 雜湊 集合 有序集合 列表編碼 ziplist或linkedlist 雜湊編碼 ziplist或hashtable 集合編碼 intset或hashtable 有序集合編碼 ziplist或skiplist struct sdshdr 二進...

Redis資料結構

字典 dict 是redis裡最核心的資料結構,正如其全稱remote dictionary service所說,redis其實就是乙個字典服務,字典以key value的形式呈現給使用者,key是簡單的字串,而value可以是各種資料結構,比如字串 string 鍊錶 list 集合 set 排序...