Redis開發運維實踐開發設計規範之內存考慮
4.4 內存考慮
-
隻要有可能的話,就盡量使用散列鍵而不是字符串鍵來儲存鍵值對數據,因為散列鍵管理方便、能夠避免鍵名衝突、並且還能夠節約內存。
具體實例: 節約內存:Instagram的Redis實踐 blog.nosqlfan.com/html/3379.html
-
如果將redis作為cache進行頻繁讀寫和超時刪除等,此時應該避免設置較大的k-v,因為這樣會導致redis的 內存碎片增加,導致rss占用較大,最後被操作係統OOM killer幹掉。一個很具體的issue例子請見:https://github.com/antirez/redis/issues/2136
-
如果采用序列化考慮通用性,請采用json相關的庫進行處理,如果對內存大小和速度都很關注的,推薦使用messagepack進行序列化和反序列化
-
如果需要計數器,請將計數器的key通過天或者小時分割,比如下邊的設計:
需要修改為:
更好的一個設計是采用hash:
-
各種數據結構及其占用內存的benchmark測試
set個數 | 每個set的元素總數 | 內存占用 | Key大小 | Value大小 |
---|---|---|---|---|
100 | 100 | 1.88M | 7 | 36 |
100 | 1000 | 10.75M | 7 | 36 |
100 | 10000 | 111.12M | 7 | 36 |
1000 | 100 | 11.59M | 8 | 36 |
1000 | 1000 | 100.35M | 8 | 36 |
1000 | 10000 | 1.08G | 8 | 36 |
10000 | 100 | 108.71M | 9 | 36 |
10000 | 1000 | 996.23M | 9 | 36 |
zset個數 | 每個zset的元素總數 | 內存占用 | Key大小 | Value大小 |
---|---|---|---|---|
100 | 100 | 1.62M | 8 | 49 |
100 | 1000 | 15.91M | 8 | 49 |
100 | 10000 | 162.06M | 8 | 49 |
1000 | 100 | 8.71M | 9 | 49 |
1000 | 1000 | 151.87M | 9 | 49 |
1000 | 10000 | 1.58G | 9 | 49 |
10000 | 100 | 79.83M | 10 | 49 |
10000 | 1000 | 1.48G | 10 | 49 |
hash個數 | 每個hash的元素總數 | 內存占用 | Key大小 | Value大小 |
---|---|---|---|---|
100 | 100 | 1.63M | 8 | 49 |
100 | 1000 | 6.29M | 8 | 49 |
100 | 10000 | 156.91M | 8 | 49 |
1000 | 100 | 8.71M | 9 | 49 |
1000 | 1000 | 55.59M | 9 | 49 |
1000 | 10000 | 1.52G | 9 | 49 |
10000 | 100 | 79.83M | 10 | 49 |
10000 | 1000 | 548.58M | 10 | 49 |
list個數 | 每個list的元素總數 | 內存占用 | Key大小 | Value大小 |
---|---|---|---|---|
100 | 100 | 1.23M | 8 | 36 |
100 | 1000 | 10.00M | 8 | 36 |
100 | 10000 | 92.40M | 8 | 36 |
1000 | 100 | 4.83M | 9 | 36 |
1000 | 1000 | 92.52M | 9 | 36 |
1000 | 10000 | 916.47M | 9 | 36 |
10000 | 100 | 40.76M | 10 | 36 |
10000 | 1000 | 917.69M | 10 | 36 |
string個數 | 內存占用 | Key大小 | Value大小 |
---|---|---|---|
100 | 846.79K | 13 | 36 |
1000 | 966.29K | 13 | 36 |
10000 | 2.16M | 13 | 36 |
100000 | 130.88M | 13 | 36 |
Redis開發運維實踐指南本文為《Redis開發運維實踐指南》內容,該書作者為黃鵬程,已授權雲棲社區轉載。
最後更新:2017-05-08 10:31:37