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("無法連線到叢集")

內容解密:

  1. 連線叢集:使用 redis.RedisCluster 連線到 Redis Enterprise 叢集。
  2. 節點組態:透過 cluster_meet 方法將新節點新增到叢集中。
  3. 錯誤處理:捕捉並處理連線和組態過程中的異常。

多模型資料函式庫支援

現代應用程式需要根據使用案例選擇專門的資料函式庫。然而,隨著資料儲存的增加,保持這些資料函式庫同步變得更加困難。此外,維護多個資料函式庫的成本非常高。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")

內容解密:

  1. 連線 Redis:使用 redis.Redis 連線到 Redis。
  2. 儲存 JSON:使用 client.json().set 方法將 JSON 資料儲存在 Redis 中。
  3. 錯誤處理:捕捉並處理連線和儲存過程中的異常。

高用性

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("高用性組態失敗")

內容解密:

  1. 啟用高用性:使用 CONFIG SET 命令啟用高用性。
  2. 組態容錯移轉策略:設定容錯移轉策略為 always 以確保高用性。
  3. 錯誤處理:捕捉並處理組態過程中的異常。

資料持久化

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("資料持久化組態失敗")

內容解密:

  1. 啟用 AOF 持久化:使用 CONFIG SET 命令啟用 AOF(Append Only File)持久化。
  2. 組態 AOF 同步策略:設定 AOF 同步策略為 everysec 以平衡效能和持久化需求。
  3. 錯誤處理:捕捉並處理組態過程中的異常。

自動備份與還原

除了資料持久化功能外,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 可以限制使用者對特定命令的存取,例如禁止某些使用者執行 FLUSHALLCONFIG 命令。

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:表示後續引數的長度。
  • SETmykeymyvalue:分別代表命令和其引數。

使用者端快取

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 的主要優勢包括:

  1. 簡化存取控制:ACL 允許管理者為每個使用者設定特定的命令、鍵值或鍵值模式的存取許可權,極大地簡化了存取控制的管理。
  2. 限制危險命令:可以輕鬆停用如 FLUSHALLDEL 等危險命令,降低資料意外丟失的風險。
  3. 監控與除錯:ACL LOG 命令允許管理者檢視違反 ACL 設定的客戶端操作,幫助及時發現並解決潛在的安全問題。

ACL 指令詳解

以下是一些常用的 ACL 指令及其功能:

  1. ACL LIST:列出目前生效的 ACL 設定。

    >> ACL LIST
    1) "user default on ~* +@all"
    

    上述輸出表示預設使用者對所有鍵值具有所有命令的存取許可權。

  2. ACL SETUSER:設定新使用者或修改現有使用者的許可權。

    >> ACL SETUSER admin on >redispass ~* +@admin
    OK
    

    該指令建立了一個名為 admin 的使用者,設定密碼為 redispass,並允許其存取所有鍵值及執行 admin 分類別下的命令。

  3. ACL GETUSER:檢視特定使用者的許可權設定。

    >> ACL GETUSER default
    1) "flags"
    2) 1) "on"
       2) "allcommands"
       3) "allkeys"
    ...
    

    該指令顯示了預設使用者的詳細許可權設定。

實際操作範例

假設我們需要建立一個名為 suyog 的使用者,該使用者僅能存取以 user: 開頭的鍵值,並且只能執行 GET 命令讀取這些鍵值,而不能進行寫入操作。操作步驟如下:

  1. 建立使用者 suyog 並設定許可權

    >> ACL SETUSER suyog on >suyogpass ~user:* +get
    OK
    
  2. 驗證使用者許可權

    >> 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 的主要改進

  1. 增強語義能力:RESP3 提升了客戶端對資料型別的理解能力。例如,對於 LRANGESMEMBERSHGETALL 等命令的回應,RESP3 能夠更準確地傳達資料的型別資訊(陣列、集合、對映等),從而簡化客戶端的處理邏輯。

  2. 改進資料傳輸效率:RESP3 在資料傳輸的效率上進行了最佳化,支援更高效的資料解析與傳輸機制。

  3. 向後相容性:儘管 RESP3 引入了新的功能與改進,但它仍然保持了與舊版 RESP 的相容性,確保現有的客戶端與應用程式能夠平滑升級。

RESP3 的應用前景

隨著 Redis 的不斷發展,RESP3 將在以下方面發揮重要作用:

  1. 提升客戶端函式庫的開發效率:透過提供更豐富的語義資訊,RESP3 能夠簡化客戶端函式庫的實作,提升開發效率。

  2. 增強系統的整體效能:RESP3 的最佳化將有助於提升 Redis 系統的整體效能,特別是在大規模資料處理與高併發場景下。

  3. 促進 Redis 生態系統的發展:RESP3 的改進將進一步鞏固 Redis 在資料函式庫與快取領域的領先地位,促進其生態系統的繁榮。