導航:首頁 > 物理學科 > redis默認內存占物理內存多少

redis默認內存占物理內存多少

發布時間:2023-03-18 06:00:36

『壹』 redis maxmemory默認值是多少

# Redis 配置文件

# 當配置中需蘆液要配置內存大小時,可以使用 1k, 5GB, 4M 等類似的格式,其轉換方式如下(不區分大小寫)
#
# 1k =>
1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb =>
1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024
bytes
#
# 內存配置大小逗嘩輪寫是一樣的.比如 1gb 1Gb 1GB 1gB

# daemonize no 默認情況下,redis不是山信在後台運行的,如果需要在後台運行,把該項的值更改為yes
daemonize
轉載,僅供參考。

『貳』 redis這些內存消耗數據怎麼看呢,主要看哪個說明內存比較大了

Redis常用數據類型
Redis最為常用的數據類型主要有以下五種:
String
Hash
List
Set
Sorted set
在具體描述這幾種數據類型之前,我們先通過一張圖了解下Redis內部內存管理中是如何描述這些不同數據類型的:
首先Redis內部使用一個redisObject對象來表示所有的key和value,redisObject最主要的信息如上圖所示:type代表一個value對象具體是何種數據類型,encoding是不同數據類型在redis內部的存儲方式,比如:type=string代表value存儲的是一個普通字元串,那麼對應的encoding可以是raw或者是int,如果是int則代表實際redis內部是按數值型類存儲和表示這個字元串的,當然前提是這個字元串本身可以用數值表示,比如:「123」 「456」這樣的字元串。
這里需要特殊說明一下vm欄位,只有打開了Redis的虛擬內存功能,此欄位才會真正的分配內存,該功能默認是關閉狀態的,該功能會在後面具體描述。通過上圖我們可以發現Redis使用redisObject來表示所有的key/value數據是比較浪費內存的,當然這些內存管理成本的付出主要也是為了給Redis不同數據類型提供一個統一的管理介面,實際作者也提供了多種方法幫助我們盡量節省內存使用,我們隨後會具體討論。
下面我們先來逐一的分析下這五種數據類型的使用和內部實現方式:
String
常用命令:
set,get,decr,incr,mget 等。
應用場景:
String是最常用的一種數據類型,普通的key/value存儲都可以歸為此類,這里就不所做解釋了。
實現方式:
String在redis內部存儲默認就是一個字元串,被redisObject所引用,當遇到incr,decr等操作時會轉成數值型進行計算,此時redisObject的encoding欄位為int。
Hash
常用命令:
hget,hset,hgetall 等。
應用場景:
我們簡單舉個實例來描述下Hash的應用場景,比如我們要存儲一個用戶信息對象數據,包含以下信息:
用戶ID為查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲,主要有以下2種存儲方式:
常用內存優化手段與參數
通過我們上面的一些實現上的分析可以看出redis實際上的內存管理成本非常高,即佔用了過多的內存,作者對這點也非常清楚,所以提供了一系列的參數和手段來控制和節省內存,我們分別來討論下。
首先最重要的一點是不要開啟Redis的VM選項,即虛擬內存功能,這個本來是作為Redis存儲超出物理內存數據的一種數據在內存與磁碟換入換出的一個持久化策略,但是其內存管理成本也非常的高,並且我們後續會分首辯析此種持久化策略並不成熟,所以要關閉VM功能,請檢查你的redis.conf文件中 vm-enabled 為 no。
其次最好設置下redis.conf中的maxmemory選項,該選項是告訴Redis當使用了多少物理內存後就開始拒絕後續的寫入請求,該參數能很好的保行簡護好你的Redis不會因為使用了過多的物理內存而導致swap,最終嚴重影響性能甚至崩潰。
另外Redis為不同數據類型分別提供了一組參數來控制內存使用,我們在前面檔芹褲詳細分析過Redis Hash是value內部為一個HashMap,如果該Map的成員數比較少,則會採用類似一維線性的緊湊格式來存儲該Map, 即省去了大量指針的內存開銷,這個參數控制對應在redis.conf配置文件中下面2項:
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
hash-max-zipmap-entries
含義是當value這個Map內部不超過多少個成員時會採用線性緊湊格式存儲,默認是64,即value內部有64個以下的成員就是使用線性緊湊存儲,超過該值自動轉成真正的HashMap。
hash-max-zipmap-value 含義是當 value這個Map內部的每個成員值長度不超過多少位元組就會採用線性緊湊存儲來節省空間。
以上2個條件任意一個條件超過設置值都會轉換成真正的HashMap,也就不會再節省內存了,那麼這個值是不是設置的越大越好呢,答案當然是否定的,HashMap的優勢就是查找和操作的時間復雜度都是O(1)的,而放棄Hash採用一維存儲則是O(n)的時間復雜度,如果
成員數量很少,則影響不大,否則會嚴重影響性能,所以要權衡好這個值的設置,總體上還是最根本的時間成本和空間成本上的權衡。
同樣類似的參數還有:
list-max-ziplist-entries 512
說明:list數據類型多少節點以下會採用去指針的緊湊存儲格式。
list-max-ziplist-value 64
說明:list數據類型節點值大小小於多少位元組會採用緊湊存儲格式。
set-max-intset-entries 512
說明:set數據類型內部數據如果全部是數值型,且包含多少節點以下會採用緊湊格式存儲。
最後想說的是Redis內部實現沒有對內存分配方面做過多的優化,在一定程度上會存在內存碎片,不過大多數情況下這個不會成為Redis的性能瓶頸,不過如果在Redis內部存儲的大部分數據是數值型的話,Redis內部採用了一個shared integer的方式來省去分配內存的開銷,即在系統啟動時先分配一個從1~n 那麼多個數值對象放在一個池子中,如果存儲的數據恰好是這個數值范圍內的數據,則直接從池子里取出該對象,並且通過引用計數的方式來共享,這樣在系統存儲了大量數值下,也能一定程度上節省內存並且提高性能,這個參數值n的設置需要修改源代碼中的一行宏定義REDIS_SHARED_INTEGERS,該值默認是10000,可以根據自己的需要進行修改,修改後重新編譯就可以了。
Redis的持久化機制
Redis由於支持非常豐富的內存數據結構類型,如何把這些復雜的內存組織方式持久化到磁碟上是一個難題,所以Redis的持久化方式與傳統資料庫的方式有比較多的差別,Redis一共支持四種持久化方式,分別是:
在設計思路上,前兩種是基於全部數據都在內存中,即小數據量下提供磁碟落地功能,而後兩種方式則是作者在嘗試存儲數據超過物理內存時,即大數據量的數據存儲,截止到本文,後兩種持久化方式仍然是在實驗階段,並且vm方式基本已經被作者放棄,所以實際能在生產環境用的只有前兩種,換句話說Redis目前還只能作為小數據量存儲(全部數據能夠載入在內存中),海量數據存儲方面並不是Redis所擅長的領域。下面分別介紹下這幾種持久化方式:
定時快照方式(snapshot):
該持久化方式實際是在Redis內部一個定時器事件,每隔固定時間去檢查當前數據發生的改變次數與時間是否滿足配置的持久化觸發的條件,如果滿足則通過操作系統fork調用來創建出一個子進程,這個子進程默認會與父進程共享相同的地址空間,這時就可以通過子進程來遍歷整個內存來進行存儲操作,而主進程則仍然可以提供服務,當有寫入時由操作系統按照內存頁(page)為單位來進行-on-write保證父子進程之間不會互相影響。
該持久化的主要缺點是定時快照只是代表一段時間內的內存映像,所以系統重啟會丟失上次快照與重啟之間所有的數據。
基於語句追加方式(aof):
aof方式實際類似mysql的基於語句的binlog方式,即每條會使Redis內存數據發生改變的命令都會追加到一個log文件中,也就是說這個log文件就是Redis的持久化數據。
aof的方式的主要缺點是追加log文件可能導致體積過大,當系統重啟恢復數據時如果是aof的方式則載入數據會非常慢,幾十G的數據可能需要幾小時才能載入完,當然這個耗時並不是因為磁碟文件讀取速度慢,而是由於讀取的所有命令都要在內存中執行一遍。另外由於每條命令都要寫log,所以使用aof的方式,Redis的讀寫性能也會有所下降。
虛擬內存方式:
虛擬內存方式是Redis來進行用戶空間的數據換入換出的一個策略,此種方式在實現的效果上比較差,主要問題是代碼復雜,重啟慢,復制慢等等,目前已經被作者放棄。
diskstore方式:
diskstore方式是作者放棄了虛擬內存方式後選擇的一種新的實現方式,也就是傳統的B-tree的方式,目前仍在實驗階段,後續是否可用我們可以拭目以待。
Redis持久化磁碟IO方式及其帶來的問題
有Redis線上運維經驗的人會發現Redis在物理內存使用比較多,但還沒有超過實際物理內存總容量時就會發生不穩定甚至崩潰的問題,有人認為是基於快照方式持久化的fork系統調用造成內存佔用加倍而導致的,這種觀點是不準確的,因為fork 調用的-on-write機制是基於操作系統頁這個單位的,也就是只有有寫入的臟頁會被復制,但是一般你的系統不會在短時間內所有的頁都發生了寫入而導致復制,那麼是什麼原因導致Redis崩潰的呢?
答案是Redis的持久化使用了Buffer IO造成的,所謂Buffer IO是指Redis對持久化文件的寫入和讀取操作都會使用物理內存的Page Cache,而大多數資料庫系統會使用Direct IO來繞過這層Page Cache並自行維護一個數據的Cache,而當Redis的持久化文件過大(尤其是快照文件),並對其進行讀寫時,磁碟文件中的數據都會被載入到物理內存中作為操作系統對該文件的一層Cache,而這層Cache的數據與Redis內存中管理的數據實際是重復存儲的,雖然內核在物理內存緊張時會做Page Cache的剔除工作,但內核很可能認為某塊Page Cache更重要,而讓你的進程開始Swap ,這時你的系統就會開始出現不穩定或者崩潰了。我們的經驗是當你的Redis物理內存使用超過內存總容量的3/5時就會開始比較危險了。
定時快照方式(snapshot)
基於語句追加文件的方式(aof)
虛擬內存(vm)
Diskstore方式
第一種方式將用戶ID作為查找key,把其他信息封裝成一個對象以序列化的方式存儲,這種方式的缺點是,增加了序列化/反序列化的開銷,並且在需要修改其中一項信息時,需要把整個對象取回,並且修改操作需要對並發進行保護,引入CAS等復雜問題。
第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對兒,用用戶ID+對應屬性的名稱作為唯一標識來取得對應屬性的值,雖然省去了序列化開銷和並發問題,但是用戶ID為重復存儲,如果存在大量這樣的數據,內存浪費還是非常可觀的。
那麼Redis提供的Hash很好的解決了這個問題,Redis的Hash實際是內部存儲的Value為一個HashMap,並提供了直接存取這個Map成員的介面,如下圖:
也就是說,Key仍然是用戶ID, value是一個Map,這個Map的key是成員的屬性名,value是屬性值,這樣對數據的修改和存取都可以直接通過其內部Map的Key(Redis里稱內部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據了,既不需要重復存儲數據,也不會帶來序列化和並發修改控制的問題。很好的解決了問題。
這里同時需要注意,Redis提供了介面(hgetall)可以直接取到全部的屬性數據,但是如果內部Map的成員很多,那麼涉及到遍歷整個內部Map的操作,由於Redis單線程模型的緣故,這個遍歷操作可能會比較耗時,而另其它客戶端的請求完全不響應,這點需要格外注意。
實現方式:
上面已經說到Redis Hash對應Value內部實際就是一個HashMap,實際這里會有2種不同實現,這個Hash的成員比較少時Redis為了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,對應的value redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht。
List
常用命令:
lpush,rpush,lpop,rpop,lrange等。
應用場景:
Redis list的應用場景非常多,也是Redis最重要的數據結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現,比較好理解,這里不再重復。
實現方式:
Redis list的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷,Redis內部的很多實現,包括發送緩沖隊列等也都是用的這個數據結構。
Set
常用命令:
sadd,spop,smembers,sunion 等。
應用場景:
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。
實現方式:
set 的內部實現是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。
Sorted set
常用命令:
zadd,zrange,zrem,zcard等
使用場景:
Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優先順序(score)的參數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重復的集合列表,那麼可以選擇sorted set數據結構,比如twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。
實現方式:
Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證數據的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表裡存放的是所有的成員,排序依據是HashMap里存的score,使用跳躍表的結構可以獲得比較高的查找效率,並且在實現上比較簡單。

『叄』 Redis的各數據類型的內存佔用

先給一個Redis分析內存佔用的網址: http://www.redis.cn/redis_memory/
這個工具會給我們一個內存佔用分析,示例如下圖:

我們在使用Redis的時候,String 類型是我們使仿李用最多的,他也是唯一的一個非集合類型。
然而String類型並不是適用於所有場合的,它有一個明顯的短板,就是它保存數據時所消耗的內存空間較多。
為什麼String類型的佔用的空間比較大呢,那是因為他除了記錄實際數據,String 類型還需要額外的內存空間記錄數據長度、空間使用等信息,這些信息也叫作元數據。當實際保存的數據較小時,元數據的空間開銷就顯得比較大了。

當你保存 64 位有符號整數時,String 類型會把它保存為一個 8 位元組的 Long 類型整數,這種保存方式通常也叫作 int 編碼方式。但是,當你保存的數據中包含字元時,String 類型就會用簡單動態字元串(Simple Dynamic String,SDS)結構體來保存。
其中SDS的保存佔用的內存如下所示:

在 SDS 中,buf 保存實際數據,而 len 和 alloc 本身其實是 SDS 結構體的額外開銷。
然而,除了SDS的額外開銷,String類型還有一個RedisObject 結構體(包備銀遲含了八個位元組的元數據和八個位元組的指針)的開銷,如下圖所示:

為了解決上面提到的String類型佔用內存過多的情況,我們可以使用壓縮表來存儲。
壓縮列表之所以能節省內存,就在於它是用一系列連續的 entry 保存數據。

Redis 基於壓縮列表實現了 List、Hash 和 Sorted Set 這樣的集合類型,這樣做的最大好處就是節省了 dictEntry 的開銷。當你用 String 類型時,一個鍵值對就有一個 dictEntry,要用 32 位元組空間。但採用集合類型時,一個 key 就對應一個集合的數據,能保存的數據多了很多,但也只用了一個 dictEntry,這樣就節省了搏培內存。
Hash 類型設置了用壓縮列表保存數據時的兩個閾值,一旦超過了閾值,Hash 類型就會用哈希表來保存數據了。這兩個閾值分別對應以下兩個配置項:
hash-max-ziplist-entries:表示用壓縮列表保存時哈希集合中的最大元素個數。
hash-max-ziplist-value:表示用壓縮列表保存時哈希集合中單個元素的最大長度。

『肆』 redis 一個資料庫能存多少數據

redis一個實例能存一個key或是value大小最大是512M。操作方法如下:

1、首先要安裝redis,開啟redis的服務。掘世敗

『伍』 Redis內存配置和淘汰策略

1.在redis安裝目錄下找到redis.conf,打開找到如下行:

其中的maxmemory <bytes>即為最大內存配置項,默認是注釋掉的會採用 默認的最大內存大小 :在64位操作系統下不限制內存大小,在32位操作系統下最多使用3GB。

2.在客戶端通過命令行查看

這里結果為0表示未手動指定過最大內存,採用默認的最大內存。

一般推薦Redis設置內存為最大物理內存的四分之三。

1.在配置文件redis.conf中指定maxmemory參數,例如,如果最大內存是200M,則在配置文件中添加 maxmemory 209751200 ;
2.通過命令 config set maxmemory 209751200 設置,注意,這里如果是通過命令行設置的最大內存大小,在配置文件redis.conf中並不會添加 maxmemory 209751200 這一行內容。

當Redis達到最大的可用內存時,再向其中存入數據則會報OOM,因此,要避免無限制存入數據導致OOM,則需要採用合適的內存淘汰策略。

在討論Redis的內存淘汰策略之前,我們要先對Redis中過期鍵的刪除機制有個大體的了解;實際上,過期鍵的刪除策略有三種,每種策略下過期鍵的刪除時機均不同。
1. 定時刪除
所謂定時刪除,就是在設置鍵的過期時間的同時,創建一個定時器,讓定時器在鍵的過期時間來臨時,立即刪除對鍵的刪除操作。其能夠對過期鍵進行立即刪除,對內存是友好的,但是因為要維護定時器,對cpu是不友好的。
2. 惰性刪除
所謂惰性刪除,就是放任過期鍵不管,但每次獲取鍵時,都檢查取得的鍵是否過期,如果過期的汪游話,就刪除該鍵。如果沒有過期,就返回該鍵。惰性刪除對cpu友好,但是由於其無法主動刪除過期鍵,當過期鍵大量積聚時會佔用很大內存,對內存不友好。
3. 定期刪除
所謂定期刪除,是前兩種刪除策略的一種折中。會每隔一段時間執行一次刪除過期鍵操作,並通過限制操作執行的時長和頻率來減少刪除操作對cpu時間的影響。
定期刪除會周期性輪詢redis庫中的時效性數據,採用隨機抽取的策略,利用過期數據佔比的方式控制刪除頻度,其特點為:
a)CPU佔用設置有峰值,檢測頻度可自定義設置。
b)內存壓力有限,長期佔用內存的冷數據會被持續清理。
總結下來,定期刪除會周期性抽查存儲空間(隨機抽查、重點抽查)。
定期刪除的難點在於如何確定產出操作執行的時長和頻率,如果刪除操作執行的太過頻繁,或者執行的時間太長,定期刪除策略就會退化成定時刪除策略,以至於將CPU時間過多的消耗在刪除鍵上面。如果刪除操作執行的太少,或者執行的時間太短,定期刪除策略又會和惰性刪除策困返銷略一樣,出現內存浪費的情況。因此,必須合理的設置定期刪除策略的執行時長和執行頻率。
定期刪除在一定程度上是一種合理有效的過期鍵刪除策略,但是由於其在執行時長和執行頻度的局限性,必須要有另一種機制(策略)確保內存能夠獲得回收,因此,就需要引入內存淘汰策略。

在redis.conf中指出內存淘汰策略有有以下八種:
1. volatile-lru :從已設置過期時間的key中挑選最近最少使用的數據淘汰;
2. allkeys-lru :從全部key中挑選最近最少使用的數據淘汰;
3. volatile-lfu :從已設置過期時間的key中世咐挑選使用頻率最低的數據淘汰;
4. allkeys-lfu :從全部key中挑選使用頻率最低的數據淘汰;
5. volatile-random :從已設置過期時間的key中任意選擇數據淘汰;
6. allkeys-random :從全部key中任意選擇數據淘汰
7. volatile-ttl :從已設置過期時間的key中挑選將要過期的數據淘汰;
8. no-enviction :禁止驅逐數據,這也是默認策略。當內存不足以容納新入數據時,新寫入操作就會報錯。

內存淘汰策略的設置與查看

『陸』 為什麼從redis中取數據比較慢

redis並不會因為key的增加而導致寫入明顯變慢,肯定是其他因素。
如果redis開啟了持久化,在進行持久化時,性能必然下降,可以使帶春用config命令查看持久化設置了沒有。另外考慮是否是內存不足,一般redis最多隻應該佔用60%的物理內存,如果超過了在rdb進行持久化攜昌時可能會內存不足。可辯行扒以監視內存和cpu使用情況進行分析。

『柒』 java怎樣配置redis佔用多大內存

Redis的配置
daemonize 如果需要蔽羨行在後台運行,把該項改為yes
pidfile 配置多個pid的地址,默認在派唯/var/run/redis.pid
bind 綁定ip,設置後只接受自該ip的請求
port 監聽埠,默認為6379
timeout 設置客戶端連接時的超時時間,單位為秒
loglevel 分為4級,debug、verbose、notice、warning
logfile 配置log文件地址
databases 設置資料庫的個數,默認使用的資料庫為0
save 設置redis進行資料庫鏡像的頻率,保存快照的頻率,第一個*表示多長時間, 第三個*表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動保存快照。可設置多個條件。
rdbcompression 在進行鏡像備份時,是否進行壓縮
Dbfilename 鏡像備份文件的文件名
Dir 資料庫鏡像備份的文件放置路徑
Slaveof 設置資料庫為其他資料庫的從資料庫
Masterauth 主資料庫連接需要的密碼驗證
Requirepass 設置登錄時需要使用的密碼
Maxclients 限制同時連接的客戶數量
Maxmemory 設置redis能夠使用的最大內存
Appendonly 開啟append only模式
appendfsync 設置對appendonly.aof文件同步的頻率
vm-enabled 是否虛擬內存的支持
vm-swap-file 設置虛擬內存的交換文件路徑
vm-max-memory 設置redis使用的最大物理內存大小
vm-page-size 設置虛擬內存的頁大小
vm-pages 設置交換文件的總page數量
vm-max-threads 設置VMIO同時使宏嘩用的線程數量
glueoutputbuf 把小的輸出緩存存放在一起
hash-max-zipmap-entries 設置hash的臨界值
activerehashing 重新has

閱讀全文

與redis默認內存占物理內存多少相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:468
乙酸乙酯化學式怎麼算 瀏覽:1141
沈陽初中的數學是什麼版本的 瀏覽:1061
華為手機家人共享如何查看地理位置 瀏覽:792
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:618
數學c什麼意思是什麼意思是什麼 瀏覽:1113
中考初中地理如何補 瀏覽:1062
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:486
數學奧數卡怎麼辦 瀏覽:1094
如何回答地理是什麼 瀏覽:812
win7如何刪除電腦文件瀏覽歷史 瀏覽:852
大學物理實驗干什麼用的到 瀏覽:1200
二年級上冊數學框框怎麼填 瀏覽:1409
西安瑞禧生物科技有限公司怎麼樣 瀏覽:558
武大的分析化學怎麼樣 瀏覽:986
ige電化學發光偏高怎麼辦 瀏覽:1083
學而思初中英語和語文怎麼樣 瀏覽:1318
下列哪個水飛薊素化學結構 瀏覽:1144
化學理學哪些專業好 瀏覽:1232
數學中的棱的意思是什麼 瀏覽:766