鍍金池/ 教程/ 大數(shù)據(jù)/ Redis 與 Memcache
Redis 數(shù)據(jù)淘汰機制
積分排行榜
小剖 Memcache
Redis 數(shù)據(jù)結(jié)構(gòu) intset
分布式鎖
從哪里開始讀起,怎么讀
Redis 數(shù)據(jù)結(jié)構(gòu) dict
不在浮沙筑高臺
Redis 集群(上)
Redis 監(jiān)視器
源碼閱讀工具
Redis 日志和斷言
內(nèi)存數(shù)據(jù)管理
Redis 數(shù)據(jù)結(jié)構(gòu)綜述
源碼日志
Web 服務(wù)器存儲 session
消息中間件
Redis 與 Lua 腳本
什么樣的源代碼適合閱讀
Redis 數(shù)據(jù)結(jié)構(gòu) sds
Memcached slab 分配策略
訂閱發(fā)布機制
Redis 是如何提供服務(wù)的
Redis 事務(wù)機制
Redis 集群(下)
主從復(fù)制
Redis 應(yīng)用
RDB 持久化策略
Redis 數(shù)據(jù)遷移
Redis 事件驅(qū)動詳解
初探 Redis
Redis 與 Memcache
AOF 持久化策略
Redis 數(shù)據(jù)結(jié)構(gòu) redisOb
作者簡介
Redis 數(shù)據(jù)結(jié)構(gòu) ziplist
Redis 數(shù)據(jù)結(jié)構(gòu) skiplist
Redis 哨兵機制

Redis 與 Memcache

單進程單線程與單進程多線程

Redis 是單進程單線程的工作模式,所有的請求都被排隊處理處理,因此緩存數(shù)據(jù)沒有互斥的需求。而 Memcached 是單進程多線程的工作模式,請求到達時,主線程會將請求分發(fā)給多個工作線程,因此必須要做數(shù)據(jù)的互斥。

在處理請求的能力上,兩者是不相上下的。理論上在一臺支持多線程的機器上,Memecached 的 get 操作的吞吐量會較 Redis 高。

那到底是多線程還是單線程優(yōu)秀?多線程一般會增加程序邏輯的復(fù)雜度,需要考慮線程與線程之間的同步與互斥,一定程度上拉低了每個線程的吞吐量(工作量),更多的時間是花在了等待互斥鎖上。一般建議在系統(tǒng)設(shè)計的時候多考慮系統(tǒng)的橫向擴展性。

使用每個進程單個線程的模式。這里沒有信條,不是非黑即白,就看什么樣的方法解決什么樣的問題了。

豐富與簡單的數(shù)據(jù)結(jié)構(gòu)

Redis 有豐富的原生數(shù)據(jù)結(jié)構(gòu),包括字符串,鏈表,集合,有序集合,哈希表,二進制數(shù)組等,可見 Redis 能適用于更多的場景,可以當作一個數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫。Memcached 在這方面較 Redis 遜色,只能做簡單的 key/value 存儲。

其他

除了上面所說,與 Memcached 比較:

  1. Redis 原生支持主從復(fù)制,可以實現(xiàn)一主多從的場景,提高了可用性
  2. Redis 原生支持 RDB 和 AOF 兩種持久化方式。前者是將內(nèi)存中的數(shù)據(jù)整體落地,后者是將數(shù)據(jù)的更新落地,類似于 MySQL 中的 binlog。Memcached 原生并不支持持久化
  3. Redis 支持事務(wù)
  4. Redis 支持鍵值對的過期時間設(shè)置
  5. Redis 3.0 中已經(jīng)開始支持 Redis 集群了

對比下來,Redis 好玩多了。

性能測試

曾經(jīng)被問到 Redis 和 Memcached 哪個更快?在測試的時候,需要保證測試的客觀環(huán)境是一樣的,這包括測試機器,客戶端除了在構(gòu)造協(xié)議的邏輯部分不一樣外,其他都應(yīng)該是保持一致的。

測試環(huán)境:

ubuntu, Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz 4 核心
memcache 1.4.14
redis 3.1.99

測試概括了一些結(jié)論:

  1. 隨著 payload 增大,會越影響讀寫性能,尤其是 Redis
  2. Redis,Memcache(worker 線程數(shù)為1),讀寫性能不分上下,Redis 更優(yōu)一點
  3. Memcache 的 worker 線程達到一定個數(shù),會導(dǎo)致讀寫的性能下降

默認情況下,Memcached 默認鍵長設(shè)置為 256B,存儲數(shù)據(jù)長度限制為 1M??梢酝ㄟ^ Memcached 的 -I 選項調(diào)整默認 slab 頁面大小,從而可以調(diào)整存儲數(shù)據(jù)長度的限制,但 Memcached 官方是不建議這種做法的。

沒有非黑即白的答案,只有哪個工具在哪種場景下更為適用。