摘要:前言本章接著上一節(jié)繼續(xù)介紹的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)中的字典基本介紹也可以用來存儲用戶信息和不同的是可以對用戶信息的每個字段多帶帶存儲則需要序列化用戶的所有字段后存儲并且需要以整個字符串的形式獲取用戶而可以只獲取部分數(shù)據(jù)從而節(jié)約網(wǎng)絡(luò)流量不過內(nèi)存占用要大于
前言
本章接著上一節(jié)繼續(xù)介紹 Redis 的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)中的Hash字典.
基本介紹Hash 也可以用來存儲用戶信息,和 String 不同的是 Hash 可以對用戶信息的每個字段多帶帶存儲,String 則需要序列化用戶的所有字段后存儲.并且 String 需要以整個字符串的形式獲取用戶,而 hash可以只獲取部分數(shù)據(jù),從而節(jié)約網(wǎng)絡(luò)流量.不過 hash 內(nèi)存占用要大于 String,這是 hash 的缺點.
> hset books java "Effective java" (integer) 1 > hset books golang "concurrency in go" (integer) 1 > hget books java "Effective java" > hset user age 17 (integer) 1 >hincrby user age 1 #單個 key 可以進行計數(shù) 和 incr 命令基本一致 (integer) 18
Redis 中的 Hash和 Java的 HashMap 更加相似,都是數(shù)組+鏈表的結(jié)構(gòu).當發(fā)生 hash 碰撞時將會把元素追加到鏈表上.值得注意的是在 Redis 的 Hash 中 value 只能是字符串.
內(nèi)部原理看完基本介紹之后,我們先來了解下 hash 的內(nèi)部結(jié)構(gòu).第一維是數(shù)組,第二維是鏈表.組成一個 hashtable.
部分源碼:
struct dictht { dictEntry **table; //entry 數(shù)組 long size; //數(shù)組長度 long used //數(shù)組中的元素個數(shù) ... } struct dictEntry{ void *key; //hash 的 key void *val; //hash 的 value dictEntry *next; //下一個dictEntry 鏈表結(jié)構(gòu) }
在 Java 中 HashMap 擴容是個很耗時的操作,需要去申請新的數(shù)組,為了追求高性能,Redis 采用了漸進式 rehash 策略.這也是 hash 中最重要的部分.
漸進式 rehash在 hash 的內(nèi)部包含了兩個hashtable,一般情況下只是用一個.如圖所示:
在擴容的時候 rehash 策略會保留新舊兩個 hashtable 結(jié)構(gòu),查詢時也會同時查詢兩個 hashtable.Redis會將舊 hashtable 中的內(nèi)容一點一點的遷移到新的 hashtable 中,當遷移完成時,就會用新的 hashtable 取代之前的.當 hashtable 移除了最后一個元素之后,這個數(shù)據(jù)結(jié)構(gòu)將會被刪除.如圖所示:
數(shù)據(jù)搬遷的操作放在 hash 的后續(xù)指令中,也就是來自客戶端對 hash 的指令操作.一旦客戶端后續(xù)沒有指令操作這個 hash.Redis就會使用定時任務(wù)對數(shù)據(jù)主動搬遷.
正常情況下,當 hashtable 中元素的個數(shù)等于數(shù)組的長度時,就會開始擴容,擴容的新數(shù)組是原數(shù)組大小的 2 倍.如果 Redis 正在做 bgsave(持久化) 時,可能不會去擴容,因為要減少內(nèi)存頁的過多分離(Copy On Write).但是如果 hashtable 已經(jīng)非常滿了,元素的個數(shù)達到了數(shù)組長度的 5 倍時,Redis 會強制擴容.
當hashtable 中元素逐漸變少時,Redis 會進行縮容來減少空間占用,并且縮容不會受 bgsave 的影響,縮容條件是元素個數(shù)少于數(shù)組長度的 10%.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75211.html
摘要:前言本章將介紹中和的基本使用和內(nèi)部原理因為這兩種數(shù)據(jù)結(jié)構(gòu)有很多相似的地方所以把他們放到一章中介紹并且重點介紹內(nèi)部一個很重要的數(shù)據(jù)結(jié)構(gòu)跳躍表基本介紹先來看看中集合很像中鍵值對無序唯一不為空值重復(fù)無序是中最特別的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)其他幾個都能和大致對 前言 本章將介紹 Redis中 set 和 zset的基本使用和內(nèi)部原理.因為這兩種數(shù)據(jù)結(jié)構(gòu)有很多相似的地方所以把他們放到一章中介紹.并且重點介紹...
摘要:前言在上一章中我們介紹了的一些內(nèi)部原理在這一章中我們再來討論在五種數(shù)據(jù)結(jié)構(gòu)中的基本使用和一些內(nèi)部實現(xiàn)基本介紹的呢相當于中的也是雙向鏈表具有一些和同樣的特征比如插入和刪除一條很快時間復(fù)雜度為獲取頭結(jié)點和尾節(jié)點也很快時間復(fù)雜度也為隨機讀取則相對 前言 在上一章中我們介紹了 String 的一些內(nèi)部原理,在這一章中我們再來討論在五種數(shù)據(jù)結(jié)構(gòu)中 List 的基本使用和一些內(nèi)部實現(xiàn). 基本介紹 ...
閱讀 1660·2021-11-16 11:41
閱讀 2457·2021-11-08 13:14
閱讀 3106·2019-08-29 17:16
閱讀 3079·2019-08-29 16:30
閱讀 1843·2019-08-29 13:51
閱讀 356·2019-08-23 18:38
閱讀 3223·2019-08-23 17:14
閱讀 630·2019-08-23 15:09