1. 程式人生 > >淺談memcache和redis區別

淺談memcache和redis區別

寫到 應對 狀態 rdb lis lte 而在 mage 內存池

memcache和redis區別

memcach簡介

Memcache時一個內存對象緩存系統,用於加速動態web應用程序,減輕數據庫負載。它可以應對任意多個連接,使用非阻塞的網絡I/O,
工作機制:
在內存中開辟一塊空間,然後建立一個hash表,memcached自管理這些hash表

工作原理

Memcached基於健值對存儲,key會通過hash算法轉化成hash-key,便於查找。
Memcached有兩個核心組件組成:服務端(server)和客戶端,在一個memcached的查詢中,客戶端會先計算key的hash值來確定所出的server位置。當server確定以後,客戶端對就會發送一個查詢請求給對應的server,讓它查找確切的數據。

技術分享圖片

內存管理機制

emcached會預先分配內存,
Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,ltem根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且減少內存碎片的產生,但這種方式也會帶來一定程度上的空間浪費

memcache與redis區別

1)redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲

技術分享圖片


2)內存使用使用效率對比
使用簡單的key-value存儲的話,memcached的內存利用率會更高一點,如果redis采用hash結構來做key-value存儲,由於其組合式的壓縮,內存的利用率更高。
3)性能對比:由於redis只使用單核,而memcached使用多核,所以平均在每一個核上redis在存儲小數據時比memcached性能更高,而在100Ks=以上的時候memcached性能要高於redis
4)內存管理機制的不同
在redis中,並不是所有的數據都一一直存儲在內存中的,這是和memcached相比最大的一個區別
Redis只會緩存所有的key端的信息,如果redis發現內存的使用量超過某一個值,將觸發swap的操作,redis根據相應的表達式計算出那些key對應value需要swap到磁盤,然後再將這些這些key對應的value持久化到磁盤中,同時再內存清除。同時由於redis將內存中的數據swap到磁盤的時候,提供服務的主線程和進行swap操作的子進程會共享這部分內存,所以如果更新需要swap的數據,redis將阻塞這個操作,直到子線程完成swap操作後才可以進行修改
5)數據持久化的支持
雖然redis是基於內存的存儲系統,但是他本身是支持內存數據的持久化,而且主要提供兩種主要的持久化策略,RDB快照和AOF日誌,而memcached是不支持數據持久化的操作的。
RDB持久化通過保存了數據庫的健值對來記錄數據庫狀態的不同,AOF持久化是通過保存reds服務器所執行的命令來保存記錄數據庫的狀態的,
RDB持久化保存數據庫狀態的方法是將msg,fruits,numbers三個健的健值對保存到RDB文件中,而AOF持久化保存數據庫的狀態則是將服務器執行的SET,SADD,RPUSH三個命令保存到AOF文件中的,

RDB快照

redis支持將當前的數據快照存放成一個數據文件的持久化機制,即RDB快照,但是一個持續寫入的數據庫是如何生成快照的,
在生成快照的時候,將當前的進程fork出一個子進程,然後在子進程中循環所有的數據,將數據寫成RDB文件。我們可以通過redis的slave指令來配置RDB快照生成的時機。RDB文件不會壞掉,因為其寫操作是在一個新進程中進行的,當生成一個新的RDB文件時redis生成的子進程會先將數據寫到一個臨時文件中,然後通過原子性rename系統調用將臨時文件重命名為RDB文件。

AOF持久化的實現

OF持久化的實現可以分為命令追擊(append),文件寫入,文件同步(sync)
1)命令追加
當AOF持久化功能打開的時候,服務器在執行完一個寫命令的時候,會以協議的格式將被執行的寫命令追加到服務器狀態的aof_buf緩沖區的末尾
2)AOF文件的寫入與同步
服務器在處理文件事件時可能會執行寫命令,使得一些內容被追加到aof_buf緩沖區裏面,所以服務器在每次結束一個事件循環之前,它都會調用flushAppendonlyFIle函數考慮是否需要將將緩沖區的內容寫入和保存到AOF文件裏面。如果函數被調用,並且距離上次同步AOF文件已經超過了一秒鐘,那麽服務器會先將aof_buf中的內容寫入到AOF文件中,然後再對AOF文件進行同步
3)文件的載入與數據還原
4)AOF重寫
AOF持久化保存的命令越來越多,文件裏的內容也月來越多,會對計算機造成影響。為了解決AOF文件體積膨脹問題,REDIS提供了AOF重寫功能。Redis服務器可以創建一個新的AOF文件,新舊兩個AOF文件保存的數據狀態相同,但新AOF文件不會包含任何浪費空間的冗余命令,所以新的AOF會比舊的體積要小

淺談memcache和redis區別