php開發面試題---Redis和Memcache區別,優缺點對比


php開發面試題---Redis和Memcache區別,優缺點對比

一、總結

一句話總結:

Redis相當於Memcache的擴展,增加比如持久化、多種數據結構、集群分布式功能
反思的回顧非常有用,因為決定了我的方向和技巧
以戰養己,這是非常非常好的方式

 

1、Redis和Memcache區別?

Redis多種數據結構+操作方式:Redis和Memcache區別:Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。 這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。
Redis可持久化
Redis集群分布式

 

 

2、Memcached介紹 ?

分布式內存對象緩存系統:用於動態Web應用以減輕數據庫負載

Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度,現在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。

 

3、Memcached提高訪問速度的本質是什么?

通過內存替代了硬盤(數據庫)的訪問

 

4、Memcached運行過程?

1、查緩存:檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,無需查詢數據庫。
2、找不到就找數據庫:如果請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。
3、同步更新:保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。

 

5、如何實現memcache服務器分布式可拓展性?

客戶端通過算法訪問不同的memcache服務器:Memcached的分布式不是在服務器端實現的,而是在客戶端應用中實現的,即通過內置算法制定目標數據的節點

 

 

6、redis如何做到實現持久化的?

定期寫入磁盤:redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步

 

7、Redis如何實現分布式可拓展性?

客戶端實現:客戶端通過算法訪問不同的Redis服務器
服務端構建分布式存儲:Redis分布式架構

2.8以前的版本:與Memcached一致,可以在客戶端實現,也可以使用代理,twitter已開發出用於Redis和Memcached的代理Twemproxy 。
3.0 以后的版本:相較於Memcached只能采用客戶端實現分布式存儲,Redis則在服務器端構建分布式存儲。Redis Cluster是一個實現了分布式且允許單點故障的Redis高級版本,它沒有中心節點,各個節點地位一致,具有線性可伸縮的功能。如圖給出Redis Cluster的分布式存儲架構,其中節點與節點之間通過二進制協議進行通信,節點與客戶端之間通過ascii協議進行通信。在數據的放置策略上,Redis Cluster將整個 key的數值域分成16384個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是16384。

 

8、Memcached和redis的關系?

相當於擴展:總的來說,可以把Redis理解為是對Memcached的拓展,是更加重量級的實現,提供了更多更強大的功能

 

 

 

9、Memcached和redis的應用場景?

Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。
Redis:適用於對讀寫效率要求都很高,數據處理業務復雜和對安全性要求較高的系統(如新浪微博的計數和微博發布部分系統,對數據安全性、讀寫要求都很高)。

 

10、memcache和redis適合的系統類型(windows還是linux)?

linux:因為linux多用作服務器

 

 

 

二、Redis和Memcache區別,優缺點對比

轉自或參考:Redis和Memcache區別,優缺點對比
https://www.cnblogs.com/JavaBlackHole/p/7726195.html

1、 Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其他東西,例如圖片、視頻等等。 
2、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。 
3、虛擬內存–Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤 
4、過期策略–memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10 
5、分布式–設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從 
6、存儲數據安全–memcache掛掉后,數據沒了;redis可以定期保存到磁盤(持久化) 
7、災難恢復–memcache掛掉后,數據不可恢復; redis數據丟失后可以通過aof恢復 
8、Redis支持數據的備份,即master-slave模式的數據備份。

關於redis和memcache的不同,下面羅列了一些相關說法,供記錄:

redis和memecache的不同在於[2]: 
1、存儲方式: 
memecache 把數據全部存在內存之中,斷電后會掛掉,數據不能超過內存大小 
redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化(筆者注:有快照和AOF日志兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就很有可能服務器頻繁滿載做dump)。 
2、數據支持類型: 
redis在數據支持上要比memecache多的多。 
3、使用底層模型不同: 
新版本的redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。 
4、運行環境不同: 
redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統 環境上的優化,雖然后來微軟有一個小組為其寫了補丁。但是沒有放到主干上

個人總結一下,有持久化需求或者對數據結構和處理有高級要求的應用,選擇redis,其他簡單的key/value存儲,選擇memcache。

下面重點分析Memcached和Redis兩種方案: 
Memcached介紹 
Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度,現在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。

Memcached工作方式分析 
許多Web應用都將數據保存到 RDBMS中,應用服務器從中讀取數據並在瀏覽器中顯示。 但隨着數據量的增大、訪問的集中,就會出現RDBMS的負擔加重、數據庫響應惡化、 網站顯示延遲等重大影響。Memcached是高性能的分布式內存緩存服務器,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web等應用的速度、 提高可擴展性。下圖展示了memcache與數據庫端協同工作情況: 
這里寫圖片描述 
其中的過程是這樣的: 
1.檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,無需查詢數據庫。 
2.如果請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。 
3.保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。

Memcached作為高速運行的分布式緩存服務器,具有以下的特點: 
1.協議簡單 
2.基於libevent的事件處理 
3.內置內存存儲方式 
4.memcached不互相通信的分布式

如何實現分布式可拓展性? 
Memcached的分布式不是在服務器端實現的,而是在客戶端應用中實現的,即通過內置算法制定目標數據的節點,如下圖所示: 
這里寫圖片描述

Redis 介紹 
Redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、 list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步,當前 Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的緩存服務。

Redis 工作方式分析 
Redis作為一個高性能的key-value數據庫具有以下特征: 
1.多樣的數據模型 
2.持久化 
3.主從同步 
Redis支持豐富的數據類型,最為常用的數據類型主要由五種:String、Hash、List、Set和Sorted Set。Redis通常將數據存儲於內存中,或被配置為使用虛擬內存。Redis有一個很重要的特點就是它可以實現持久化數據,通過兩種方式可以實現數據持久化:使用RDB快照的方式,將內存中的數據不斷寫入磁盤;或使用類似MySQL的AOF日志方式,記錄每次更新的日志。前者性能較高,但是可能會引起一定程度的數據丟失;后者相反。 Redis支持將數據同步到多台從數據庫上,這種特性對提高讀取性能非常有益。

Redis如何實現分布式可拓展性? 
2.8以前的版本:與Memcached一致,可以在客戶端實現,也可以使用代理,twitter已開發出用於Redis和Memcached的代理Twemproxy 。 
3.0 以后的版本:相較於Memcached只能采用客戶端實現分布式存儲,Redis則在服務器端構建分布式存儲。Redis Cluster是一個實現了分布式且允許單點故障的Redis高級版本,它沒有中心節點,各個節點地位一致,具有線性可伸縮的功能。如圖給出Redis Cluster的分布式存儲架構,其中節點與節點之間通過二進制協議進行通信,節點與客戶端之間通過ascii協議進行通信。在數據的放置策略上,Redis Cluster將整個 key的數值域分成16384個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是16384。 
這里寫圖片描述

綜合結論

應該說Memcached和Redis都能很好的滿足解決我們的問題,它們性能都很高,總的來說,可以把Redis理解為是對Memcached的拓展,是更加重量級的實現,提供了更多更強大的功能。具體來說:

1.性能上: 
性能上都很出色,具體到細節,由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比 
Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起 Memcached,還是稍有遜色。

2.內存空間和數據量大小: 
MemCached可以修改最大內存,采用LRU算法。Redis增加了VM的特性,突破了物理內存的限制。

3.操作便利上: 
MemCached數據結構單一,僅用來緩存數據,而Redis支持更加豐富的數據類型,也可以在服務器端直接對數據進行豐富的操作,這樣可以減少網絡IO次數和數據體積。

4.可靠性上: 
MemCached不支持數據持久化,斷電或重啟后數據消失,但其穩定性是有保證的。Redis支持數據持久化和數據恢復,允許單點故障,但是同時也會付出性能的代價。

5.應用場景: 
Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。 
Redis:適用於對讀寫效率要求都很高,數據處理業務復雜和對安全性要求較高的系統(如新浪微博的計數和微博發布部分系統,對數據安全性、讀寫要求都很高)。

需要慎重考慮的部分 
1.Memcached單個key-value大小有限,一個value最大只支持1MB,而Redis最大支持512MB 
2.Memcached只是個內存緩存,對可靠性無要求;而Redis更傾向於內存數據庫,因此對對可靠性方面要求比較高 
3.從本質上講,Memcached只是一個單一key-value內存Cache;而Redis則是一個數據結構內存數據庫,支持五種數據類型,因此Redis除單純緩存作用外,還可以處理一些簡單的邏輯運算,Redis不僅可以緩存,而且還可以作為數據庫用 
4.新版本(3.0)的Redis是指集群分布式,也就是說集群本身均衡客戶端請求,各個節點可以交流,可拓展行、可維護性更強大。

ref:

http://blog.163.com/sun_jian_zhang/blog/static/187804041201310795917333/?suggestedreading&wumii 
http://www.cnblogs.com/EE-NovRain/p/3268476.html 
http://www.open-open.com/lib/view/open1409643182369.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM