久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網
      最全最豐富的資訊網站

      redis數據結構知識圖文詳解

      本篇文章給大家?guī)砹岁P于Redis的相關知識,其中主要介紹了關于數據結構的相關問題,包括了字符串、列表、哈希、有序集合等等相關內容,希望對大家有幫助。

      redis數據結構知識圖文詳解

      推薦學習:Redis學習教程

      redis的數據結構:String(字符串)、List(列表)、hash(哈希)、Set(集合)、Shorted Set(有序集合)

      底層數據結構:簡單動態(tài)字符串、雙向鏈表、壓縮列表、哈希表、跳表、整數數組
      redis數據結構知識圖文詳解
      1.哈希表:一個哈希表其實就是一個數組,數組中的每一個元素稱為一個哈希桶。redis數據結構知識圖文詳解
      哈希沖突和rehash可能會帶來操作阻塞。
      redis解決哈希沖突的方法是鏈式哈希,而rehash是增加現有hash桶的數量。
      redis數據結構知識圖文詳解
      rehash的操作步驟:1.給哈希表分配更大的空間,例如是當前hash表大小的兩倍
      2.把哈希表1中的數據重新映射并拷貝到hash表2上
      3.釋放哈希表1的空間
      第二步涉及大量數據拷貝操作,如果一次性把哈希表1中的數據都遷移完,會造成線程阻塞,無法服務其他請求。為了避免這一問題,redis采用漸進式rehash
      redis數據結構知識圖文詳解
      整數數組和雙向鏈表的復雜度都是O(N)
      壓縮列表在表頭有三個數據分別是列表長度、列表尾的偏移量和列表中entry個數
      壓縮列表在表尾還有一個元素zlend代表列表結束redis數據結構知識圖文詳解
      跳表:有序鏈表只能逐一查找元素,而跳表在鏈表的基礎上增加了多級索引,通過索引位置的幾次跳轉實現數據的快速定位redis數據結構知識圖文詳解
      以下五種結構的時間復雜度
      redis數據結構知識圖文詳解

      String類型

      String類型并不適用于所有場景,它有一個明顯的短板就是它在保存數據時所消耗的內存空間較多。因為String類型需要額外內存空間記錄數據長度、空間使用等信息,這些信息也叫做元數據。
      當保存的數據包含字符的時候,string會用簡單動態(tài)字符串SDS結構體來保存
      redis數據結構知識圖文詳解
      len是buf已用長度 alloc是buf實際分配長度
      因為redis數據類型有很多,不同的數據類型有相同的元數據要記錄,所以redis會用一個RedisObject結構體來統一記錄這些元數據
      redis數據結構知識圖文詳解
      當保存Long類型的時候,RedisObject的指針就直接賦值為整數數據了,這樣就不用額外的指針再指向整數了,節(jié)省了指針的空間開銷。
      如果保存的字符串小于44字節(jié),sds和元數據會被分配到一塊連續(xù)的內存區(qū)域,被稱為embstr編碼
      如果保存的字符串大于44字節(jié),SDS和元數據會分開存放,被稱為raw編碼

      redis數據結構知識圖文詳解
      另外redis會使用一個全局hash表保存所有鍵值對,hash表的每一項都是一個dictEntry的結構體,用來指向一個鍵值對,可以看到key+value+next會使用24字節(jié),但是實際占用32字節(jié),這是因為jemalloc 在分配內存時,會根據我們申請的字節(jié)數 N,找一個比 N 大,但是最接近 N 的 2 的冪次數作為分配的空間,這樣可以減少頻繁分配的次數。
      redis數據結構知識圖文詳解
      用什么數據結構可以節(jié)省內存呢?
      壓縮列表:zlbytes代表列表長度,zltail代表列表尾偏移量,zllen代表列表中的entry個數,zlend代表列表結束,perv_len代表前一個entry長度,encoding代表編碼方式,len代表自身長度,key是實際存儲的數據。redis基于壓縮列表實現了list、hash和Sorted Set

      redis數據結構知識圖文詳解
      如何用集合類型保存單值的鍵值對?
      在保存單值的鍵值對的時候,可以采用Hash的二級編碼,就是把單值的數值拆分成兩部分,前一部分作為Hash的key,后一部分作為Hash的value

      以圖片 ID 1101000060 和圖片存儲對象 ID 3302000080 為例,我們可以把圖片 ID 的前 7 位(1101000)作為 Hash 類型的鍵,把圖片 ID 的最后 3 位(060)和圖片存儲對象 ID 分別作為 Hash 類型值中的 key 和 value。127.0.0.1:6379> info memory# Memoryused_memory:1039120127.0.0.1:6379> hset 1101000 060 3302000080(integer) 1127.0.0.1:6379> info memory# Memoryused_memory:1039136

      Hash類型有兩種底層實現結構:1.壓縮列表 2.Hash表
      hash列表存在兩個閥值,一旦超過這兩個閥值就會從壓縮列表轉換為Hash表
      hash-max-ziplist-entries表示用壓縮列表保存時哈希列表集合中最大元素個數
      hash-max-ziplist-value表示用壓縮列表保存時哈希集合單個元素的最大長度

      集合統計模式
      1.聚合統計
      2.排序統計
      3.二值狀態(tài)統計
      4.基數統計

      redis的三種擴展數據類型

      1.Bitmap:
      2.HyperLogLog
      3.GEO:
      面向LBS應用的GEO數據類型
      GEO的底層結構是根據Sorted Set來實現的,Sorted Set可以根據元素的權重排序,支持范圍查詢redis數據結構知識圖文詳解
      sorted Set的權重分數是一個浮點數(float類型),而經緯度是兩個數,需要用GeoHash 編碼
      GeoHash編碼是通過“二分區(qū)間,區(qū)間編碼”的方式進行的。
      先把經度和緯度換算成編碼的格式,然后再進行交叉
      redis數據結構知識圖文詳解
      實際上交叉的目的是下圖所示的概念,交叉后實際上就可以定位到二維空間上的一個方格中,我們使用 Sorted Set 范圍查詢得到的相近編碼值,在實際的地理空間上,也是相鄰的方格,例如1110011101和1111011101是空間位置相鄰的
      redis數據結構知識圖文詳解
      但是會存在編碼相鄰,但是方格實際不相鄰的情況。所以為了避免這種情況發(fā)生我們可以同時查詢給定經緯度周圍4個或者8個方格redis數據結構知識圖文詳解

      如何操作GEO類型?
      在使用GEO類型時,我們經常使用到的兩個命令分別時GEOADD和GEORADIUS
      GEOADD:用于把一組經緯度信息和相對應的一個ID記錄到GEO類型集合中。
      使用方法:假設車輛ID是33,經緯度位置是(116.034579,39.030452),我們可以用一個 GEO 集合保存所有車輛的經緯度,集合 key 是 cars:locations。只需要執(zhí)行以下命令就可以把ID號為33的車輛的當前經緯度位置存入到GEO中。

      GEOADD cars:locations 116.034579 39.030452 33

      GEORADIUS:根據輸入經緯度的位置,查詢以這個經緯度為中心一定范圍內的其他元素

      如何自定義數據類型?

      redis的基本對象結構包含type、encoding、lru和refcount、*ptr
      redis數據結構知識圖文詳解
      開發(fā)一個名字叫NewTypeObject的數據結構,具體有以下四個步驟redis數據結構知識圖文詳解

      如何在redis中保存時間序列數據?

      1.基于Hash和Sorted Set保存:為什么要基于兩種數據結構進行查詢呢?
      Hash類型可以實現單鍵的快速查詢,這就滿足了時間序列單鍵查詢需求redis數據結構知識圖文詳解
      但是hash類型有一個短板就是不支持范圍查詢,為了支持時間戳范圍查詢我們需要通過Sorted Set,因為它根據元素的權重分數來排序的,redis數據結構知識圖文詳解
      那么我們怎么保證這兩個操作的原子性呢?
      需要通過MULTI和EXEC兩個命令:
      MULTI表示開始,收到這個命令redis就會將命令放入到隊列中
      EXEC表示結束,收到這個命令就會開始執(zhí)行隊列中的命令redis數據結構知識圖文詳解
      但是如果采用hash和Sorted Set則只支持范圍查詢而不支持聚合計算。如果在客戶端做聚合計算,會導致大量的網絡傳輸。所以可以在redis上通過RedisTimeSeries進行聚合計算。

      推薦學習:Redis學習教程

      贊(0)
      分享到: 更多 (0)
      網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號