理論上講redis可以儲存2的32次方個key,每個執行個體至少存2億5千萬個key,但因為Redis是基於記憶體的資料庫所以也就意味著它不可能儲存特別多的資料,應該說redis的儲存極限是系統的可用記憶體。
我在本機上通過jedis產生100萬個key實際佔用記憶體108M
# Memory
used_memory:104730792
used_memory_human:99.88M
used_memory_rss:123080704
used_memory_peak:113668232
used_memory_peak_human:108.40M
used_memory_lua:35840
mem_fragmentation_ratio:1.18
mem_allocator:jemalloc-3.6.0
# Keyspace
db0:keys=1000000,expires=0,avg_ttl=0
記憶體設定
maxmemory和maxmemory_policy參數
在redis.conf中通過這兩個參數配置redis的記憶體使用量情況。Redis的可用記憶體與系統的記憶體有關,一般我們需要設定它的最大可用記憶體,除非你確定你的業務中redis的記憶體不會很大且有足夠的系統記憶體。
maxmemory參數
不設定
1:不設定或為0,64位系統不限制使用,32位最多使用3G
2:如果不設定最大記憶體系統有多少記憶體redis就會用多少一旦開始寫入swap虛擬記憶體則後期查詢速度反而會慢。
設定
如果開啟了RDB持久化方式,因為子進程在複製所有資料時記憶體使用量量會增加一倍,所以最大設定為系統記憶體的45%。如果沒有開啟最大設定為系統記憶體的95%。
maxmemory_policy參數
1:設定最大記憶體後需要設定刪除策略否則當記憶體不足時再添加資料就會報錯。
2:有六種刪除策略。
volatile-lru:使用LRU演算法從已設定到期時間的資料集合中淘汰資料。
volatile-ttl:從已設定到期時間的資料集合中挑選即將到期的資料淘汰。
volatile-random:從已設定到期時間的資料集合中隨機挑選資料淘汰。
allkeys-lru:使用LRU演算法從所有資料集合中淘汰資料,淘汰使用頻率最少的key。
allkeys-random:從資料集合中任意選擇資料淘汰
no-enviction:禁止淘汰資料。
最佳化原則:
1:key的名稱盡量使用簡單明了的關鍵字,比如stu代表學生不要太長。
2:如果只是使用redis充當緩衝就請關閉持久化功能。
3:redis為每種資料類型都提供了兩種內部編碼方式,產生時redis自己會自動根據資料類型調整使用那種編碼方式。
4:slowlog慢日誌查詢
當我們發現redis命令執行慢時可以通過slowlog來找出這些命令。在redis.conf中有兩個參數slowlog-log-slower-than10000和slowlog-max-len 128。
slowlog-log-slower-than10000表示當命令執行時間大於10000時此命令會被儲存
slowlog-max-len128表示redis會儲存最多128條命令。
slowlog get可以查看當前所有執行慢的命令
slowlog len可以查看目前一共記錄了多少條命令
slowlog reset可以執行重設
我們可以根據項目的實際情況修改redis.conf中的這兩個參數