Java技術棧
www.javastack.cn
關注閱讀更多優質文章
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,這些特性對於解決複雜的場景更有優勢」。
最近熱文:
1、Spring Boot 幹掉了 Maven 擁抱 Gradle!
10、Spring Boot 2.3.1 發佈, 10 個新特性!
掃碼關注Java技術棧公衆號閱讀更多幹貨。
點擊「閱讀原文」獲取面試題大全~