降低Redis內(nèi)存的占用

1.原理

短結(jié)構(gòu)

Redis為列表焙畔、集合县遣、散列和有序集合提供了一組配置選項(xiàng)虱咧,讓Redis以跟節(jié)約內(nèi)存的方式存儲(chǔ)這些變量

阿里云主從版提供的選項(xiàng)(全是和短結(jié)構(gòu)有關(guān)的,ziplist可以說(shuō)是除了hash字典之外最常用的結(jié)構(gòu))

image

在列表种樱、散列蒙袍、有序集合的長(zhǎng)度較短或者體積較小的時(shí)候,redis會(huì)使用壓縮列表(ziplist)代替通常情況下這三種結(jié)構(gòu)的底層實(shí)現(xiàn)方式作為這幾種結(jié)構(gòu)的底層實(shí)現(xiàn)嫩挤。

配置:

  • entries:最大元素?cái)?shù)量
  • value:壓縮列表的每個(gè)節(jié)點(diǎn)的最大體積

當(dāng)任一條件被突破時(shí)害幅,Redis就會(huì)把底層實(shí)現(xiàn)改為通常的結(jié)構(gòu),而且當(dāng)數(shù)據(jù)被刪除之后也不會(huì)再次使用ziplist

體積較小的集合使用intset來(lái)作為底層實(shí)現(xiàn)

條件:

  • 整數(shù)集合包含的所有成員都可以被解釋為十進(jìn)制數(shù)
  • 這些整數(shù)又處于平臺(tái)的有符號(hào)整數(shù)范圍之內(nèi)
  • 集合成員數(shù)量足夠少

短結(jié)構(gòu)是以上幾種結(jié)構(gòu)的緊湊表示方式

減少鍵的長(zhǎng)度也是應(yīng)該注意的一個(gè)點(diǎn)岂昭。

短結(jié)構(gòu)ziplist

Redis中ziplist的定義(序列化字符串)和接口

unsigned char *ziplistNew(void);
unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where);
unsigned char *ziplistIndex(unsigned char *zl, int index);
unsigned char *ziplistNext(unsigned char *zl, unsigned char *p);
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);
unsigned int ziplistGet(unsigned char *p, unsigned char **sval, unsigned int *slen, long long *lval);
unsigned char *ziplistInsert(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen);
unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p);
unsigned char *ziplistDeleteRange(unsigned char *zl, unsigned int index, unsigned int num);
unsigned int ziplistCompare(unsigned char *p, unsigned char *s, unsigned int slen);
unsigned char *ziplistFind(unsigned char *p, unsigned char *vstr, unsigned int vlen, unsigned int skip);
unsigned int ziplistLen(unsigned char *zl);
size_t ziplistBlobLen(unsigned char *zl);

壓縮列表由節(jié)點(diǎn)序列和四個(gè)控制位組成以现。

影響性能的因素:每次讀取數(shù)據(jù)時(shí)都需要對(duì)進(jìn)行解碼,寫(xiě)入也需要進(jìn)行局部的重新編碼佩抹,并且有可能觸發(fā)連鎖更新叼风,但是這些操作在對(duì)小列表進(jìn)行處理時(shí)對(duì)性能的損耗并不很明顯(平均O(N))取董。

短結(jié)構(gòu)intset

Redis中整數(shù)集合的定義和接口棍苹,可見(jiàn)其最底層實(shí)現(xiàn)就是一個(gè)有序的C語(yǔ)言數(shù)組。

typedef struct intset {
    
    // 編碼方式
    uint32_t encoding;

    // 集合包含的元素?cái)?shù)量
    uint32_t length;

    // 保存元素的數(shù)組
    int8_t contents[];

} intset;

intset *intsetNew(void);
intset *intsetAdd(intset *is, int64_t value, uint8_t *success);
intset *intsetRemove(intset *is, int64_t value, int *success);
uint8_t intsetFind(intset *is, int64_t value);
int64_t intsetRandom(intset *is);
uint8_t intsetGet(intset *is, uint32_t pos, int64_t *value);
uint32_t intsetLen(intset *is);
size_t intsetBlobLen(intset *is);

影響性能的因素:對(duì)整數(shù)集合進(jìn)行插入或者刪除操作時(shí)需要進(jìn)行數(shù)據(jù)移動(dòng)茵汰,并有可能引起底層升級(jí)枢里。

隨著短結(jié)構(gòu)的體積變得越來(lái)越大,操作這些結(jié)構(gòu)的速度也會(huì)變得越來(lái)越慢蹂午,所以可以引入分片技術(shù)以追求性能和空間之前的平衡栏豺。

2.分片結(jié)構(gòu)

  • 特別適合分片的場(chǎng)景:執(zhí)行分片版命令的時(shí)候只需要訪問(wèn)指定分片即可。
  • 特別不適合分片的場(chǎng)景:需要訪問(wèn)指定分片豆胸,完事還得進(jìn)行歸并聚合的操作奥洼。
  • 可以通過(guò)分片提升性能的場(chǎng)景:搜索
  • 替代分片的一種場(chǎng)景:只對(duì)前n位和后n位操作的有序集合(用單獨(dú)維護(hù)的兩個(gè)最大有序集合和最小有序集合實(shí)現(xiàn))。
  1. 對(duì)列表進(jìn)行分片

  2. 有序集合進(jìn)行分片:
    有序集合的大部分操作都屬于特別不適合分片的場(chǎng)景晚胡。

  3. 分片式散列:將字符串鍵存儲(chǔ)到散列里面也可以明顯降低內(nèi)存占用

    1. 實(shí)現(xiàn)分片方法即可
asbtract class ShardHlist { 
/*
** $base 基礎(chǔ)散列 
** $key 將要保存到分片散列里面的鍵
** $total_elements 預(yù)計(jì)元素總量
** $shard_size 預(yù)期分片大小
*/
abstract public function shard_key($base, $key, $total_elements, $shard_size);
abstract public function shard_hset($shard_key, key, value, $total_elements, $shard_size);
abstract public function shard_hset($shard_key, key, $total_elements, $shard_size);
}

如果不是輔助緩存那么不應(yīng)該隨便更改$total_elements 和 $shard_size灵奖,一旦不得不更改需要resharding方法將數(shù)據(jù)從舊的分片遷移到新的分片

  1. 分片集合
    shard_add、shard_rem

3.二進(jìn)制位和字節(jié)打包用來(lái)進(jìn)一步降低存儲(chǔ)空間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末估盘,一起剝皮案震驚了整個(gè)濱河市瓷患,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遣妥,老刑警劉巖擅编,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爱态,警方通過(guò)查閱死者的電腦和手機(jī)谭贪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锦担,“玉大人故河,你說(shuō)我怎么就攤上這事∵罕” “怎么了鱼的?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痘煤。 經(jīng)常有香客問(wèn)我凑阶,道長(zhǎng),這世上最難降的妖魔是什么衷快? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任宙橱,我火速辦了婚禮,結(jié)果婚禮上蘸拔,老公的妹妹穿的比我還像新娘师郑。我一直安慰自己,他們只是感情好调窍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布宝冕。 她就那樣靜靜地躺著,像睡著了一般邓萨。 火紅的嫁衣襯著肌膚如雪地梨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天缔恳,我揣著相機(jī)與錄音宝剖,去河邊找鬼。 笑死歉甚,一個(gè)胖子當(dāng)著我的面吹牛万细,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纸泄,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赖钞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了刃滓?” 一聲冷哼從身側(cè)響起仁烹,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咧虎,沒(méi)想到半個(gè)月后卓缰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年征唬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捌显。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡总寒,死狀恐怖扶歪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摄闸,我是刑警寧澤善镰,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站年枕,受9級(jí)特大地震影響炫欺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熏兄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一品洛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摩桶,春花似錦桥状、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耍缴,卻和暖如春砾肺,著一層夾襖步出監(jiān)牢的瞬間挽霉,已是汗流浹背防嗡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侠坎,地道東北人蚁趁。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像实胸,于是被迫代替她去往敵國(guó)和親他嫡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Redis的內(nèi)存優(yōu)化 聲明:本文內(nèi)容來(lái)自《Redis開(kāi)發(fā)與運(yùn)維》一書(shū)第八章庐完,如轉(zhuǎn)載請(qǐng)聲明钢属。 Redis所有的數(shù)據(jù)都...
    meng_philip123閱讀 18,888評(píng)論 2 29
  • 本文將從Redis的基本特性入手淆党,通過(guò)講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對(duì)Redis的基本能力進(jìn)行直觀介紹。之后概...
    kelgon閱讀 61,158評(píng)論 23 625
  • 在某個(gè)時(shí)間,會(huì)突然聽(tīng)懂一首歌染乌,淋過(guò)前奏的夜景山孔,才聽(tīng)懂副歌中的涵義。 聽(tīng)歌的人總不會(huì)特別孤單荷憋,處在一...
    思似柳萬(wàn)絳閱讀 234評(píng)論 0 0
  • 01 前些天的時(shí)候勒庄,看到知乎上有這么一個(gè)問(wèn)題:友情和愛(ài)情都包含有關(guān)愛(ài)與關(guān)心串前,都在乎對(duì)方,這之間的差別在哪里实蔽? 然后...
    安易_閱讀 4,915評(píng)論 54 211