Elasticache : 比較 Memcached 和 Redis 的差別
總覽
Amazon ElastiCache 提供全受管的 Redis 和 Memcached。無縫地部署、執行和擴展常見的開放原始碼相容記憶體內資料存放區。從高輸送量和低延遲記憶體內資料存放區擷取資料,可建立資料密集型應用程式或提高現有應用程式的效能。Amazon ElastiCache 是遊戲、廣告技術、金融服務、醫療保健和 IoT 應用程式的熱門選擇。
大綱
在這篇文章中,我們會簡單介紹 Memcached 和 Redis,比較兩者間的差異,探討兩種快取的使用情形。再用 Command line 對兩者進行測試,最後再嘗試放入簡單的 .csv檔案。
Memcached 介紹
Memcached 是一種易於使用的高效能記憶體內資料存放區。它提供一個成熟、可擴展的開放原始碼解決方案,可提供低於一毫秒的回應時間,很適合做為快取或工作階段存放區。Memcached 是支援 Web、行動應用程式、遊戲、廣告技術和電子商務即時應用程式的熱門選項。
優勢
- 低延遲
- 簡單易用
- 可擴展性
- 支援多種程式語言
- 多執行續的程序
使用情境
-
快取
-
工作階段存放區
在 Telnet 上使用 Memcached
關於如何啟用與執行 AWS Memcached 服務,請參考 Amazon ElastiCache for Memcached 入門。
使用的命令格式
'command name' 'key' 'flags' 'exptime' 'bytes' 'data block'
命令說明 :
command name : 命令,像是 set/add/replace 等等。
key : 儲存資料的 key。
flags : 伺服器與數據(由用戶提供)存儲的32位元無符號整數,並在檢索項目時回傳數據
exptime : 存在時間,以秒為單位,0表示永遠存在。
bytes : data block 可儲存的位元數。
data block : 要儲存在 key 上的值。
執行範例
[ec2-user@ip-10-0-0-173 redis-stable]$ telnet "Your-AWS-Memcached-endpoint" 11211
Trying 10.0.0.174...
Connected to "Your-AWS-Memcached-endpoint".
Escape character is '^]'.
set a 0 0 5 // 將 key a 的值設為 Hello
Hello
STORED
get a // 讀取 key a 的值
VALUE a 0 5
Hello
END
delete a // 刪除 key a
DELETED
get a
END
set b 0 0 2 // 將 key b 的值設為 Hi
Hi
STORED
replace b 0 0 7 // 將 key b 的值用 Goodbye 來取代
Goodbye
STORED
get b // 讀取 key b 的值檢查它是否有被替換
VALUE b 0 7
Goodbye
END
append b 0 0 2 // 在 key b 後面加 Hi
Hi
STORED
prepend b 0 0 5 // 在 key b 前面加 Hello
Hello
STORED
get b // 讀取 key b,看看現在長什麼樣子
VALUE b 0 14
HelloGoodbyeHi
END
add c 0 0 1 // 增加一個 key c 並帶有值為 1
1
STORED
incr c 10 // 將 key c 上的數值增加 10
11
decr c 5 // 將 key c 上的數值減少 5
6
flush_all // 清空所有的 key
OK
quit // 離開 telnet 環境
其他命令 :
stats : 回傳完整的 Memcached 詳細資料,像是啟用時間、版本等等
stats slabs : 回傳 slabs 的詳細資料, 像是大小、記憶體使用率、使用的命令行數等等。
version : 印出 Memcached 的版本
因為 Memcached 沒有提供執行端,所以我們只能用一些簡單的指令去測試它。在這篇文章中,我們不會將它實作於任何專案中,但是在文章後半會使用 .csv 檔案去測試 Redis。
Redis 介紹
Redis 是快速的開放原始碼記憶體內鍵值資料存放區,可做為資料庫、快取、訊息代理程式和佇列使用。它的回應時間低於一毫秒,可讓遊戲、廣告科技、金融服務、醫療保健和 IoT 等領域的即時應用程式每秒處理數百萬個請求。Redis 是用於快取、工作階段管理、即時分析、地理空間、聊天/簡訊、媒體串流和遊戲排行榜的熱門選項。Redis 還可建立備份,讓你在發生問題時還有備份資料可恢復。
優勢
- 低延遲
- 簡單易用
- 可擴展性
- 支持多種程式語言
- 支援備份功能
- 可做讀寫分離
- 發布/訂閱模式
- 使用 Lua 伺服器語言
- 可儲存地理位置資訊
使用情境
- 快取
- 聊天、簡訊和佇列
- 遊戲排行榜
- 工作階段存放區
- 豐富的媒體串流
- 地理空間
- 機器學習
- 即時分析
在 Redis-cli 上使用 Redis
關於如何啟用與執行 AWS Redis 服務,請參考 Amazon ElastiCache for Redis 入門。
[ec2-user@ip-10-0-0-173 redis-stable]$ src/redis-cli -c -h "Your-Redis-Endpoint" -p 6379
Your-Redis-Endpoint:6379> ping // Ping 服務端以確認健康狀況
PONG
Your-Redis-Endpoint:6379> set a "Hello" // 將 key a 設為 hello
OK
Your-Redis-Endpoint:6379> get a // 讀取 key a
"Hello"
Your-Redis-Endpoint:6379> DEL a // 刪除 key a
(integer) 1
Your-Redis-Endpoint:6379> get a // 確認 key a 是否存在
(nil)
Your-Redis-Endpoint:6379> set b "Goodbye" EX 5 // 設置 key b 存在 5 秒鐘
OK
Your-Redis-Endpoint:6379> get b // 讀取 key b
"Goodbye"
Your-Redis-Endpoint:6379> get b // 再次拿取 key b
"Goodbye"
Your-Redis-Endpoint:6379> get b // 5 秒後拿取 key b
(nil)
Your-Redis-Endpoint:6379> HMSET C name "Redis" description "Testing" birthday "Today" // 設置雜湊表 c
OK
Your-Redis-Endpoint:6379> HGETALL C // 讀取雜湊表 c
1) "name"
2) "Redis"
3) "description"
4) "Testing"
5) "birthday"
6) "Today"
Your-Redis-Endpoint:6379> flushall // 清除所有 redis-cli 中的 keys
OK
Your-Redis-Endpoint:6379> quit // 離開 Redis-cli
其他仍有許多的命令可以用在 Redis 上面。確認需求後訪問 Redis commands 以獲取更多資訊。
將 .csv 檔案匯入 Redis-cli 中
使用 nano testfile.csv
創建一個 testfile.csv 的檔案。
id, first name, age, gender, nickname, salary
1, John Smith, 40, Male, John, 10000
2, Marco Polo, 43, Male, Marco, 10000
40, John Cena, 40, Male, John, 10002
1999999, Tom Cruse, 50, Male, Tom, 10001
嘗試將 testfile.csv 匯入 Redis-cli 中。
$ awk -F, 'NR > 1{ print "SET", "\"employee_"$1"\"", "\""$0"\"" }' testfile.csv | redis-cli -c -h "Your-Redis-Endpoint" -p 6379
關於 awk 指令:
-F : 以 -F 符號分隔、區別資料
NR : 告訴 awk 所處理的是『第幾行』資料
$1 : 顯示第一個欄位的資料
$0 : 顯示全部欄位的資料
看看 Redis-cli 裡面現在有什麼資料。
Your-Redis-Endpoint:6379> keys *
1) "employee_40"
2) "employee_1999999"
3) "employee_1"
4) "employee_2"
拿取 employee_40 確認內部資料。
Your-Redis-Endpoint:6379> get employee_40
"40, John Cena, 40, Male, John, 10002"
現在你可以看到剛剛的 testfile.csv 被匯入到 Redis-cli 當中,但是欄位屬性不見了,因為只有值會被存取到 Redis-cli 當中。
相似之處
毫秒級的延遲時間 Redis 和 Memcached 都支持毫秒的響應時間。 通過將數據存儲在內存中,它們可以比數據庫更快地讀取數據。
開發者簡單易用 Redis 和 Memcached 同樣都能簡單使用,只需要短短幾行程式碼就能應用在程式當中。
數據分區 Redis 和 Memcached 皆允許使用者將數據分散至不同節點中,在需求增多時能有效呼應需求。
支援許多程式語言 Redis 和 Memcached 都有許多開放資源給開發者使用,支援的程式語言有 Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby 等等。
資料儲存 Redis 和 Memcached 兩者都是 in-memory 的儲存,他們可以使用將資料儲存在 RAM 中以提供高效能的快取。
如何選擇要使用 Memcached 還是 Redis
如果你有以下需求就選擇 Memcached :
- 簡單的模型
- 使用多執行續來執行多節點程序
- 擴展/收縮功能
- 根據需求增加/減少節點
- 將資料分至不同區儲存
- 快取物件 (圖片、音檔等等)
如果你有以下需求就選擇 Redis :
- 複雜的資料型態,像是 string、hash、list 和 set
- 排序 in-memory 內的資料
- 持久性的 key 儲存
- 將你的資料做多個點的讀寫分離
- 自動化錯誤修復
- 使用/訂閱模式
- 備份和恢復資料
使用範例 : 遊戲中的快取
-
資料儲存: Memcached 和 Redis 都是 in-memory 的儲存方式,當要讀取資料時,我們可以從記憶體中得到它。寫入資料也是如此,我們會先將資料寫進記憶體中再寫進資料庫。
-
數據持久性: ElastiCache 會儲存快照,讓 Redis 用戶可以隨時取用來恢復有問題的叢集。快照是某個時尖下所建立的整個 Redis 叢集的備份,建立起來的快照會被存放在 S3 當中,具有長久的存儲功能,即使有斷電的情形發生也不會也不會遺失你的資料。但是,Memcached 不支援快照的功能,當執行中的快取發生問題時,就會失去所有存儲在 Memcached 當中的資料。
原始的 Redis 可以存儲資料在硬碟中以預防崩潰的情形發生,但是對AWS 來說,Redis 僅是應用程式與資料庫間的橋梁,不會有太多資料在上面久留,所以他們放棄原始的硬碟存儲方式,改用建立快照來恢復受損的系統。
-
資料的讀與寫: 存儲資料的方式看起來是 讀取 → 修改 → 寫入,在單一執行緒下看來沒什麼問題,但是當系統由多執行續來處理時,我們就需要思考資料的同步處理問題。當我們在遊戲中使用 Memcached 時,我們會需要將整列的資料讀取下來後才能修改並寫入。但若是同時有另一個改動在第一次改動時發生,系統會不知道該儲存哪一筆修改後的資料,這時候就需要另外寫程式去處理這個問題,像是樂觀鎖。當我們在遊戲中使用 Redis 時,我們只寫入需要修改的那部分寫入快取就可以了,不需要將整串資料都拿出來修改。像是 MULTI 或 WATCH 命令,這可以使用在遊戲中的硬幣、血量或魔力等等的設定。
Redis 也可以建立讀寫分離的副本,當你使用讀寫分離建立快取節點時,主節點會負責讀與寫,分離出來的副本可以當作備份,當你的快取出問題時則會自動晉升為主節點改負責讀與寫的工作。對於讀取繁重的高速快取工作負載,副本還可以輕鬆發揮出超過單個快取節點的容量限制。你可以將其使用在怪物資訊或其他任何可以被讀取但是不能被修改的資料中。
總結
這裡是個簡單的 Memcached 和 Redis 比較表:
Memcached | Redis | |
---|---|---|
主要的資料庫模型 | key-value 存儲 | Key-value 存儲 |
次要的資料庫模型 |
文件存儲 面向/基於圖的資料庫 搜尋引擎 時間序列資料庫 |
|
資料型態 | 簡單 | 複雜 |
劃分方法 | 沒有 | 分片 |
讀寫分離 | 沒有 |
主從式分離 讀寫分離 |
毫秒級的延遲時間 | 有 | 有 |
開發者簡單易用 | 有 | 有 |
進階數據結構 | 沒有 | 有 |
多執行續 | 有 | 沒有 |
快照 | 沒有 | 有 |
時至今日,我們可以根據不同的需求選擇要使用 Memcached 還是 Redis。Memcached 提供了簡單的使用方式,而Redis提供了豐富的功能,使其可用於各種用例。兩者都能在應用程式與資料庫間提供強大的快取功能,確認你的需求,選擇最適合你的快取功能。
附錄
-
Amazon ElastiCache : https://aws.amazon.com/elasticache/
-
Memcached : https://aws.amazon.com/Memcached/
-
Redis : https://aws.amazon.com/redis/
-
Choosing between Redis and Memcached : https://aws.amazon.com/tw/elasticache/redis-vs-memcached/
-
Comparing Memcached and Redis : https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/SelectEngine.html
-
System Properties Comparison Memcached vs. Redis : https://db-engines.com/en/system/Memcached%3BRedis
-
Memcached vs Redis, Which One to Pick? : https://www.linkedin.com/pulse/Memcached-vs-redis-which-one-pick-ranjeet-vimal
Tag:Cache, ElastiCache, Memcache, Redis