1. 程式人生 > >Redis和Memcache

Redis和Memcache

看專案的時候,發現了我們的系統中,同時使用了redis和memcache;起初自己也沒有太注意;現在細細想想既然用了兩個元件,必然都有他們的長處和短處。看看他們的區別:

You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver.

    You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case.

    You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there.

    You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).

    有網友翻譯如下[1]:

    沒有必要過多的關注效能。由於Redis只使用單核,而Memcached可以使用多核,所以在比較上,平均每一個核上Redis在儲存小資料時比Memcached效能更高。而在100k以上的資料中,Memcached效能要高於Redis,雖然Redis最近也在儲存大資料的效能上進行優化,但是比起Memcached,還是稍有遜色。說了這麼多,結論是,無論你使用哪一個,每秒處理請求的次數都不會成為瓶頸。

    你需要關注記憶體使用率。對於key-value這樣簡單的資料儲存,memcache的記憶體使用率更高。如果採用hash結構,redis的記憶體使用率會更高。當然,這些都依賴於具體的應用場景。

    你需要關注關注資料持久化和主從複製時,只有redis擁有這兩個特性。如果你的目標是構建一個快取在升級或者重啟後之前的資料不會丟失的話,那也只能選擇redis。

    你應該關心你需要的操作。redis支援很多複雜的操作,甚至只考慮記憶體的使用情況,在一個單一操作裡你常常可以做很多,而不需要將資料讀取到客戶端中(這樣會需要很多的IO操作)。這些複雜的操作基本上和純GET和POST操作一樣快,所以你不只是需要GET/SET而是更多的操作時,redis會起很大的作用。

    對於兩者的選擇還是要看具體的應用場景,如果需要快取的資料只是key-value這樣簡單的結構時,我在專案裡還是採用memcache,它也足夠的穩定可靠。如果涉及到儲存,排序等一系列複雜的操作時,毫無疑問選擇redis。

看看自己的專案,發現使用redis時,都是存個token,存個驗證碼,存一個使用者私鑰什麼的小資料量。而在儲存課程列表,題庫試卷時,則用了memcache。現在想想,如果系統對效能要求不高的話,當然能用一個就用一個了。

 

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模式的資料備份。