Redis Enterprise 不僅繼承了開源 Redis 的簡潔和高效,更進一步提升了其擴充套件性、可用性和安全性,使其成為企業級應用程式的理想選擇。透過無分享架構和自動重新分片,Redis Enterprise 實作了線性擴充套件,輕鬆應對高流量和大量資料。同時,多模型支援、高用性和資料持久化機制也確保了資料的完整性和業務的連續性。而 Redis 6 的 ACL、RESP3、使用者端快取和 I/O 執行緒等新功能,則進一步提升了 Redis 的安全性、效能和開發彈性,為開發者提供了更強大的工具和更優異的體驗。
Redis Enterprise 功能詳解
Redis Enterprise 是由開發開源 Redis 的團隊開發的強大記憶體資料函式庫平台。它在保持 Redis 簡潔性和高效能的同時,增加了許多企業級功能,如線性擴充套件至數億次操作每秒、具有本地延遲的 Active-Active 全球分佈、支援大資料集的 Redis on Flash(達到與磁碟型資料函式庫相當的基礎設施成本),以及根據內建永續性和單數字秒級容錯移轉的 99.999% 正常執行時間。
線性擴充套件能力
與其他叢集資料函式庫佈署一樣,監控和維護 Redis 開源叢集模式非常具有挑戰性。此外,由於 Redis 是單執行緒的,因此無法有效利用多核機器。Redis Enterprise 採用無分享叢集架構,能夠在擴充套件架構中無需承受非線性開銷,從而實作無限線性擴充套件。在單個叢集節點上佈署多個 Redis 例項,以充分利用多核架構。增強的連線管理、請求排程和高效能管道執行,實作跨所有資料型別和模型無與倫比的亞毫秒級效能。
Redis Enterprise 允許在執行時進行垂直擴充套件(分配更多基礎設施 RAM、CPU 或節點)和水平擴充套件(分配更多資料函式庫分片)。自動重新分片和重新平衡確保基礎設施資源的最佳利用,同時提供卓越的應用程式效能和高擴充套件性。
程式碼範例:Redis Enterprise 叢集組態
# Redis Enterprise 叢集組態範例
import redis
# 連線到 Redis Enterprise 叢集
def connect_to_cluster(host, port):
try:
client = redis.RedisCluster(host=host, port=port, decode_responses=True)
return client
except Exception as e:
print(f"連線失敗:{e}")
return None
# 組態叢集節點
def configure_cluster_nodes(client, nodes):
try:
# 新增節點到叢集
for node in nodes:
client.cluster_meet(node['host'], node['port'])
return True
except Exception as e:
print(f"組態節點失敗:{e}")
return False
# 主函式
if __name__ == "__main__":
host = 'localhost'
port = 6379
nodes = [{'host': 'node1', 'port': 6380}, {'host': 'node2', 'port': 6381}]
client = connect_to_cluster(host, port)
if client:
if configure_cluster_nodes(client, nodes):
print("叢集組態成功")
else:
print("叢集組態失敗")
else:
print("無法連線到叢集")
內容解密:
- 連線叢集:使用
redis.RedisCluster連線到 Redis Enterprise 叢集。 - 節點組態:透過
cluster_meet方法將新節點新增到叢集中。 - 錯誤處理:捕捉並處理連線和組態過程中的異常。
多模型資料函式庫支援
現代應用程式需要根據使用案例選擇專門的資料函式庫。然而,隨著資料儲存的增加,保持這些資料函式庫同步變得更加困難。此外,維護多個資料函式庫的成本非常高。Redis Enterprise 透過模組(如 RediSearch、RedisGraph、RedisJSON、RedisTimeSeries 和 RedisAI)擴充套件了 Redis 的功能,以支援任何資料建模方法,並允許跨模組和核心執行操作。
程式碼範例:使用 RedisJSON 儲存 JSON 資料
# 使用 RedisJSON 儲存 JSON 資料範例
import redis
import json
# 連線到 Redis
def connect_to_redis(host, port):
try:
client = redis.Redis(host=host, port=port, decode_responses=True)
return client
except Exception as e:
print(f"連線失敗:{e}")
return None
# 儲存 JSON 資料
def store_json_data(client, key, data):
try:
client.json().set(key, '$', data)
return True
except Exception as e:
print(f"儲存 JSON 資料失敗:{e}")
return False
# 主函式
if __name__ == "__main__":
host = 'localhost'
port = 6379
key = 'user:1'
data = {'name': 'John', 'age': 30}
client = connect_to_redis(host, port)
if client:
if store_json_data(client, key, data):
print("JSON 資料儲存成功")
else:
print("JSON 資料儲存失敗")
else:
print("無法連線到 Redis")
內容解密:
- 連線 Redis:使用
redis.Redis連線到 Redis。 - 儲存 JSON:使用
client.json().set方法將 JSON 資料儲存在 Redis 中。 - 錯誤處理:捕捉並處理連線和儲存過程中的異常。
高用性
Redis Enterprise 提供不間斷的高用性和對使用者的透明度,包括無磁碟複製、即時故障檢測和跨機架、區域和地理位置的單數字秒級容錯移轉。它在叢集變更操作(如新增新節點到叢集、升級軟體和重新平衡及重新分片資料)期間仍能提供高吞吐量和低延遲。
程式碼範例:組態 Redis Enterprise 高用性
# 組態 Redis Enterprise 高用性範例
import redis
# 組態高用性
def configure_high_availability(client, database_id):
try:
# 啟用高用性
client.execute_command('CONFIG SET', 'ha-enabled', 'true')
# 組態容錯移轉策略
client.execute_command('CONFIG SET', 'failover-policy', 'always')
return True
except Exception as e:
print(f"組態高用性失敗:{e}")
return False
# 主函式
if __name__ == "__main__":
host = 'localhost'
port = 6379
client = redis.Redis(host=host, port=port, decode_responses=True)
database_id = 'my_database'
if configure_high_availability(client, database_id):
print("高用性組態成功")
else:
print("高用性組態失敗")
內容解密:
- 啟用高用性:使用
CONFIG SET命令啟用高用性。 - 組態容錯移轉策略:設定容錯移轉策略為
always以確保高用性。 - 錯誤處理:捕捉並處理組態過程中的異常。
資料持久化
Redis Enterprise 是一個完全持久化的資料函式庫。它支援完全自動化的資料持久化機制,在沒有 DRAM 中資料集副本的情況下,Redis Enterprise 將在連線到故障節點的網路附加裝置中找到資料集的最新副本,並用它來填充新雲例項上的 Redis 分片。
程式碼範例:組態 Redis 資料持久化
# 組態 Redis 資料持久化範例
import redis
# 組態資料持久化
def configure_persistence(client, database_id):
try:
# 啟用 AOF 持久化
client.execute_command('CONFIG SET', 'appendonly', 'yes')
# 組態 AOF 同步策略
client.execute_command('CONFIG SET', 'appendfsync', 'everysec')
return True
except Exception as e:
print(f"組態資料持久化失敗:{e}")
return False
# 主函式
if __name__ == "__main__":
host = 'localhost'
port = 6379
client = redis.Redis(host=host, port=port, decode_responses=True)
database_id = 'my_database'
if configure_persistence(client, database_id):
print("資料持久化組態成功")
else:
print("資料持久化組態失敗")
內容解密:
- 啟用 AOF 持久化:使用
CONFIG SET命令啟用 AOF(Append Only File)持久化。 - 組態 AOF 同步策略:設定 AOF 同步策略為
everysec以平衡效能和持久化需求。 - 錯誤處理:捕捉並處理組態過程中的異常。
自動備份與還原
除了資料持久化功能外,Redis Enterprise 提供開箱即用的備份和還原服務。可以透過排程備份和執行時備份(使用 REST API 或 Web 控制檯)來組態 Redis Enterprise 資料函式庫備份。備份可以組態到主要公有雲端儲存解決方案(Amazon S3、Azure Blob Storage 或 Google Cloud Storage)以及 FTP 或 Swift 服務。
多租戶支援
Redis Enterprise 是多租戶軟體,其中單一佈署的 Redis Enterprise 軟體(通常佈署為節點叢集)可服務數百個租戶。每個租戶都有自己的 Redis 資料函式庫端點,該端點與其他 Redis 資料函式庫完全隔離。每個在此叢集中託管的資料函式庫都有獨立的屬性,如端點、記憶體分配、埠、密碼、分片數量、警示等。
地理分散式資料函式庫複製
Redis Enterprise 支援多種複製技術,包括:
- Active-Passive:被動伺服器是冷備份,用於高用性、手動災難還原和資料永續性。
- Active-Read-replica:讀取副本以唯讀模式提供,用於分散式快取。
- Active-Active:所有資料函式庫例項都可用於讀取和寫入操作,用於實作地理分散式應用的本地延遲、自動災難還原、負載分配、資料整合等。
Redis 6 新功能解析
Redis 6 是 Redis 的一個重要版本,於 2020 年正式發布。這個版本引入了許多新功能和改進,包括 ACLs、RESP3、使用者端快取、I/O 執行緒等。
存取控制列表(ACLs)
Redis 6 引入了存取控制列表(ACLs),允許管理員對不同使用者設定不同的許可權,從而提高 Redis 的安全性。ACLs 可以限制使用者對特定命令的存取,例如禁止某些使用者執行 FLUSHALL 或 CONFIG 命令。
ACLs 的實作是根據使用者名稱和密碼的驗證機制。管理員可以為每個使用者設定不同的密碼和許可權,並將這些設定儲存在 Redis 的組態檔案中。
### ACLs 設定範例
ACL SETUSER myuser on >mypassword +@all -@dangerous
在這個範例中,我們建立了一個名為 myuser 的使用者,並設定其密碼為 mypassword。+@all 表示該使用者可以執行所有命令,而 -@dangerous 表示該使用者不能執行危險命令。
內容解密:
ACL SETUSER:用於設定或修改使用者的 ACL 規則。myuser:要設定的使用者名稱。on:啟用該使用者。>mypassword:設定使用者的密碼。+@all:允許使用者執行所有命令。-@dangerous:禁止使用者執行危險命令。
RESP3 通訊協定
Redis 6 引入了新的通訊協定 RESP3,提供了更好的效能和更多的功能。RESP3 支援更多資料型別,例如布林值和數值,並且可以更好地處理錯誤。
RESP3 的主要改進包括:
- 支援更多資料型別
- 更好的錯誤處理
- 更高效的資料傳輸
### RESP3 範例
*3
$3
SET
$4
mykey
$5
myvalue
在這個範例中,我們使用 RESP3 通訊協定執行了一個 SET 命令,將 mykey 的值設為 myvalue。
內容解密:
*3:表示該命令有 3 個引數。$3、$4、$5:表示後續引數的長度。SET、mykey、myvalue:分別代表命令和其引數。
使用者端快取
Redis 6 引入了使用者端快取功能,允許使用者端在本地快取 Redis 的資料,從而減少對 Redis 的請求次數,提高效能。
使用者端快取可以透過 Redis 的 CLIENT TRACKING 命令來啟用或停用。
### 使用者端快取範例
CLIENT TRACKING ON
在這個範例中,我們啟用了使用者端快取功能。
內容解密:
CLIENT TRACKING:用於控制使用者端快取的命令。ON:啟用使用者端快取。
I/O 執行緒
Redis 6 引入了 I/O 執行緒,允許 Redis 使用多個執行緒來處理 I/O 操作,從而提高效能。
I/O 執行緒可以透過 Redis 的組態檔案來設定。
### I/O 執行緒設定範例
io-threads 4
在這個範例中,我們將 I/O 執行緒的數量設為 4。
內容解密:
io-threads:用於設定 I/O 執行緒數量的組態選項。4:表示啟用 4 個 I/O 執行緒。
Redis 6 的未來發展
Redis 6 的發布標誌著 Redis 的一個新時代。未來,Redis 將繼續發展和改進,提供更多的功能和更好的效能。
Redis 的開發團隊將繼續致力於提高 Redis 的效能、安全性和可用性,並且會根據使用者的需求和反饋,不斷改進和最佳化 Redis。
附錄
Redis 6 新功能列表
- ACLs
- RESP3
- 使用者端快取
- I/O 執行緒
- Diskless replication on replicas
- Redis-benchmark cluster support + Redis-cli improvements
- Systemd support rewrite
- Redis Cluster proxy
- Disque module
Redis 6 相關資源
本篇文章探討了 Redis 6 的新功能,包括 ACLs、RESP3、使用者端快取和 I/O 執行緒等,並且提供了詳細的範例和說明。希望本篇文章能夠幫助讀者更好地理解和使用 Redis 6。
Redis 存取控制列表(ACL)與 RESP3 協定詳解
Redis 的存取控制列表(ACL)功能為資料函式庫的安全性與存取管理提供了強大的支援。ACL 允許管理者針對不同使用者設定細緻的許可權控制,從而提升資料的安全性與系統的整體管理效率。此外,Redis Serialization Protocol(RESP)及其最新版本 RESP3 在客戶端與伺服器之間的通訊中扮演著關鍵角色。本文將探討 ACL 的使用方法及其重要性,並分析 RESP3 協定的改進與優勢。
ACL 的優勢與應用
ACL 的引入使得 Redis 資料函式庫能夠實作使用者層級的存取控制,允許管理者為不同使用者設定不同的操作許可權,從而有效控制使用者對資料的操作範圍。ACL 的主要優勢包括:
- 簡化存取控制:ACL 允許管理者為每個使用者設定特定的命令、鍵值或鍵值模式的存取許可權,極大地簡化了存取控制的管理。
- 限制危險命令:可以輕鬆停用如
FLUSHALL、DEL等危險命令,降低資料意外丟失的風險。 - 監控與除錯:ACL LOG 命令允許管理者檢視違反 ACL 設定的客戶端操作,幫助及時發現並解決潛在的安全問題。
ACL 指令詳解
以下是一些常用的 ACL 指令及其功能:
-
ACL LIST:列出目前生效的 ACL 設定。>> ACL LIST 1) "user default on ~* +@all"上述輸出表示預設使用者對所有鍵值具有所有命令的存取許可權。
-
ACL SETUSER:設定新使用者或修改現有使用者的許可權。>> ACL SETUSER admin on >redispass ~* +@admin OK該指令建立了一個名為
admin的使用者,設定密碼為redispass,並允許其存取所有鍵值及執行admin分類別下的命令。 -
ACL GETUSER:檢視特定使用者的許可權設定。>> ACL GETUSER default 1) "flags" 2) 1) "on" 2) "allcommands" 3) "allkeys" ...該指令顯示了預設使用者的詳細許可權設定。
實際操作範例
假設我們需要建立一個名為 suyog 的使用者,該使用者僅能存取以 user: 開頭的鍵值,並且只能執行 GET 命令讀取這些鍵值,而不能進行寫入操作。操作步驟如下:
-
建立使用者
suyog並設定許可權:>> ACL SETUSER suyog on >suyogpass ~user:* +get OK -
驗證使用者許可權:
>> AUTH suyog suyogpass OK >> GET product:145 (error) NOPERM this user has no permissions to access one of the keys used as arguments >> GET user:34 (nil) >> SET user:34 profile-data (error) NOPERM this user has no permissions to run the 'set' command or its subcommand從上述輸出可以看出,使用者
suyog無法存取非user:開頭的鍵值,也無法執行SET命令寫入資料。
RESP3 協定改進與優勢
Redis Serialization Protocol(RESP)是 Redis 客戶端與伺服器之間通訊的基礎協定。隨著 Redis 的發展,RESP3 作為其最新版本,引入了多項改進以提升協定的語義能力與效能。
RESP3 的主要改進
-
增強語義能力:RESP3 提升了客戶端對資料型別的理解能力。例如,對於
LRANGE、SMEMBERS和HGETALL等命令的回應,RESP3 能夠更準確地傳達資料的型別資訊(陣列、集合、對映等),從而簡化客戶端的處理邏輯。 -
改進資料傳輸效率:RESP3 在資料傳輸的效率上進行了最佳化,支援更高效的資料解析與傳輸機制。
-
向後相容性:儘管 RESP3 引入了新的功能與改進,但它仍然保持了與舊版 RESP 的相容性,確保現有的客戶端與應用程式能夠平滑升級。
RESP3 的應用前景
隨著 Redis 的不斷發展,RESP3 將在以下方面發揮重要作用:
-
提升客戶端函式庫的開發效率:透過提供更豐富的語義資訊,RESP3 能夠簡化客戶端函式庫的實作,提升開發效率。
-
增強系統的整體效能:RESP3 的最佳化將有助於提升 Redis 系統的整體效能,特別是在大規模資料處理與高併發場景下。
-
促進 Redis 生態系統的發展:RESP3 的改進將進一步鞏固 Redis 在資料函式庫與快取領域的領先地位,促進其生態系統的繁榮。