redis為了平衡效能與空間開銷,每種資料型別至少提供了兩種編碼實現,有節省記憶體空間的實現,也有提高效能的實現。滿足一定條件時型別的編碼實現會自動轉換,不過redis並不支援編碼實現的回退,因為頻繁的增刪操作,資料項壓縮編碼實現轉換非常消耗cpu。
redis的記憶體優化一般從以下幾個方面著手
#檢視當前物件使用的資料型別
type
#檢視型別的內部編碼
encoding
高併發寫入場景中,在條件允許的情況下字串長度控制在39位元組以內,可減少建立redisobject記憶體分配次數,從而提高效能
縮減鍵和值的長度是降低redis記憶體使用最直接地方式。設計鍵時在描述業務情況下,鍵值越短越好;值物件縮減比較複雜,去掉不必要的屬性避免儲存無效資料,把業務物件序列化成二進位制陣列放入redis,選擇高效的序列化工具。
共享物件池是指redis內部維護[0~9999]的整數物件池。建立redisobject存在記憶體開銷,通過redis_shared_integers定義。可通過object refcount命令檢視物件引用數驗證是否啟用整數物件池,使用共享物件池大概可以節約30%的記憶體
編碼優化比較複雜。。。。
可通過將key進行hash分組儲存到物件中,比如存在100萬個鍵,可以對映到1000個hash中,每個hash儲存1000個元素,hash的field記錄原始key字串用於雜湊查詢,value儲存原始值物件。使用ziplist+雜湊進行記憶體優化的關鍵點:
另外,關於hash鍵和field鍵的設計 缺點
對於大量小物件的儲存場景,使用ziplist+雜湊來控制鍵的規模以達到降低記憶體的目的還是非常明顯的。
mysql必知必會 mysql必知必會(四)
十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...
mysql的必知必會 mysql 必知必會 筆記
好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...
MySQL 索引與優化必知必會
mysql 是業務後台系統經常用到的結構化資料庫。掌握 mysql 相關知識是研發人員必備的能力。與此同時,在面試過程當中,mysql 的知識點也是經常被當做面試題目,以此來考量候選人的能力。隨著業務量的增加,對於 mysql 效能優化的要求也越來越高,而索引方面是效能優化重點考慮的方向,所以深入理...