03.06 memcache與redis有何區別,redis有哪些優勢呢?

小藝吃雞


簡介

說到緩存技術,只要有一定經驗的開發人員,肯定會想到redis和memcached這兩個。並且在BAT裡,redis已經逐漸取代了memcached,成為分佈式場景廣泛使用的緩存方案。接下來,我們就分析下,redis是如何取代memcached,成為開發者的寵兒的。

一、支持的存儲類型不同

雖然redis和memcached都是內存型數據庫,並且memcached不僅能夠存儲string類型,還能夠存儲圖片、文件、視頻等格式的文件。然而對於更多的使用內存數據庫做緩存以及分佈式方案的程序開發者來說,memcached提供的string類型存儲的應用場景非常有限,而存儲圖片視頻的功能又十分雞肋(許多公司的用戶場景是沒這方面需求)。相比之下,redis提供set,hash,list等多種類型的存儲結構,非常適合分佈式緩存的實現。

二、數據落盤

memcached 數據不可恢復,雖然大多數人使用緩存以及分佈式方案都不會要求數據持久化,但是誰也不能保證不出現萬一的情況。一旦發生穩定性問題,memcached掛掉後,數據是不可恢復的,而redis除了支持在配置裡打開數據落盤(RDB),還能通過aof來找回數據。

三、內存空間與數據量

memcached可以修改最大內存,使用的是LRU算法,而redis目前底層使用了自己的VM,引入了新的特性突破了物理內存的限制。個人認為在這方面依然是redis更加優秀一些。

備註:value值-redis最大可以達到1GB,而memcache只有1MB;

四、使用場景

(1)、會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平臺Magento也提供Redis的插件。

(2)、全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC。

再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

(3)、隊列

Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後臺就是使用Redis作為broker,你可以從這裡去查看。

(4),排行榜/計數器

Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:

當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這裡看到。

(5)、發佈/訂閱

最後(但肯定不是最不重要的)是Redis的發佈/訂閱功能。發佈/訂閱的使用場景確實非常多。我已看見人們在社交網絡連接中使用,還可作為基於發佈/訂閱的腳本觸發器,甚至用Redis的發佈/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。

(6)、其他

但是如果是對緩存的數據格式有更多的要求,且對安全性也有很高的要求的話,建議還是使用redis,這也是redis目前正在逐漸代替memcached的根本原因。

五、總結

六、快問快答

1、redis常見性能問題和解決方案?

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件

(2) 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次

(3) 為了主從複製的速度和連接的穩定性,Master和Slave最好在同一個局域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向鏈表結構更為穩定,即:Master

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

2、MySQL裡有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據?

相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略:

voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰;

volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰;

volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰;

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰;

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據;

七、經典架構

---------------END----------------

後續的內容同樣精彩








IT實戰聯盟


首先,Memcached和Redis都是著名的、廣泛使用的Nosql數據庫。

1. Memcached簡介

Memcached 免費開源、高性能、分佈式內存對象緩存系統,主要用於作為關係數據庫緩存,用來加速應用程序的訪問,減輕主數據庫的壓力。Memcached 是一個內存key-value存儲,主要存儲字符串或者小的對象等數據庫調用,API調用或者頁面渲染結果的數據。Memcached立足於簡單、快速部署可以解決大型數據庫緩存的各種問題。

Memcached同時又非常強大,支持包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等語言調用。Memcached在業界廣泛應用,除了開發者LiveJournal自己外還有Wikipedia、Flickr、Bebo,WordPress.com,Craigslist、 Mixi也在使用。

2. Redis簡介

Redis同樣是一個免費開源的key-value存儲系統。可以用做數據庫,緩存和消息代理使用。Redis支持比較多的數據類型,包括:字符串、哈希 表、鏈表、集合、有序集合。

Redis使用C語言開發,支持絕大多數類Unix系統,在Linux,BSD、Unix,OS X等符合POSIX的系統下無需任何依賴就能使用。官方建議在線上應用的話最好在Linux下部署。在Windows下有非官方微軟自己開發和維護的的Redis。

Redis和Memcached對比

1、性能對比

由於Redis廣泛使用的版本只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis也升級新版本3.0以上支持多核,但是3.0以上版本除了增加很多功能外,性能還不如老版本。

這是是相關性能測試對比圖:

2、內存使用效率對比

使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcached。

3、Redis支持服務器端的數據操作

Redis相比Memcached來說,擁有更多的數據結構和並支持更豐富的數據操作,通常在Memcached 裡,你需要將數據拿到客戶端來進行類似的修改再set回去。這大大增加了網絡IO的次數和數據體積。在Redis中,這些複雜的操作通常和一般的 GET/SET一樣高效。所以,如果需要緩存能夠支持更復雜的結構和操作,那麼Redis會是不錯的選擇。

4、Redis的持久化和主從架構

Redis雖然內存的存儲系統,但是支持內存數據持久化,而且提供兩種主要的持久化策略:RDB快照和AOF日誌。使得Redis可以保存比較重要的數據不怕斷電後數據丟失,同時基於數據持久化的分佈式主從架構也提升了Redis的可用性和性能問題。

作為對比,雖然memecached的雖然也支持通過客戶端的分佈式存儲架構。

關於memcached的命中率

緩存的命中率命中:直接從緩存中get讀能取到想要的數據。 不命中:緩存中沒有想要的數據,還需要到數據庫進行一次查詢才能讀取到想要的數據。

所以命中率的高低會直接影響memcached性能。那麼要如何進行優化,提高命中率呢?

優化設置項目:

1、默認單個item最大數據是1MB,超過1MB數據不予存儲,常量POWER_BLOCK 1048576 進行控制,它是默認的slab大小

2、要根據實際業務情況預估一些參數大小,適當的調整內存頁大小和增長因子。

設定參數:

-f:chunk增長因子,默認1.25。

-n:指定最小chunk的key+suffix+value大小。

Item (no cas) 48,Item(cas) 56。

當指定-C選項時,最小chunk為-n指定大小+48;當沒有-C選項時,最小chunk為-n指定大

3、極端情況下,你可以禁止LRU(最近最少使用算法)試試。通過“-M”參數可以禁止LRU。


分享到:


相關文章: