RedisStack部署/持久化/安全/與C#項(xiàng)目集成
1前言
Redis可好用了,速度快,支持的數(shù)據(jù)類型又多,最主要的是現(xiàn)在可以用來(lái)向量搜索了。
本文記錄一下官方提供的 redis-stack 部署和配置過(guò)程。
2關(guān)于 redis-stack
redis-stack installs a Redis server with additional database capabilities and the RedisInsight.
redis 提供了倆鏡像
-
redis/redis-stackcontains 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-serverprovides Redis Stack but excludes RedisInsight. This container is best for production deployment.
區(qū)別就是有沒(méi)有附帶 RedisInsight 這個(gè)Web管理界面。
我需要使用Web管理界面,所以本文選擇的是 redis-stack 這個(gè)鏡像。
3部署
老規(guī)矩,使用 docker-compose 部署。
把 Redis 的 6379 端口和 RedisInsight 的 8001 端口映射出來(lái)。
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 來(lái)部署和管理鏡像。
這里的持久化是通過(guò)映射 dump.rdb 文件。
4安全與ACL命令
在Redis6.0之前的版本中,登陸Redis Server只需要輸入密碼(前提配置了密碼 requirepass )即可,不需要輸入用戶名,而且密碼也是明文配置到配置文件中,安全性不高。并且應(yīng)用連接也使用該密碼,導(dǎo)致應(yīng)用有所有權(quán)限處理數(shù)據(jù),風(fēng)險(xiǎn)也比較高。
在Redis6.0有了ACL之后,終于解決了這些不安全的因素,可以按照不同的需求設(shè)置相關(guān)的用戶和權(quán)限。
Redis ACL 是向后兼容的,即默認(rèn)情況下用戶為default,使用的是requirepass配置的密碼。要是不使用ACL功能,對(duì)舊版客戶端來(lái)說(shuō)完全一樣。
在 RedisInsight 中的 Workbench 界面可以很方便的執(zhí)行 Redis 命令,而且左邊還有命令教程,太酷了!
幾個(gè)ACL命令
ACL的命令很簡(jiǎn)單,而且在 RedisInsight 里還可以補(bǔ)全,這里簡(jiǎn)單介紹幾個(gè):
-
acl help- 幫助 -
acl list- 列出所有用戶 -
acl whoami- 查看當(dāng)前用戶 -
acl setuser- 設(shè)置用戶,包括我們需要的設(shè)置密碼也是用這個(gè)命令
設(shè)置密碼
假設(shè)要把 default 用戶的密碼設(shè)置為 abc123
ACL SETUSER default on >abc123 sanitize-payload ~* &* +@all
如果不想要密碼了,可以用以下命令清除
ACL SETUSER default on nopass sanitize-payload ~* &* +@all
5在程序中連接
以 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();
// 寫(xiě)入
json.Set("ext:1", "$", new { Age = 35, Name = "Alice" });
// 讀取
Console.WriteLine($"讀取:{json.Get(key: "ext:1", path: "$", indent: "\t", newLine: "\n")}");
6參考資料
-
https://hub.docker.com/r/redis/redis-stack -
https://www.cnblogs.com/zhoujinyi/p/13222464.html -
https://redis.io/docs/management/security/acl/
