面试题之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語言的標準庫函數
總結
以上是生活随笔為你收集整理的面试题之Memcached与Redis的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨平台 C/C++ memcached
- 下一篇: 深入理解Memcache原理