對比Memcached和Redis,誰才是適合你的快取?
阿新 • • 發佈:2020-05-22
# Memcached vs Redis
近期公司採購軟體,評估時,某軟體談到使用了 `Memcached` 和 `Redis` 快取。在本文中,將研究這兩個流行的快取的異同,方便理解和記憶。
## 1. Memcached 與 Redis
通常,我們會考慮在處理大量資料時使用**[快取](https://www.baeldung.com/spring-cache-tutorial)提高效能。**
`Memcached` 是一個分散式記憶體快取系統,設計簡單易用,非常適合用作快取或會話儲存。
`Redis` 是一個記憶體中的資料結構儲存,它提供了一系列豐富的特性。它作為快取、資料庫、訊息代理和佇列非常有用。
## 2. 安裝
### 2.1. 安裝 Memcached
下載最新版的 `Memcached` 包並執行make進行安裝 :
```shell
$ 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](https://redis.io/download):
```shell
$ 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](https://github.com/killme2008/xmemcached) 和 [Memcached-java-client](https://github.com/gwhalin/Memcached-Java-Client) , Redis 有 [Jedis](https://www.baeldung.com/jedis-java-redis-client-library), [Lettuce](https://www.baeldung.com/java-redis-lettuce), 和 [Redisson](https://www.baeldung.com/redis-redisson)。
### 3.4.快取清除
Memcached 允許使用 [*flush_all*](https://github.com/memcached/memcached/wiki/Commands#flushall) 命令清理快取. 相似的, Redis 允許我們從快取中刪除所有內容通過使用命令: [*FLUSHDB*](https://redis.io/commands/flushdb) and [*FLUSHALL*](https://redis.io/commands/flushall).
### 3.5. 可伸縮性
這兩種快取解決方案都提供了在需求呈指數增長時處理大資料的高可伸縮性。
## 4. 存異
### 4.1. 命令列模式
Memcached 可以通過telnet連線到伺服器並執行命令:
```shell
$ 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*](https://redis.io/topics/rediscli),允許我們執行[命令](https://redis.io/命令):
```shell
$ 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 命令](https://redis.io/commands/command/命令)* 列出Redis提供的所有命令。
### 4.2. 磁碟I/O轉儲
Memcached使用第三方工具處理磁碟轉儲,如[libmemcached tools](https://libmemcached.org/libmemcached.html)或者像[memcached dd](https://github.com/dkrotx/memcached-dd).
但是,Redis為磁碟轉儲提供了高度可配置的預設機制,如RDB(Redis資料庫檔案)或AOF(僅附加檔案)。這對於存檔和恢復非常有用。
使用 redis cli,我們可以執行同步的 [*SAVE*](https://redis.io/commands/save) 獲取記憶體中資料快照的命令:
```shell
$ redis-cli SAVE OK
```
在這裡,命令將快照儲存在 *轉儲 .rdb* 二進位制檔案,完成後返回狀態*確定*。
但是,非同步[*BGSAVE*](https://redis.io/commands/bgsave) 的執行將啟動產生快照的後臺過程:
```shell
$ redis-cli BGSAVE
OK
```
此外,我們可以使用 [*LASTSAVE*](https://redis.io/commands/lastsave) 命令檢查上次成功的資料庫快照的Unix時間。
```
$ redis-cli LASTSAVE
(integer) 1410853592
```
### 4.3. 資料結構
Memcached 將 鍵-值對 儲存為字串,每個值的大小限制為1MB。不過,**Redis也支援其他資料結構 ,像list、set和hash一樣,可以儲存高達512MB的大小**。
### 4.4. 複製
Memcached 支援使用第三方 如 [repcached](http://repcached.lab.klab.org/) 進行復制。
與 Memcached 不同,Redis 通過複製主儲存為我們提供了成倍增加叢集的功能,以獲得更好的可伸縮性和高可用性。
首先,我們可以使用 [*REPLICAOF*](https://redis.io/commands/replicaof) 建立Redis主伺服器的副本。接下來,我們在複製副本上執行 [*PSYNC*](https://redis.io/commands/psync) 命令以從主機啟動複製。
### 4.5. 事務
Memcached 不支援事務,儘管其操作是原子的。
Redis 為執行命令提供了開箱即用的事務支援。
我們可以使用 [*MULTI*](https://redis.io/commands/multi) 命令啟動事務。然後使用 [*EXEC*](https://redis.io/commands/exec) 用於執行後續的命令。最後,Redis提供了 [*WATCH*](https://redis.io/commands/watch) 命令用於有條件地執行事務。
### 4.6. 釋出和訂閱訊息
Memcached 不提供開箱即用的 釋出/訂閱 機制。
另一方面Redis,使用 pub/sub 訊息佇列提供訂閱訊息的功能。
這在設計需要實時通訊的應用程式(如聊天室、社交媒體訂閱源和伺服器內部通訊)時非常有用。
Redis附帶了諸如 *[PUBLISH]、*[*SUBSCRIBE*] 和 [*UNSUBSCRIBE*] 這樣的專用命令,分別用於將訊息釋出到頻道、訂閱和取消訂閱客戶端到指定頻道。
### 4.7. 地理空間支援
地理空間支援對於實現應用程式的基於位置的功能非常有用。不同於Memcached, Redis 帶有特殊的[用於管理實時地理空間資料的命令]
舉個例子, [*GEODIST*](https://redis.io/commands/geodist) 命令計算兩個地理空間條目之間的距離。 同樣地, [*GEORADIUS*](https://redis.io/commands/georadius) 命令返回所提供半徑內的所有條目。
另外,我們可以使用 [Spring Data Redis](https://www.baeldung.com/spring-data-redis-tutorial) 在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* 命令來計算指令碼:
```shell
$ 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.develop