0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

redis、memcache原理對比

lhl545545 ? 來源:電子發(fā)燒友網(wǎng) ? 2018-02-09 15:31 ? 次閱讀

memcache、redis原理對比

一、問題:

數(shù)據(jù)庫表數(shù)據(jù)量極大(千萬條),要求讓服務(wù)器更加快速地響應(yīng)用戶的需求。

二、解決方案:

1.通過高速服務(wù)器Cache緩存數(shù)據(jù)庫數(shù)據(jù)

2.內(nèi)存數(shù)據(jù)庫

(這里僅從數(shù)據(jù)緩存方面考慮,當(dāng)然,后期可以采用Hadoop+HBase+Hive等分布式存儲分析平臺)

三、主流解Cache和數(shù)據(jù)庫對比:

redis、memcache原理對比

上述技術(shù)基本上代表了當(dāng)今在數(shù)據(jù)存儲方面所有的實(shí)現(xiàn)方案,其中主要涉及到了普通關(guān)系型數(shù)據(jù)庫(MySQL/PostgreSQL),NoSQL數(shù)據(jù)庫(MongoDB),內(nèi)存數(shù)據(jù)庫(Redis),內(nèi)存Cache(Memcached),我們現(xiàn)在需要的是對大數(shù)據(jù)表仍保持高效的查詢速度,普通關(guān)系型數(shù)據(jù)庫是無法滿足的。而MongoDB其實(shí)只是一種非關(guān)系型數(shù)據(jù)庫,其優(yōu)勢在于可以存儲海量數(shù)據(jù),具備強(qiáng)大的查詢功能,因此不宜用于緩存數(shù)據(jù)的場景。

從以上各數(shù)據(jù)可知,對于我們產(chǎn)品最可行的技術(shù)方案有兩種:

1.Memcached 內(nèi)存Key-Value Cache

2.Redis 內(nèi)存數(shù)據(jù)庫

四、下面重點(diǎn)分析Memcached和Redis兩種方案:

4.1 Memcached介紹

Memcached 是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),用于動態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提供動態(tài)、數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度,現(xiàn)在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。

4.2 Memcached工作方式分析

許多Web應(yīng)用都將數(shù)據(jù)保存到 RDBMS中,應(yīng)用服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯示。 但隨著數(shù)據(jù)量的增大、訪問的集中,就會出現(xiàn)RDBMS的負(fù)擔(dān)加重、數(shù)據(jù)庫響應(yīng)惡化、 網(wǎng)站顯示延遲等重大影響。Memcached是高性能的分布式內(nèi)存緩存服務(wù)器,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài)Web等應(yīng)用的速度、 提高可擴(kuò)展性。下圖展示了memcache與數(shù)據(jù)庫端協(xié)同工作情況:

redis、memcache原理對比

其中的過程是這樣的:

1.檢查用戶請求的數(shù)據(jù)是緩存中是否有存在,如果有存在的話,只需要直接把請求的數(shù)據(jù)返回,無需查詢數(shù)據(jù)庫。

2.如果請求的數(shù)據(jù)在緩存中找不到,這時候再去查詢數(shù)據(jù)庫。返回請求數(shù)據(jù)的同時,把數(shù)據(jù)存儲到緩存中一份。

3.保持緩存的“新鮮性”,每當(dāng)數(shù)據(jù)發(fā)生變化的時候(比如,數(shù)據(jù)有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數(shù)據(jù)。

Memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn):

協(xié)議簡單

基于libevent的事件處理

內(nèi)置內(nèi)存存儲方式

memcached不互相通信的分布式

4.3 如何實(shí)現(xiàn)分布式可拓展性?

Memcached的分布式不是在服務(wù)器端實(shí)現(xiàn)的,而是在客戶端應(yīng)用中實(shí)現(xiàn)的,即通過內(nèi)置算法制定目標(biāo)數(shù)據(jù)的節(jié)點(diǎn),如下圖所示:

redis、memcache原理對比

4.4 Redis 介紹

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

4.5 Redis 工作方式分析

Redis作為一個高性能的key-value數(shù)據(jù)庫具有以下特征:

多樣的數(shù)據(jù)模型

持久化

主從同步

Redis支持豐富的數(shù)據(jù)類型,最為常用的數(shù)據(jù)類型主要由五種:String、Hash、List、Set和Sorted Set。Redis通常將數(shù)據(jù)存儲于內(nèi)存中,或被配置為使用虛擬內(nèi)存。Redis有一個很重要的特點(diǎn)就是它可以實(shí)現(xiàn)持久化數(shù)據(jù),通過兩種方式可以實(shí)現(xiàn)數(shù)據(jù)持久化:使用RDB快照的方式,將內(nèi)存中的數(shù)據(jù)不斷寫入磁盤;或使用類似MySQL的AOF日志方式,記錄每次更新的日志。前者性能較高,但是可能會引起一定程度的數(shù)據(jù)丟失;后者相反。 Redis支持將數(shù)據(jù)同步到多臺從數(shù)據(jù)庫上,這種特性對提高讀取性能非常有益。

4.6 Redis如何實(shí)現(xiàn)分布式可拓展性?

2.8以前的版本:與Memcached一致,可以在客戶端實(shí)現(xiàn),也可以使用代理,twitter已開發(fā)出用于Redis和Memcached的代理Twemproxy 。

3.0 以后的版本:相較于Memcached只能采用客戶端實(shí)現(xiàn)分布式存儲,Redis則在服務(wù)器端構(gòu)建分布式存儲。Redis Cluster是一個實(shí)現(xiàn)了分布式且允許單點(diǎn)故障的Redis高級版本,它沒有中心節(jié)點(diǎn),各個節(jié)點(diǎn)地位一致,具有線性可伸縮的功能。如圖給出Redis Cluster的分布式存儲架構(gòu),其中節(jié)點(diǎn)與節(jié)點(diǎn)之間通過二進(jìn)制協(xié)議進(jìn)行通信,節(jié)點(diǎn)與客戶端之間通過ascii協(xié)議進(jìn)行通信。在數(shù)據(jù)的放置策略上,Redis Cluster將整個 key的數(shù)值域分成16384個哈希槽,每個節(jié)點(diǎn)上可以存儲一個或多個哈希槽,也就是說當(dāng)前Redis Cluster支持的最大節(jié)點(diǎn)數(shù)就是16384

redis、memcache原理對比

五、綜合結(jié)論

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

1.性能上:

性能上都很出色,具體到細(xì)節(jié),由于Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數(shù)據(jù)時比

Memcached性能更高。而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis,雖然Redis最近也在存儲大數(shù)據(jù)的性能上進(jìn)行優(yōu)化,但是比起 Memcached,還是稍有遜色。

2.內(nèi)存空間和數(shù)據(jù)量大?。?/p>

MemCached可以修改最大內(nèi)存,采用LRU算法。Redis增加了VM的特性,突破了物理內(nèi)存的限制。

3.操作便利上:

MemCached數(shù)據(jù)結(jié)構(gòu)單一,僅用來緩存數(shù)據(jù),而Redis支持更加豐富的數(shù)據(jù)類型,也可以在服務(wù)器端直接對數(shù)據(jù)進(jìn)行豐富的操作,這樣可以減少網(wǎng)絡(luò)IO次數(shù)和數(shù)據(jù)體積。

4.可靠性上:

MemCached不支持?jǐn)?shù)據(jù)持久化,斷電或重啟后數(shù)據(jù)消失,但其穩(wěn)定性是有保證的。Redis支持?jǐn)?shù)據(jù)持久化和數(shù)據(jù)恢復(fù),允許單點(diǎn)故障,但是同時也會付出性能的代價。

5.應(yīng)用場景:

Memcached:動態(tài)系統(tǒng)中減輕數(shù)據(jù)庫負(fù)載,提升性能;做緩存,適合多讀少寫,大數(shù)據(jù)量的情況(如人人網(wǎng)大量查詢用戶信息、好友信息、文章信息等)。

Redis:適用于對讀寫效率要求都很高,數(shù)據(jù)處理業(yè)務(wù)復(fù)雜和對安全性要求較高的系統(tǒng)(如新浪微博的計數(shù)和微博發(fā)布部分系統(tǒng),對數(shù)據(jù)安全性、讀寫要求都很高)。

六、需要慎重考慮的部分

1.Memcached單個key-value大小有限,一個value最大只支持1MB,而Redis最大支持512MB

2.Memcached只是個內(nèi)存緩存,對可靠性無要求;而Redis更傾向于內(nèi)存數(shù)據(jù)庫,因此對對可靠性方面要求比較高

3.從本質(zhì)上講,Memcached只是一個單一key-value內(nèi)存Cache;而Redis則是一個數(shù)據(jù)結(jié)構(gòu)內(nèi)存數(shù)據(jù)庫,支持五種數(shù)據(jù)類型,因此Redis除單純緩存作用外,還可以處理一些簡單的邏輯運(yùn)算,Redis不僅可以緩存,而且還可以作為數(shù)據(jù)庫用

4.新版本(3.0)的Redis是指集群分布式,也就是說集群本身均衡客戶端請求,各個節(jié)點(diǎn)可以交流,可拓展行、可維護(hù)性更強(qiáng)大。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
  • memcache
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    2450
收藏 人收藏

    評論

    相關(guān)推薦

    Redis為什么這么快?

    Redis 是基于內(nèi)存的數(shù)據(jù)庫,那不可避免的就要與磁盤數(shù)據(jù)庫做對比。對于磁盤數(shù)據(jù)庫來說,是需要將數(shù)據(jù)讀取到內(nèi)存里的,這個過程會受到磁盤 I/O 的限制。而對于內(nèi)存數(shù)據(jù)庫來說,本身數(shù)據(jù)就存在于內(nèi)存里,也就沒有了這方面的開銷。
    發(fā)表于 04-12 10:32 ?166次閱讀
    <b class='flag-5'>Redis</b>為什么這么快?

    Redis開源版與Redis企業(yè)版,怎么選用?

    點(diǎn)擊“藍(lán)字”關(guān)注我們數(shù)以千計的企業(yè)和數(shù)以百萬計的開發(fā)人員Redis開源版來構(gòu)建應(yīng)用程序。但隨著用戶數(shù)量、數(shù)據(jù)量和地區(qū)性的增加,成本、可擴(kuò)展性、運(yùn)營和可用性等問題也隨之而來。Redis企業(yè)版
    的頭像 發(fā)表于 04-04 08:04 ?696次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業(yè)版,怎么選用?

    新版 Redis 不再“開源”,對使用者都有哪些影響?

    2024 年 3 月 20 日,Redis Labs 宣布從 Redis 7.4 開始,將原先比較寬松的 BSD 源碼使用協(xié)議修改為 RSAv2和 SSPLv1協(xié)議。該變化意味著 Redis
    的頭像 發(fā)表于 03-27 22:30 ?367次閱讀
    新版 <b class='flag-5'>Redis</b> 不再“開源”,對使用者都有哪些影響?

    聊聊Redis的使用案例

    今天我們來聊聊 Redis 的使用案例。
    的頭像 發(fā)表于 12-13 14:13 ?407次閱讀

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】Redis源碼編譯和基準(zhǔn)測試

    -n 100000 輸出結(jié)果為: 3.6 基準(zhǔn)測試結(jié)果和樹莓派4B對比 在樹莓派4B開發(fā)板上,使用同樣的操作,運(yùn)行同樣版本的redis-server和redis-benchmark,得到的測試結(jié)果
    發(fā)表于 12-10 22:18

    【昉·星光 2 高性能RISC-V單板計算機(jī)體驗(yàn)】Redis源碼編譯和性能測試以及與樹莓派4B對比

    令: redis-benchmark -t set -n 100000 輸出結(jié)果為: 3.6 基準(zhǔn)測試結(jié)果和樹莓派4B對比 在樹莓派4B開發(fā)板上,使用同樣的操作,運(yùn)行同樣版本的redis
    發(fā)表于 12-10 21:27

    redis容器內(nèi)怎么查看redis日志

    redis是一款流行的開源內(nèi)存數(shù)據(jù)庫,常用于緩存、消息隊(duì)列、任務(wù)管理等場景。在使用redis時,了解如何查看redis日志對于排查問題、監(jiān)控性能和分析應(yīng)用程序行為非常重要。在本文中,我們將介紹在
    的頭像 發(fā)表于 12-05 10:10 ?2923次閱讀

    redis的lru原理

    Redis是一種基于內(nèi)存的鍵值數(shù)據(jù)庫,它使用了LRU(Least Recently Used)算法來進(jìn)行緩存的數(shù)據(jù)淘汰。LRU算法的核心思想是最近最少使用的數(shù)據(jù)將會在未來也不常用,因此應(yīng)該優(yōu)先
    的頭像 發(fā)表于 12-05 09:56 ?526次閱讀

    redis的原理和使用場景

    Redis(Remote Dictionary Server)是一個開源的、高性能的非關(guān)系型(NoSQL)的鍵值對數(shù)據(jù)庫管理系統(tǒng)。它以其快速讀寫能力和多種數(shù)據(jù)結(jié)構(gòu)支持而聞名,并被廣泛應(yīng)用于緩存
    的頭像 發(fā)表于 12-04 16:29 ?487次閱讀

    redis的淘汰策略

    Redis是一種基于內(nèi)存的鍵值存儲系統(tǒng),為了充分利用內(nèi)存,Redis采用了一些淘汰策略來管理內(nèi)存空間。淘汰策略的作用是當(dāng)內(nèi)存空間不足時,選擇合適的數(shù)據(jù)對象進(jìn)行淘汰,釋放出更多的內(nèi)存空間,以供后續(xù)
    的頭像 發(fā)表于 12-04 16:23 ?457次閱讀

    Java redis鎖怎么實(shí)現(xiàn)

    在Java中實(shí)現(xiàn)Redis鎖涉及到以下幾個方面:Redis的安裝配置、Redis連接池的使用、Redis數(shù)據(jù)結(jié)構(gòu)的選擇、實(shí)現(xiàn)分布式鎖的幾種方式等。 一、
    的頭像 發(fā)表于 12-04 10:47 ?911次閱讀

    Windows Docker部署Redis的流程

    由于 Docker 部署 Redis 后,Redis 容器中默認(rèn)是沒有 redis.conf 配置文件的,需要自己手動掛在進(jìn)去。
    的頭像 發(fā)表于 11-27 10:02 ?725次閱讀
    Windows Docker部署<b class='flag-5'>Redis</b>的流程

    Redis中的使用

    Redis 作為內(nèi)存的存儲中間件,已經(jīng)是面試的面試題必問之一了,今天一起來看看 Redis 的事務(wù)吧。 事務(wù)提供了一種"將多個命令打包,一次性提交并按順序執(zhí)行"的機(jī)制,提交后在事務(wù)執(zhí)行中不會
    的頭像 發(fā)表于 10-08 15:27 ?398次閱讀
    <b class='flag-5'>Redis</b>中的使用

    如何用Springboot整合Redis

    本篇文件我們來介紹如何用Springboot整合Redis。 1、Docker 安裝 Redis 1.1 下載鏡像 docker pull redis: 6 . 2 . 6 1.2 創(chuàng)建配置文件
    的頭像 發(fā)表于 10-08 14:56 ?487次閱讀
    如何用Springboot整合<b class='flag-5'>Redis</b>

    使用NineData快速、高效完成Redis差異數(shù)據(jù)對比

    NineData在Redis數(shù)據(jù)遷移場景下表現(xiàn)出色,可快速準(zhǔn)確完成Redis數(shù)據(jù)對比,找出不一致的key并生成詳細(xì)報告。數(shù)據(jù)對比方案需考慮數(shù)據(jù)一致性和數(shù)據(jù)量規(guī)模,而NineData基于
    的頭像 發(fā)表于 10-07 11:57 ?379次閱讀
    使用NineData快速、高效完成<b class='flag-5'>Redis</b>差異數(shù)據(jù)<b class='flag-5'>對比</b>!