自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)庫(kù)壓縮到底怎么做?

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
redis的壓縮是針對(duì)key的壓縮,只針對(duì)string和list的value,需要配置文件配置rdb_compression rdb壓縮才會(huì)生效。

redis

redis的壓縮是針對(duì)key的壓縮

只針對(duì)string和list的value

所有的壓縮最終都會(huì)調(diào)用lzf_compress/lzf_decompress

需要配置文件配置rdb_compression rdb壓縮才會(huì)生效

lzf壓縮限制長(zhǎng)度要大于20,即使是aaaaaaaaaaaaaaaaaaaa也壓不了,大于20才能壓。原因沒有深究

rdb內(nèi)部的壓縮

  • 如何確認(rèn)這個(gè)record是被壓縮/解壓的?

rdb解析每條數(shù)據(jù),都有標(biāo)識(shí)字段,壓縮的record自然是單獨(dú)的類型

  1. ssize_t rdbSaveLzfStringObject(rio *rdb, unsigned char *s, size_t len) { 
  2. ... 
  3.     comprlen = lzf_compress(s, len, out, outlen); 
  4.     if (comprlen == 0) { 
  5.         zfree(out); 
  6.         return 0
  7.     } 
  8.     ssize_t nwritten = rdbSaveLzfBlob(rdb, out, comprlen, len); 
  9. ... 
  10.  
  11. ssize_t rdbSaveLzfBlob(rio *rdb, void *data, size_t compress_len, 
  12.                        size_t original_len) { 
  13. ... 
  14.     /* Data compressed! Let's save it on disk */ 
  15.     byte = (RDB_ENCVAL<<6)|RDB_ENC_LZF; 
  16.     if ((n = rdbWriteRaw(rdb,&byte,1)) == -1goto writeerr; 
  17.     nwritten += n; 
  18. ... 

解壓縮

  1. void *rdbGenericLoadStringObject(rio *rdb, int flags, size_t *lenptr) { 
  2. ... 
  3.     if (isencoded) { 
  4.         switch(len) { 
  5.         case RDB_ENC_INT8: 
  6.         case RDB_ENC_INT16: 
  7.         case RDB_ENC_INT32: 
  8.             return rdbLoadIntegerObject(rdb,len,flags,lenptr); 
  9.         case RDB_ENC_LZF: 
  10.             return rdbLoadLzfStringObject(rdb,flags,lenptr); 
  11.         default
  12.             rdbReportCorruptRDB("Unknown RDB string encoding type %llu",len); 
  13.             return NULL; 
  14.         } 
  15.     } 
  16.  ... 
  17.   
  18.  void *rdbLoadLzfStringObject(rio *rdb, int flags, size_t *lenptr) { 
  19. ... 
  20.  
  21.     /* Load the compressed representation and uncompress it to target. */ 
  22.     if (rioRead(rdb,c,clen) == 0goto err; 
  23.     if (lzf_decompress(c,clen,val,len) != len) { 
  24.         rdbReportCorruptRDB("Invalid LZF compressed string"); 
  25. ... 

接口簡(jiǎn)單容易定位

所有的類型string/hash具體到底層,都是string,就會(huì)走這個(gè)壓縮的過程rdbSaveRawString,內(nèi)部來調(diào)用rdbSaveLzfStringObject

  1. ssize_t rdbSaveObject(rio *rdb, robj *o, robj *key, int dbid) { 
  2.     ssize_t n = 0, nwritten = 0
  3.  
  4.     if (o->type == OBJ_STRING) { 
  5.         /* Save a string value */ 
  6.         if ((n = rdbSaveStringObject(rdb,o)) == -1return -1
  7.         nwritten += n; 
  8.     } else if (o->type == OBJ_LIST) { 
  9.  
  10.                 if (quicklistNodeIsCompressed(node)) { 
  11.                     void *data; 
  12.                     size_t compress_len = quicklistGetLzf(node, &data); 
  13.                     if ((n = rdbSaveLzfBlob(rdb,data,compress_len,node->sz)) == -1return -1
  14.                     nwritten += n; 
  15.                 } else { 
  16.                     if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1return -1
  17.                     nwritten += n; 
  18.                 } 
  19.                 node = node->next; 
  20.             } 
  21.         } else { 
  22.             serverPanic("Unknown list encoding"); 
  23.         } 
  24. 。。。 

quicklist的壓縮

鏈表壓縮可以選擇深度,quicklist是redis list的底層數(shù)據(jù)結(jié)構(gòu)

什么時(shí)候做壓縮?

  1. /* Insert 'new_node' after 'old_node' if 'after' is 1. 
  2.  * Insert 'new_node' before 'old_node' if 'after' is 0. 
  3.  * Note: 'new_node' is *always* uncompressed, so if we assign it to 
  4.  *       head or tail, we do not need to uncompress it. */ 
  5. REDIS_STATIC void __quicklistInsertNode(quicklist *quicklist, 
  6.                                         quicklistNode *old_node, 
  7.                                         quicklistNode *new_node, int after) { 
  8.     if (after) { 
  9.         new_node->prev = old_node; 
  10.         if (old_node) { 
  11.             new_node->next = old_node->next; 
  12.             if (old_node->next) 
  13.                 old_node->next->prev = new_node; 
  14.             old_node->next = new_node; 
  15.         } 
  16.         if (quicklist->tail == old_node) 
  17.             quicklist->tail = new_node; 
  18.     } else { 
  19.         new_node->next = old_node; 
  20.         if (old_node) { 
  21.             new_node->prev = old_node->prev; 
  22.             if (old_node->prev) 
  23.                 old_node->prev->next = new_node; 
  24.             old_node->prev = new_node; 
  25.         } 
  26.         if (quicklist->head == old_node) 
  27.             quicklist->head = new_node; 
  28.     } 
  29.     /* If this insert creates the only element so far, initialize head/tail. */ 
  30.     if (quicklist->len == 0) { 
  31.         quicklist->head = quicklist->tail = new_node; 
  32.     } 
  33.  
  34.     /* Update len first, so in __quicklistCompress we know exactly len */ 
  35.     quicklist->len++; 
  36.  
  37.     if (old_node) 
  38.         quicklistCompress(quicklist, old_node); 

也就是說,頭尾不會(huì)壓縮,其他的節(jié)點(diǎn)會(huì)壓縮,在修改的時(shí)候同事把舊的節(jié)點(diǎn)給壓縮了

這里有個(gè)問題,這里的節(jié)點(diǎn)壓縮了,rdb存儲(chǔ)的時(shí)候還要特別處理一下,判定已經(jīng)壓縮過,走rdbSaveLzfBlob

需要有個(gè)record頭來記錄一個(gè)compression的標(biāo)記

rocksdb

類似redis,還是很好找的,UncompressData/CompressData

針對(duì)sst的壓縮

調(diào)用關(guān)系

UncompressBlockContentsForCompressionType -> UncompressData

WriteBlock/BGWorkCompression -> CompressAndVerifyBlock -> CompressBlock -> CompressData

block本身有信息標(biāo)記是否是壓縮

寫入的時(shí)候才壓縮

blobdb

CompressBlobIfNeeded -> CompressData

GetCompressedSlice -> CompressData

總結(jié)

  • 需要文件本身知道自己是壓縮的,有元信息記錄
  • 在內(nèi)存中是否壓縮要考慮業(yè)務(wù)場(chǎng)景,比如redis這個(gè)quicklist 壓縮,因?yàn)閘ist最近訪問的就是頭尾,其他不重要

 

責(zé)任編輯:張燕妮 來源: 王很水的博客
相關(guān)推薦

2019-07-02 10:22:15

TCP流量數(shù)據(jù)

2023-09-27 22:44:18

數(shù)據(jù)遷移數(shù)據(jù)庫(kù)

2024-10-10 14:34:49

2022-07-06 11:30:57

數(shù)據(jù)分析預(yù)測(cè)模型

2024-05-31 11:37:20

2018-08-26 15:39:03

數(shù)據(jù)庫(kù)MySQL索引

2011-06-30 16:57:03

數(shù)據(jù)壓縮

2022-12-26 11:57:41

數(shù)據(jù)庫(kù)治理

2011-03-28 09:27:52

數(shù)據(jù)庫(kù)壓縮日志

2021-11-02 14:46:50

數(shù)據(jù)

2016-06-13 13:50:26

云計(jì)算

2020-07-28 08:36:54

數(shù)據(jù)安全數(shù)據(jù)泄露數(shù)據(jù)

2023-06-02 11:55:02

數(shù)據(jù)分析營(yíng)銷

2017-06-12 18:24:25

數(shù)據(jù)庫(kù)壓縮技術(shù)

2017-11-08 12:25:37

小程序運(yùn)營(yíng)公眾號(hào)

2022-03-10 11:25:51

InnoDB優(yōu)化

2016-01-05 16:17:59

云夢(mèng)數(shù)據(jù)倉(cāng)

2020-02-03 09:36:47

數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)遷移

2015-09-20 18:31:29

阿里云心電數(shù)據(jù)云上安心

2021-11-10 05:00:58

數(shù)據(jù)分析運(yùn)營(yíng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)