欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解

          本篇文章給大家?guī)?lái)了關(guān)于Redis的相關(guān)知識(shí),其中主要介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)問(wèn)題,包括了字符串、列表、哈希、有序集合等等相關(guān)內(nèi)容,希望對(duì)大家有幫助。

          redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解

          推薦學(xué)習(xí):Redis學(xué)習(xí)教程

          redis的數(shù)據(jù)結(jié)構(gòu):String(字符串)、List(列表)、hash(哈希)、Set(集合)、Shorted Set(有序集合)

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

          String類型

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

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

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

          以圖片 ID 1101000060 和圖片存儲(chǔ)對(duì)象 ID 3302000080 為例,我們可以把圖片 ID 的前 7 位(1101000)作為 Hash 類型的鍵,把圖片 ID 的最后 3 位(060)和圖片存儲(chǔ)對(duì)象 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類型有兩種底層實(shí)現(xiàn)結(jié)構(gòu):1.壓縮列表 2.Hash表
          hash列表存在兩個(gè)閥值,一旦超過(guò)這兩個(gè)閥值就會(huì)從壓縮列表轉(zhuǎn)換為Hash表
          hash-max-ziplist-entries表示用壓縮列表保存時(shí)哈希列表集合中最大元素個(gè)數(shù)
          hash-max-ziplist-value表示用壓縮列表保存時(shí)哈希集合單個(gè)元素的最大長(zhǎng)度

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

          redis的三種擴(kuò)展數(shù)據(jù)類型

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

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

          GEOADD cars:locations 116.034579 39.030452 33

          GEORADIUS:根據(jù)輸入經(jīng)緯度的位置,查詢以這個(gè)經(jīng)緯度為中心一定范圍內(nèi)的其他元素

          如何自定義數(shù)據(jù)類型?

          redis的基本對(duì)象結(jié)構(gòu)包含type、encoding、lru和refcount、*ptr
          redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解
          開(kāi)發(fā)一個(gè)名字叫NewTypeObject的數(shù)據(jù)結(jié)構(gòu),具體有以下四個(gè)步驟redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解

          如何在redis中保存時(shí)間序列數(shù)據(jù)?

          1.基于Hash和Sorted Set保存:為什么要基于兩種數(shù)據(jù)結(jié)構(gòu)進(jìn)行查詢呢?
          Hash類型可以實(shí)現(xiàn)單鍵的快速查詢,這就滿足了時(shí)間序列單鍵查詢需求redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解
          但是hash類型有一個(gè)短板就是不支持范圍查詢,為了支持時(shí)間戳范圍查詢我們需要通過(guò)Sorted Set,因?yàn)樗鶕?jù)元素的權(quán)重分?jǐn)?shù)來(lái)排序的,redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解
          那么我們?cè)趺幢WC這兩個(gè)操作的原子性呢?
          需要通過(guò)MULTI和EXEC兩個(gè)命令:
          MULTI表示開(kāi)始,收到這個(gè)命令redis就會(huì)將命令放入到隊(duì)列中
          EXEC表示結(jié)束,收到這個(gè)命令就會(huì)開(kāi)始執(zhí)行隊(duì)列中的命令redis數(shù)據(jù)結(jié)構(gòu)知識(shí)圖文詳解
          但是如果采用hash和Sorted Set則只支持范圍查詢而不支持聚合計(jì)算。如果在客戶端做聚合計(jì)算,會(huì)導(dǎo)致大量的網(wǎng)絡(luò)傳輸。所以可以在redis上通過(guò)RedisTimeSeries進(jìn)行聚合計(jì)算。

          推薦學(xué)習(xí):Redis學(xué)習(xí)教程

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