Memcached vs Redis
近期公司采購軟體,評估時,某軟體談到使用了 Memcached 和 Redis 快取,在本文中,將研究這兩個流行的快取的異同,方便理解和記憶,
1. Memcached 與 Redis
通常,我們會考慮在處理大量資料時使用快取提高性能,
Memcached 是一個分布式記憶體快取系統,設計簡單易用,非常適合用作快取或會話存盤,
Redis 是一個記憶體中的資料結構存盤,它提供了一系列豐富的特性,它作為快取、資料庫、訊息代理和佇列非常有用,
2. 安裝
2.1. 安裝 Memcached
下載最新版的 Memcached 包并執行make進行安裝 :
$ wget http://memcached.org/latest
$ tar -zxvf memcached-1.6.3.tar.gz
$ cd memcached-1.6.3
$ ./configure && make && make test && sudo make install
2.2. 安裝 Redis
相似的, 安裝最新版本的 Redis server:
$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz
$ tar xzf redis-5.0.8.tar.gz
$ cd redis-5.0.8
$ make
3. 求同
3.1. 亞毫秒延遲
Memcached 和 Redis 都通過將資料保存在記憶體中來提供 亞毫秒級 的回應時間,
3.2. 資料磁區
類似地,兩個記憶體資料庫都允許跨多個節點分發資料,
3.3. 編程語言支持
同樣,兩者都支持所有主要的編程語言,包括Java、Python、JavaScript、C和Ruby,
另外,記憶體中的兩個資料庫都有一些Java客戶機,例如,Memcached 有 Xmemcached 和 Memcached-java-client , Redis 有 Jedis, Lettuce, 和 Redisson,
3.4.快取清除
Memcached 允許使用 flush_all 命令清理快取. 相似的, Redis 允許我們從快取中洗掉所有內容通過使用命令: FLUSHDB and FLUSHALL.
3.5. 可伸縮性
這兩種快取解決方案都提供了在需求呈指數增長時處理大資料的高可伸縮性,
4. 存異
4.1. 命令列模式
Memcached 可以通過telnet連接到服務器并執行命令:
$ telnet 192.168.8.123 6605
Trying 192.168.8.123
Connected to 192.168.8.123
$ stats
STAT pid 14868
STAT uptime 175931
STAT time 1220540125
// ...
與Memcached不同,Redis有一個專用的命令列界面: Redis cli,允許我們執行命令:
$ redis-cli COMMAND
1) 1) "save"
2) (integer) 1
3) 1) "admin"
2) "noscript"
// ...
2) 1) "multi"
2) (integer) 1
3) 1) "noscript"
2) "fast"
// ...
3) 1) "geodist"
2) (integer) -4
3) 1) "readonly"
// ...
// ...
在這里,我們執行了COMMAND 命令 列出Redis提供的所有命令,
4.2. 磁盤I/O轉儲
Memcached使用第三方工具處理磁盤轉儲,如libmemcached tools或者像memcached dd.
但是,Redis為磁盤轉儲提供了高度可配置的默認機制,如RDB(Redis資料庫檔案)或AOF(僅附加檔案),這對于存檔和恢復非常有用,
使用 redis cli,我們可以執行同步的 SAVE 獲取記憶體中資料快照的命令:
$ redis-cli SAVE OK
在這里,命令將快照存盤在 轉儲 .rdb 二進制檔案,完成后回傳狀態確定,
但是,異步BGSAVE 的執行將啟動產生快照的后臺程序:
$ redis-cli BGSAVE
OK
此外,我們可以使用 LASTSAVE 命令檢查上次成功的資料庫快照的Unix時間,
$ redis-cli LASTSAVE
(integer) 1410853592
4.3. 資料結構
Memcached 將 鍵-值對 存盤為字串,每個值的大小限制為1MB,不過,Redis也支持其他資料結構 ,像list、set和hash一樣,可以存盤高達512MB的大小,
4.4. 復制
Memcached 支持使用第三方 如 repcached 進行復制,
與 Memcached 不同,Redis 通過復制主存盤為我們提供了成倍增加集群的功能,以獲得更好的可伸縮性和高可用性,
首先,我們可以使用 REPLICAOF 創建Redis主服務器的副本,接下來,我們在復制副本上執行 PSYNC 命令以從主機啟動復制,
4.5. 事務
Memcached 不支持事務,盡管其操作是原子的,
Redis 為執行命令提供了開箱即用的事務支持,
我們可以使用 MULTI 命令啟動事務,然后使用 EXEC 用于執行后續的命令,最后,Redis提供了 WATCH 命令用于有條件地執行事務,
4.6. 發布和訂閱訊息
Memcached 不提供開箱即用的 發布/訂閱 機制,
另一方面Redis,使用 pub/sub 訊息佇列提供訂閱訊息的功能,
這在設計需要實時通信的應用程式(如聊天室、社交媒體訂閱源和服務器內部通信)時非常有用,
Redis附帶了諸如 [PUBLISH]、[SUBSCRIBE] 和 [UNSUBSCRIBE] 這樣的專用命令,分別用于將訊息發布到頻道、訂閱和取消訂閱客戶端到指定頻道,
4.7. 地理空間支持
地理空間支持對于實作應用程式的基于位置的功能非常有用,不同于Memcached, Redis 帶有特殊的[用于管理實時地理空間資料的命令]
舉個例子, GEODIST 命令計算兩個地理空間條目之間的距離, 同樣地, GEORADIUS 命令回傳所提供半徑內的所有條目,
另外,我們可以使用 Spring Data Redis 在Java應用程式中啟用Redis地理空間支持,
4.8. 架構
Redis使用單核,在存盤小資料集方面表現出比 Memcached 更好的性能,
Memcached通過使用多個內核實作多執行緒體系結構, 因此,對于存盤更大的資料集,Memcached的性能要優于Redis,
Memcached的多執行緒體系結構的另一個好處是它通過利用多個計算資源實作的高可伸縮性,
Redis可以通過集群進行橫向擴展,設定和操作相對復雜,當然了,我們可以使用Java應用程式通過 jedis 或者 Lettuce 啟用Redis集群,
4.9. LUA Scripting
與 Memcached 不同,我們可以對 Redis 執行[LUA scripts],它提供了類似于 [EVAL] 和 [SCRIPT LOAD] 的命令,這些命令對于 LUA 腳本的執行非常有用,
例如,我們可以執行 EVAL 命令來計算腳本:
$ redis-cli eval "return redis.call('set',KEYS[1],'welldone')" 1 website
OK
在這里,我們可以使用 eval 設定key=website 的值為 welldone ,
4.10. 記憶體利用率
比較字串資料結構時,Memcached的記憶體利用率高于Redis,
盡管如此,當Redis使用散列結構時,它提供了比Memcached更高的記憶體利用率,
5. 寫在最后
在本文中,我們探討了Memcached和Redis,首先,我們研究了兩個記憶體資料庫的相似性,然后,我們研究了這兩種快取解決方案所提供功能的差異,
目前有許多記憶體快取解決方案可用,因此,我們應該考慮快取引擎的特性,并將它們與我們實際的用例相匹配,
我們可以肯定地得出結論,Memcached是解決簡單快取問題的可靠選擇,然而,一般來說,Redis通過提供更豐富的功能和各種各樣的特性而優于Memcached,這些特性對于解決復雜的場景更有優勢,
公眾號: 鍋外的大佬 ,歡迎加群~
博客地址: http://www.developlee.top
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/185728.html
標籤:Java
上一篇:Google真的會被拆分嗎?
