建議您將 Memorystore for Memcached 工作負載遷移至 Memorystore for Valkey。Memorystore for Memcached 是鍵/值資料儲存庫,但 Memorystore for Valkey 是功能更豐富的資料結構伺服器。
Memorystore for Valkey 提供與 Memorystore for Memcached 類似的功能。此外,Memorystore for Valkey 還具備下列優點:
- 這項服務提供全代管的高效能記憶體內資料儲存服務,適用於與 Redis 相容的開放原始碼專案 Valkey。
- 這項全代管的 Valkey 服務 Google Cloud支援「已啟用叢集模式」和「已停用叢集模式」的執行個體。
- 透過運用高擴充性、高可用性和安全的 Valkey 服務,您無須費心管理複雜的 Valkey 部署作業,即可讓 Google Cloud 上執行的應用程式得以發揮最佳效能。 Google Cloud
Memorystore for Valkey 功能
遷移至 Memorystore for Valkey 後,您就能使用 Memorystore for Memcached 沒有的功能。這些功能可提升應用程式開發、穩定性和效能。
下表列出並說明 Memorystore for Valkey 提供的功能,以及使用這些功能的優點。
| 功能 | 說明 | 優點 |
|---|---|---|
| 多個資料庫 | Memorystore for Memcached 是單一的扁平鍵空間。不過,根據預設,Memorystore for Valkey 的「已停用叢集模式」模式最多支援 16 個執行個體資料庫。您可以設定環境,讓每個執行個體最多可有 100 個資料庫。 | 為執行個體建立多個資料庫可避免單點故障,而且您能備份或還原單一資料庫,不會影響其他資料庫的可用性或一致性,還能更有效率地擴充或遷移資料庫。 |
| 豐富的資料結構 | 除了字串,Memorystore for Valkey 也支援清單、集合、排序集合、雜湊和點陣圖。Memorystore for Valkey 也支援 Bloom 篩選器、向量搜尋和 JSON。 | 您可以將 Memorystore for Valkey 用於複雜的用途,例如排行榜、工作佇列和物件快取,不必進行應用程式序列化。您也可以使用向量搜尋,以毫秒以下的延遲時間執行語意查詢。 |
| 交易 | 您可以使用 MULTI 和 EXEC 指令,以不可分割的單一單元,以原子方式執行一組指令。 |
雖然您可以使用 Memorystore for Memcached 的比較並交換 (CAS) 功能,在鍵層級進行樂觀鎖定,但 Memorystore for Valkey 可讓您以原子方式執行一組指令。 |
| Pub/Sub 訊息傳遞 | 將 Pub/Sub 與 Memorystore for Valkey 搭配使用,用戶端應用程式就能訂閱管道並接收即時訊息。 | 透過 Memorystore for Valkey,您可以將快取轉換為輕量型訊息代理程式,用於即時更新和服務間通訊。 |
| Lua 指令碼 | 您可以使用 Lua,透過 EVAL 指令在伺服器上以原子方式執行複雜的應用程式邏輯。 |
使用伺服器端指令碼可減少網路往返次數,並確保 Memorystore for Valkey 能順暢執行複雜作業。這有助於提升應用程式效能。 |
| 支援高可用性、複製和分片 | Memorystore for Valkey 的架構支援並提供高可用性 (HA)。用戶端應用程式可連線至個別端點 (或分片),直接存取 Memorystore for Valkey 節點。 | 高可用性和複製功能可提升系統的可靠性,並在重大更新期間盡量減少中斷。使用分片有助於有效分配與用戶端應用程式相關聯的高流量負載。 |
| 持續性 | Memorystore for Valkey 支援下列類型的持久性:
|
使用 AOF 和 RDB 持久性,即可將重要資料持久儲存在 Memorystore for Valkey。你隨時可以復原資料。Memorystore for Valkey 會處理基礎的持續性機制,因此使用持續性功能時,幾乎不需要任何準備工作。 |
遷移工作負載
如要將 Memorystore for Memcached 工作負載遷移至 Memorystore for Valkey,請完成下列動作:
- 修改用戶端程式庫:將應用程式的用戶端程式庫從 Memcached 程式庫變更為 Valkey 程式庫。
- 修改指令:將用戶端應用程式的所有 Memcached API 指令,替換為對應的 Valkey API 指令。
- 部署及驗證遷移作業:設定遷移作業,並確認您可以使用該作業將工作負載遷移至 Memorystore for Valkey。
修改用戶端程式庫
在本節中,您要將應用程式的用戶端程式庫從 Memcached 程式庫變更為 Valkey 程式庫。
下表列出適用於 Python、Java、Go 和 Node.js 的 Memcached 用戶端程式庫範例,以及對應的 Valkey 程式庫。
| 語言 | Memcached 用戶端程式庫 | Valkey 用戶端程式庫 |
|---|---|---|
| Python | python-memcached, pymemcache | valkey-py |
| Java | spymemcached | Valkey GLIDE, valkey-java |
| Go | gomemcache | Valkey GLIDE、 valkey-go |
| Node.js | memjs | Valkey GLIDE、 ioredis |
修改指令
在本節中,您要將用戶端應用程式的 Memcached API 所有指令,替換成 Valkey API 的對應指令。
如要修改指令,請完成下列動作:
修改連結設定
在本節中,您會將用戶端應用程式的連線從 Memcached 伺服器變更為 Valkey 伺服器。
找出用於將用戶端應用程式連線至 Memcached 伺服器的程式碼。這可能類似於下列程式碼:
import memcache; mc = memcache.Client(['MEMCACHED_IP_ADDRESS:11211'])
將 MEMCACHED_IP_ADDRESS 替換為 Memorystore for Memcached 執行個體的 IP 位址。
修改這段程式碼,讓用戶端應用程式可以連線至 Valkey 伺服器。這可能類似於下列程式碼:
import valkey; v = valkey.Valkey(host=VALKEY_IP_ADDRESS, port=6379, db=0)
將 VALKEY_IP_ADDRESS 替換為您在部署及驗證遷移作業時建立的 Memorystore for Valkey 執行個體 IP 位址。
修改指令
在本節中,您會將用戶端應用程式的所有 Memcached API 指令,替換成對應的 Valkey API 指令。
DECR
DECR 指令可讓您從鍵儲存的值中減去指定量。
找出您在 Memcached 中用於
DECR指令的程式碼。這可能類似於下列程式碼:mc.DECR('KEY_NAME', AMOUNT)請將下列項目改為對應的值:
- KEY_NAME:金鑰名稱。
- AMOUNT:要遞減儲存在鍵中的數字值。這個值必須為整數。
修改這段程式碼,即可搭配 Valkey 使用。修改後的程式碼可能如下所示:
v.DECR('KEY_NAME', AMOUNT)
刪除
DELETE 指令可讓您移除金鑰。例如刪除使用者。
找出您在 Memcached 中用於
DELETE指令的程式碼。這可能類似於下列程式碼:mc.DELETE('USERNAME')將 USERNAME 替換為要刪除的使用者名稱。
修改這段程式碼,即可搭配 Valkey 使用。修改後的程式碼可能如下所示:
v.DELETE('USERNAME')
GET
GET 指令可讓您擷取與鍵相關聯的值。舉例來說,您可以取得使用者的相關資訊。
找出您在 Memcached 中用於
GET指令的程式碼。這可能類似於下列程式碼:data = mc.GET('USERNAME')將 USERNAME 替換為要取得資訊的使用者名稱。
修改這段程式碼,即可搭配 Valkey 使用。修改後的程式碼可能如下所示:
data = v.GET('USERNAME')
INCR
INCR 指令可讓您將儲存在鍵中的值遞增某個量。
找出您在 Memcached 中用於
INCR指令的程式碼。這可能類似於下列程式碼:mc.INCR('KEY_NAME', AMOUNT)請將下列項目改為對應的值:
- KEY_NAME:金鑰名稱。
- AMOUNT:您要遞增儲存在鍵中的數字值。這個值必須為整數。
修改這段程式碼,即可搭配 Valkey 使用。修改後的程式碼可能如下所示:
v.INCR('KEY_NAME', AMOUNT)
MGET
MGET 指令可讓您在單一指令中擷取多個鍵的值。使用 MGET 可提升環境效能。
找出您在 Memcached 中用於
MGET指令的程式碼。這可能類似於下列程式碼:data_map = mc.get_multi(['KEY_NAME_1', 'KEY_NAME_2'])
將 KEY_NAME_1 和 KEY_NAME_2 替換為要擷取資訊的金鑰名稱。
修改這段程式碼,即可搭配 Valkey 使用。修改後的程式碼可能如下所示:
data_list = v.MGET(['KEY_NAME_1', 'KEY_NAME_2'])
SET
SET 指令可讓您指定鍵的值。舉例來說,您可以為存取系統的使用者設定到期時間 (以秒為單位)。
找出您在 Memcached 中用於
SET指令的程式碼。這可能類似於下列程式碼:mc.SET('USERNAME', 'data', time=EXPIRATION_TIME)請將下列項目改為對應的值:
- USERNAME:存取系統的使用者名稱
- EXPIRATION_TIME:使用者無法再存取系統前的秒數
修改這段程式碼,即可搭配 Valkey 使用。修改後的程式碼可能如下所示:
v.SET('USERNAME', 'data', ex=EXPIRATION_TIME)
部署及驗證遷移作業
在本節中,您將設定遷移作業,並確認可以使用這項作業將工作負載遷移至 Memorystore for Valkey。
如要部署及驗證遷移作業,請完成下列步驟:
- 建立 Memorystore for Valkey 執行個體:請確保建立的執行個體大小與 Memorystore for Memcached 執行個體大小相近。此外,您也可以使用 Cloud Monitoring 監控 Memorystore for Valkey 執行個體的用量。
- 同時寫入兩個執行個體:如要進行零停機時間遷移,請修改應用程式,同時寫入兩個執行個體。這會填入 Valkey 快取,並讓您評估重要監控指標。
- 停止傳送至 Memorystore for Memcached 執行個體的流量:變更應用程式的設定,讓讀取作業指向 Memorystore for Valkey 執行個體的 IP 位址和通訊埠號碼 (6379)。
- 監控應用程式:監控應用程式的錯誤率和延遲時間。
- 刪除 Memorystore for Memcached 執行個體:停止寫入 Memorystore for Memcached 執行個體,然後刪除執行個體。
常見問題
本節包含常見問題,說明如何將 Memorystore for Memcached 工作負載遷移至 Memorystore for Valkey。
為什麼要遷移至 Memorystore for Valkey?
Valkey 是高效能的開放原始碼專案,由 Redis 程式碼庫分支而來。Memorystore for Valkey 提供的代管服務與 Redis 通訊協定相容。確保所有現有的 Redis 用戶端程式庫和指令都能順暢運作。遷移至 Memorystore for Valkey 在功能上等同於遷移至與 Redis 相容的標準伺服器。
是否需要重新設定網路防火牆規則?
Memorystore for Memcached 執行個體通常使用通訊埠 11211,而 Memorystore for Valkey 執行個體則使用通訊埠 6379。請務必確認虛擬私有雲 (VPC) 防火牆規則允許應用程式的輸出流量,透過正確的通訊埠連線至 Memorystore for Valkey 執行個體。
Valkey 如何處理複雜物件的序列化作業?
由於 Memcached 不瞭解複雜物件的結構 (例如 Python 物件或 Java 物件),因此會將所有物件視為不透明的 Blob。
因此,在任何資料傳送至網路前,序列化作業完全會在用戶端應用程式端進行。伺服器只會看到位元組陣列。舉例來說,如要讀取單一屬性 (例如使用者的電子郵件地址),您必須擷取整個序列化物件,在應用程式中取消序列化,然後讀取與該屬性相關聯的欄位。
Valkey 可以儲存 Blob,並瞭解複雜物件的結構。您也可以使用 Valkey 將物件的欄位擴展至 Valkey 雜湊表。您可以使用這個表格直接擷取深層巢狀值。
以下範例使用 Valkey 雜湊表擷取使用者的電子郵件地址:
# valkey-py
client.hset("user:101", mapping={
"name": "username",
"email": "username@example.com",
"login_count": 10
})
client.hget("user:101", "email") # -> b"username@example.com"
Memcached 和 Valkey 的通訊協定有何不同?
Memcached 使用 ASCII 通訊協定和選用的二進位通訊協定。Valkey 使用 Redis 序列化通訊協定 (RESP)。
雖然這是不同的通訊協定,但新版 Valkey 用戶端應用程式庫會自動處理 RESP 通訊協定。這會讓應用程式程式碼清楚瞭解通訊協定之間的差異。
遷移至 Memorystore for Valkey 後,如何對應 flags 欄位?
Memorystore for Memcached 支援 flags 欄位。這個欄位包含 32 位元不帶正負號的整數,用戶端應用程式程式庫會使用這個整數儲存有關儲存值的元資料。
Memorystore for Valkey 不支援這個欄位。如要將 flags 欄位對應至 Memorystore for Valkey,請完成下列步驟:
- 將旗標序列化為字串物件的鍵名。
- 將旗標序列化為字串物件的值。
- 使用雜湊物件,並為旗標指定欄位。
Memorystore for Valkey 的效能是否較佳?
在大多數情況下,Memorystore for Valkey 的效能較佳。這是因為 Valkey 採用進階資料結構、持續連線、管道支援,以及多鍵作業的效率提升。不過,您必須正確修改用戶端程式庫和指令。
如果 Memorystore for Memcached 執行個體使用多個節點,在 Memorystore for Valkey 中該怎麼做?
部署及驗證遷移作業後,請在 Memorystore for Valkey 中建立已啟用叢集模式的執行個體。這些執行個體會在內部處理分片和高可用性,並以單一端點的形式顯示在應用程式中。這可簡化應用程式的用戶端邏輯。
如果 Memorystore for Memcached 執行個體使用多個節點,建議您為 Memorystore for Valkey 執行個體採用哪種節點類型?
如要判斷每個 Memorystore for Memcached 執行個體的節點大小,請檢查與「每個節點的記憶體容量」屬性相關聯的值。接著,請使用下表判斷對應 Memorystore for Valkey 執行個體的節點類型:
| Memorystore for Memcached 節點大小 | Memorystore for Valkey 節點類型 | 節點總容量 | vCPU 數量 |
|---|---|---|---|
| < 1 GB | shared-core-nano | 1.4 GB | 0.5 (共用) |
| 1 GB 至 5 GB | standard-small | 6.5 GB | 2 |
| 6 GB 至 12 GB | highmem-medium | 13.0 GB | 2 |
| 13 GB 至 50 GB | highmem-xlarge | 58.0 GB | 8 |
shared-core-nano 節點類型適用於小型工作負載。這個節點類型提供的效能不一,且沒有服務水準協議,因此不適合用於實際工作負載。
為 Memorystore for Valkey 執行個體選取的虛擬 CPU (vCPU) 越多,效能就越好。如果執行個體執行耗用大量資源的工作負載,請選取 vCPU 較高的節點類型 (例如 highmem-xlarge)。如果執行個體執行的工作負載較不耗用資源,請選取 vCPU 較低的節點類型 (例如 highmem-medium)。