1. 程式人生 > >面試題之Memcached與Redis的區別

面試題之Memcached與Redis的區別

Redis Memcached
網路IO模型 單執行緒的IO複用的網路模型 多執行緒的非阻塞IO複用的網路模型
資料支援型別 key-value資料型別
還支援list,set,zset,hash等資料結構的儲存
key-value形式儲存和訪問資料
查詢的時間複雜度降低到O(1)
記憶體管理機制 基於zmalloc.h和zmalloc.c兩個檔案對mallc/free包裝來實現管理記憶體
使用現場申請記憶體的方式
基於Slab Allocation機制管理記憶體
使用預分配的記憶體池的方式
資料儲存及持久化 支援儲存
除以in-memory的形式儲存
另外兩種:快照(snapshotting),只追加檔案(append-only file, AOF)
不支援儲存 以in-memory的形式儲存
資料一致性 提供了事務的功能,保證命令的原子性,中間不會被任何操作打斷
提供了cas命令,保證多個併發訪問操作同一份資料的一致性
叢集管理 伺服器端構建分散式儲存
只能採用客戶端實現分散式儲存
效能 單核
資料量<100k   高 資料量>100k   低
多核
資料量<100k   低
資料量>100k   高
記憶體使用效率
採用key-value 儲存結構 利用率低
採用hash結構來做key-value儲存(組合式的壓縮方式)  利用率高

採用key-value 儲存結構 利用率高
Redis和Memcached這種基於記憶體的資料庫系統來說,記憶體管理的效率高低是影響系統性能的關鍵因素。
Redis和Memcached最大儲存量是根據機器記憶體大小而定。
Redis是一種鍵值資料庫,處於關係資料庫和鍵值資料庫之間。
Redis採用的是包裝的mallc/free方式來實現記憶體管理
Slab Allocation機制的原理:它首先申請一大塊記憶體,並將其分割成各種尺寸的塊Chunk,並把尺寸相同的塊分成組Slab Class。其中,Chunk就是用來儲存key-value資料的最小單位。每個Slab Class的大小,可以在Memcached啟動的時候通過制定Growth Factor來控制。假定圖中Growth Factor的取值為1.25,如果第一組Chunk的大小為88個位元組,第二組Chunk的大小就為112個位元組,依此類推。


Memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,Item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除。
Redis使用現場申請記憶體的方式來儲存資料,並且很少使用free-list等方式來優化記憶體分配,會在一定程度上存在記憶體碎片,Redis跟據儲存命令引數,會把帶過期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便實體記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上Redis更適合作為儲存而不是cache。
redis提供的兩種不同的持久化方法來儲存資料到硬盤裡面:
①快照(snapshotting),它可以將存在於某一時刻的所有資料都寫入硬盤裡面。
②只追加檔案(append-only file, AOF),它會在執行寫命令時,將被執行的寫命令複製到硬盤裡面。


備註:malloc/free是C++/C語言的標準庫函式