1.zipmap優化hash:
前面談到將乙個物件儲存在hash型別中會占用更少的記憶體,並且可以更方便的訪問整個物件。省記憶體的原因是新建乙個hash物件時開始是用zipmap來儲存的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些元資料儲存開銷。儘管zipmap的新增,刪除,查詢都是o(n),但是由於一般物件的field數量都不太多。所以使用zipmap也是很快的,也就是說新增刪除平均還是o(1)。如果field或者value的大小超出一定限制後,redis會在內部自動將zipmap替換成正常的hash實現。這個限制可以在配置檔案中指定(預設配置在redis根目錄下的redis.conf中):
hash-max-zipmap-entries 512
#配置欄位最多512個
hash-max-zipmap-value 64
#配置value最大為64位元組
2.ziplist優化list:
如果redisobject的type成員值是redis_list型別的,則當該list的元素個數小於配置值list-max-ziplist-entries且元素值字串的長度小於配置值list-max-ziplist-value則可以編碼成 redis_encoding_ziplist 型別儲存,否則採用 dict 來儲存(dict實際是hash table的一種實現),list採用ziplist資料結構儲存資料,這樣做一方面為了節省記憶體,另一方面這種結構式順序儲存的結構,能夠更好利用cpu local和預取策略。
配置如下所示:
list-max-ziplist-entries 512
#配置元素個數最多512個
list-max-ziplist-value 64
#配置value最大為64位元組
3.intset優化set:
當set集合中的元素為整數且元素個數小於配置set-max-intset-entries值時,使用intset資料結構儲存,否則轉化為dict結構,dict實際是hash table的一種實現,key為元素值,value為null,這樣即可在o(1)時間內判斷集合中是否包含某個元素。
intset中有三種型別陣列:int16_t型別、int32_t 型別、 int64_t 型別。至於怎麼選擇是那種型別的陣列,是根據其儲存的值的取值範圍來決定的,初始化時是 int16_t,根據 set 中的最大值在[int16_min, int16_max] , [int32_min, int32_max], [int64_min, int64_max]的那個取值範圍來動態確定整個陣列的型別。例如set一開始是 int16_t 型別,當乙個取值範圍在 [int32_min, int32_max]的值加入到 set 時,則將儲存 set 的陣列公升級成 int32_t 的陣列。
intset元素限制的配置如下所示:
set-max-intset-entries 512
#配置元素個數最多512個
4.ziplist優化sorted set:
根hash和list一樣sorted set也有節約記憶體的方式,當sorted set的元素個數及元素大小小於一定限制時,它是用ziplist來儲存。
這個限制的配置如下:
zset-max-ziplist-entries 128
#配置元素個數最多512個
zset-max-ziplist-value 64
#配置value最大為64位元組
5.小結:
redis提供了很多關於優化記憶體的方法,上面這些配置的值都是預設配置,實際要根據我們具體的需求場景來調節,並要做大量的測試,以達到最優的效果。同時必須對redis這些資料結構有很好的理解。
redis記憶體儲存結構分析:
Redis學習 4 Redis特性
相關特性 多資料庫 乙個redis例項可以鏈結多個資料庫,客戶端可以指定連線某個redis例項的哪個資料庫 就好像mysql中多個資料庫一樣。乙個redis例項可以提供16個資料庫0 15,客戶端預設連線的第0個資料庫 select x 選擇第x個資料庫 今天在公司加班,所以說換了個crt對伺服器進...
redis學習筆記(4) redis常用命令3
手動高亮tip sadd key number1 number2 向集合新增乙個或多個成員 srem key number1 numner2 移除集合中乙個或多個成員 scard key 獲取集合的成員數 sdiff key1 key2 返回所有集合之間的差集 sdiffstore destinat...
Linux部署 4 Redis的安裝
將redis的包上傳到你的linux的 usr local temp下 yum install y gcc c 2.直接解壓 tar zxvf redis 3.0.0.tar.gz 3.進入解壓目錄 make 4.接下進入src目錄 進行安裝 make install prefix usr loca...