• RedisStack部署/持久化/安全/与C#项目集成


    前言#

    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")}");
    

    参考资料#

  • 相关阅读:
    【LeetCode】59. 螺旋矩阵 II
    Java低代码:jvs-list (子列表)表单回显及触发逻辑引擎配置说明
    NewStarCTF 2023 公开赛道 WEEK2|WEB 游戏高手
    Comparison method violates its general contract解决办法
    好好的系统,为什么要分库分表?
    Workflow,要不要了解一下
    day076:枚举
    【python】(十七)python常用第三方库——yaml
    字节测试工程师十年经验直击UI 自动化测试痛点
    【Linux】Nignx及负载均衡&动静分离
  • 原文地址:https://www.cnblogs.com/deali/p/17746538.html