RedisStack部署/持久化/安全/與C#專案整合

程式設計實驗室發表於2023-10-07

前言

Redis可好用了,速度快,支援的資料型別又多,最主要的是現在可以用來向量搜尋了。

本文記錄一下官方提供的 redis-stack 部署和配置過程。

關於 redis-stack

redis-stack installs a Redis server with additional database capabilities and the RedisInsight.

redis 提供了倆映象

  • redis/redis-stack contains both Redis Stack server and RedisInsight. This container is best for local development because you can use RedisInsight to visualize your data.
  • redis/redis-stack-server provides Redis Stack but excludes RedisInsight. This container is best for production deployment.

區別就是有沒有附帶 RedisInsight 這個Web管理介面。

我需要使用Web管理介面,所以本文選擇的是 redis-stack 這個映象。

部署

老規矩,使用 docker-compose 部署。

把 Redis 的 6379 埠和 RedisInsight 的 8001 埠對映出來。

version: '3.4'

services:
  redis:
    image: redis/redis-stack:latest
    container_name: redis-stack
    restart: always
    ports:
      - "6379:6379"
      - "8001:8001"
    volumes:
      - ./data:/data

networks:
  default:
    name: redis-stack

推薦使用 Portainer 來部署和管理映象。

這裡的持久化是透過對映 dump.rdb 檔案。

安全與ACL命令

在Redis6.0之前的版本中,登陸Redis Server只需要輸入密碼(前提配置了密碼 requirepass )即可,不需要輸入使用者名稱,而且密碼也是明文配置到配置檔案中,安全性不高。並且應用連線也使用該密碼,導致應用有所有許可權處理資料,風險也比較高。

在Redis6.0有了ACL之後,終於解決了這些不安全的因素,可以按照不同的需求設定相關的使用者和許可權。

Redis ACL 是向後相容的,即預設情況下使用者為default,使用的是requirepass配置的密碼。要是不使用ACL功能,對舊版客戶端來說完全一樣。

在 RedisInsight 中的 Workbench 介面可以很方便的執行 Redis 命令,而且左邊還有命令教程,太酷了!

幾個ACL命令

ACL的命令很簡單,而且在 RedisInsight 裡還可以補全,這裡簡單介紹幾個:

  • acl help - 幫助
  • acl list - 列出所有使用者
  • acl whoami - 檢視當前使用者
  • acl setuser - 設定使用者,包括我們需要的設定密碼也是用這個命令

設定密碼

假設要把 default 使用者的密碼設定為 abc123

ACL SETUSER default on >abc123 sanitize-payload ~* &* +@all

如果不想要密碼了,可以用以下命令清除

ACL SETUSER default  on nopass sanitize-payload ~* &* +@all

在程式中連線

以 C# 為例

首先安裝官方提供的 nuget 包

dotnet add package NRedisStack

demo 程式碼

using NRedisStack.RedisStackCommands;
using StackExchange.Redis;

var redis = await ConnectionMultiplexer.ConnectAsync("localhost", options => {
    options.User = "default";
    options.Password = "abc123";
});
var db = redis.GetDatabase();

var json = db.JSON();

// 寫入
json.Set("ext:1", "$", new { Age = 35, Name = "Alice" });

// 讀取
Console.WriteLine($"讀取:{json.Get(key: "ext:1", path: "$", indent: "\t", newLine: "\n")}");

參考資料

相關文章