1. 程式人生 > >快取Memcached 與 Redis 相同點差異點分析

快取Memcached 與 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會比舊的體積要小