面試題之Memcached與Redis的區別
阿新 • • 發佈:2018-12-29
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的形式儲存 |
不支援儲存 只以in-memory的形式儲存 |
資料一致性 |
提供了事務的功能,保證命令的原子性,中間不會被任何操作打斷 |
提供了cas命令,保證多個併發訪問操作同一份資料的一致性 |
叢集管理 |
伺服器端構建分散式儲存 |
只能採用客戶端實現分散式儲存 |
效能 |
單核 資料量<100k 高 資料量>100k 低 |
多核 資料量<100k 低 資料量>100k 高 |
記憶體使用效率 |
採用key-value 儲存結構 利用率低 採用hash結構來做key-value儲存(組合式的壓縮方式) 利用率高 |
採用key-value 儲存結構 利用率高 |
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語言的標準庫函式