redis是一款開源的高效能鍵值對資料庫,
最初的作者是義大利的salvatore sanfilippo,
他的github是 antirez ,redis的原始碼同樣託管在git上:
。目前,vmware在資助著redis專案的開發和維護。
鍵值對如dict["key"]="value"中,"key"是鍵名,"value"是鍵值,
redis的鍵值不僅可以是字串,還可以是多種資料型別,包括字串型別,雜湊型別,列表型別,集合型別,有序集合型別。
redis所有資料都儲存在記憶體中,但同時也提供了對持久化的支援,可以將記憶體中的資料非同步寫入到硬碟中。
redis可以為每個鍵設定生存時間(time to live,ttl),生存時間到後鍵會自動被刪除,因此redis可以作為快取系統使用。
redis還可以限定資料占用的最大記憶體空間,在資料達到空間限制後可以按照一定的規則自動淘汰不需要的鍵。
redis的列表型別鍵支援阻塞讀取,可以實現乙個高效能的優先順序佇列。
redis支援"publish/subscribe"的訊息模式,可以在很多的訊息場景中應用。
對於像redis和memcached這種基於記憶體的資料庫系統來說,記憶體管理的效率高低是影響系統效能的關鍵因素。傳統c語言中的 malloc/free函式是最常用的分配和釋放記憶體的方法,但是這種方法存在著很大的缺陷:首先,對於開發人員來說不匹配的malloc和free容易 造成記憶體洩露;其次,頻繁呼叫會造成大量記憶體碎片無法**重新利用,降低記憶體利用率;最後,作為系統呼叫,其系統開銷遠遠大於一般函式呼叫。所以,為了提 高記憶體的管理效率,高效的記憶體管理方案都不會直接使用malloc/free呼叫。redis和memcached均使用了自身設計的記憶體管理機制,但是 實現方法存在很大的差異。
memcached的記憶體管理機制
memcached預設使用slab allocation機制管理記憶體,其主要思想是按照預先規定的大小,將分配的記憶體分割成特定長度的塊以儲存相應長度的key-value資料記錄,以完全解決記憶體碎片問題。slab allocation機制只為儲存外部資料而設計,也就是說所有的key-value資料都儲存在slab allocation系統裡,而memcached的其它記憶體請求則通過普通的malloc/free來申請,因為這些請求的數量和頻率決定了它們不會對整個系統的效能造成影響
slab allocation的原理相當簡單。 如圖所示,它首先從作業系統申請一大塊記憶體,並將其分割成各種尺寸的塊chunk,並把尺寸相同的塊分成組slab class。其中,chunk就是用來儲存key-value資料的最小單位。每個slab class的大小,可以在memcached啟動的時候通過制定growth factor來控制。假定figure 1中growth factor的取值為1.25,所以如果第一組chunk的大小為88個位元組,第二組chunk的大小就為112個位元組,依此類推。
memcached記憶體管理架構
當memcached接收到客戶端傳送過來的資料時首先會根據收到資料的大小選擇乙個最合適的slab class,然後通過查詢memcached儲存著的該slab class內空閒chunk的列表就可以找到乙個可用於儲存資料的chunk。當一條資料庫過期或者丟棄時,該記錄所占用的chunk就可以**,重新添 加到空閒列表中。從以上過程我們可以看出memcached的記憶體管理制效率高,而且不會造成記憶體碎片,但是它最大的缺點就是會導致空間浪費。因為每個 chunk都分配了特定長度的記憶體空間,所以變長資料無法充分利用這些空間。如下圖所示,將100個位元組的資料快取到128個位元組的chunk中,剩餘的28個位元組就浪費掉了。
memcached的儲存空間浪費
redis的記憶體管理機制
redis的記憶體管理主要通過原始碼中zmalloc.h和zmalloc.c兩個檔案來實現的。redis為了方便記憶體的管理,在分配一塊記憶體之後,會將 這塊記憶體的大小存入記憶體塊的頭部。如圖 5所示,real_ptr是redis呼叫malloc後返回的指標。redis將記憶體塊的大小size存入頭部,size所佔據的記憶體大小是已知的,為 size_t型別的長度,然後返回ret_ptr。當需要釋放記憶體的時候,ret_ptr被傳給記憶體管理程式。通過ret_ptr,程式可以很容易的算出 real_ptr的值,然後將real_ptr傳給free釋放記憶體。
redis塊分配
redis通過定義乙個陣列來記錄所有的記憶體分配情況,這個陣列的長度為zmalloc_max_alloc_stat。陣列的每乙個元素代表當前程式所分配的記憶體塊的個數,且記憶體塊的大小為該元素的下標。在原始碼中,這個陣列為zmalloc_allocations。 zmalloc_allocations[16]代表已經分配的長度為16bytes的記憶體塊的個數。zmalloc.c中有乙個靜態變數 used_memory用來記錄當前分配的記憶體總大小。所以,總的來看,redis採用的是包裝的mallc/free,相較於memcached的記憶體管理方法來說,要簡單很多。
redis和memcached整體對比
redis的作者salvatore sanfilippo曾經對這兩種基於記憶體的資料儲存系統進行過比較,總結如下:
1)效能對比:由於redis只使用單核,而memcached可以使用多核,所以平均每乙個核上redis在儲存小資料時比memcached效能更高。而在100k以上的資料中,memcached效能要高於redis,雖然redis最近也在儲存大資料的效能上進行優化,但是比起 memcached,還是稍有遜色。
2)記憶體使用效率對比:使用簡單的key-value儲存的話,memcached的記憶體利用率更高,而如果redis採用hash結構來做key-value儲存,由於其組合式的壓縮,其記憶體利用率會高於memcached。
3)redis支援伺服器端的資料操作:redis相比memcached來說,擁有更多的資料結構和並支援更豐富的資料操作,通常在memcached 裡,你需要將資料拿到客戶端來進行類似的修改再set回去。這大大增加了網路io的次數和資料體積。在redis中,這些複雜的操作通常和一般的 get/set一樣高效。所以,如果需要快取能夠支援更複雜的結構和操作,那麼redis會是不錯的選擇。
Redis筆記一之Redis簡介與安裝
本例的redis版本是3.0 簡介 1 redis是基於記憶體的資料庫。2 redis中沒有表的概念它是使用鍵值的方式儲存資料,它支援多種資料型別主要的有五種,分別是string,list,hash,set,sorted set。3 redis是單執行緒的資料庫它的所有命令都是執行緒安全的。4 它支...
redis學習(一)Redis入門簡介
redis 是完全開源免費的,遵守bsd協議,是乙個高效能的key value資料庫。redis 與其他 key value 快取產品有以下三個特點 tar zvxf redis 3.0 5.tar gzcd redis 3.0 5make redis server開啟之後如下圖所示 這種方式是啟動...
Redis學習總結一 Redis簡介
redis remote dictionary server 遠端字典服務 是由義大利人salvatore sanfilippo 網名 antirez 開發的一款記憶體快取記憶體資料庫。是完全開源免費的,用c語言編寫的,遵守bsd協議,高效能的 key value 分布式記憶體資料庫 區別於mysq...