C#ASP.Net Core 5.0 使用StackExchange.Redis

一、前言

日常开发中,我们常需要操作redis,本章节介绍ASP.Net Core 使用StackExchange.Redis

Docs:https://stackexchange.github.io/StackExchange.Redis/

二、介绍

StackExchange.Redis 是适用于 .NET 语言(C# 等)的高性能通用 Redis 客户端。它是BookSleeve的逻辑继承者,是由Stack ExchangeStack Overflow等繁忙网站开发(并使用)的客户端。

特征

  • 高性能多路复用设计,允许高效使用多个调用线程的共享连接
  • 对 Redis 节点配置的抽象:客户端可以默默地协商多个 Redis 服务器以实现稳健性和可用性
  • 方便地访问完整的 Redis 功能集
  • 同步和异步使用的完整双编程模型,无需使用 TPL“同步优于异步
  • 支持redis“集群”

三、创建项目

四、添加StackExchange.Redis引用

  1. 打开管理Nuget程序包

  2. 搜索StackExchange.Redis

  3. 之前选择的目标框架是ASP.NET Core 5.0,所以安装StackExchange.Redis v2.6.116

  4. 安装完成

五、简单使用

  1. 通过ConfigurationOptions连接redis服务

    using System;
    
    namespace StackExchange.Redis.ASPNetCore
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConfigurationOptions redisOptions = new ConfigurationOptions();
                string host = "";//服务器地址
                int port = 6379;//端口号
                string serviceName = "";//用于通过sentinel解析服务的服务名称。
                string password = "";//密码
                string user = "";//用户名
                string key = "";//所需获取的key
                redisOptions.EndPoints.Add(host, port);
                redisOptions.AbortOnConnectFail = false; //获取或设置是否应通过TimeoutException显式通知连接/配置超时。
                redisOptions.ServiceName = serviceName;
                redisOptions.Password = password;
                redisOptions.User = user;
                ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(redisOptions);
                IDatabase db = connection.GetDatabase(0);
                var result = db.StringGet(key);
                Console.WriteLine(result);
                Console.ReadKey();
            }
        }
    }
    
  2. 通过configuration连接redis

    配置可参考:https://stackexchange.github.io/StackExchange.Redis/Configuration

    using System;
    
    namespace StackExchange.Redis.ASPNetCore
    {
        class Program
        {
            static void Main(string[] args)
            {
                string key = "";//所需获取的key
                string configuration = "host:port,abortConnect=false,servicename={string},password={string},user={string}";
                ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(configuration);
                IDatabase db = connection.GetDatabase(0);
                var result = db.StringGet(key);
                Console.WriteLine(result);
                Console.ReadKey();
            }
        }
    }
    
    

    Configuration Options

    ConfigurationOptions对象具有广泛的属性,所有这些属性都在智能感知中得到了完整记录。一些更常见的选项包括:

    Configuration string(配置字符串) ConfigurationOptions(配置项) Default(默认值) Meaning(意义)
    abortConnect={bool} AbortOnConnectFail true (false on Azure) 如果为 true,Connect则在没有可用服务器时不会创建连接
    allowAdmin={bool} AllowAdmin false 启用一系列被认为有风险的命令
    channelPrefix={string} ChannelPrefix null 所有发布/订阅操作的可选通道前缀
    checkCertificateRevocation={bool} CheckCertificateRevocation true 一个布尔值,指定在身份验证过程中是否检查证书吊销列表。
    connectRetry={int} ConnectRetry 3 初始期间重复连接尝试的次数Connect
    connectTimeout={int} ConnectTimeout 5000 连接操作超时(毫秒)
    configChannel={string} ConfigurationChannel __Booksleeve_MasterChanged 用于传达配置更改的广播通道名称
    configCheckSeconds={int} ConfigCheckSeconds 60 检查配置的时间(秒)。如果支持的话,这可以作为交互式套接字的保持活动状态。
    defaultDatabase={int} DefaultDatabase null 默认数据库索引,从0databases - 1
    keepAlive={int} KeepAlive -1 发送消息以帮助保持套接字处于活动状态的时间(秒)(默认为 60 秒)
    name={string} ClientName null redis 内连接的标识
    password={string} Password null redis服务器的密码
    user={string} User null Redis 服务器的用户(与 Redis 6 及更高版本上的 ACL 一起使用)
    proxy={proxy type} Proxy Proxy.None 使用的代理类型(如果有);例如“twemproxy/envoyproxy”
    resolveDns={bool} ResolveDns false 指定 DNS 解析应该是显式且急切的,而不是隐式的
    serviceName={string} ServiceName null 用于连接到哨兵主要服务
    ssl={bool} Ssl false 指定应使用 SSL 加密
    sslHost={string} SslHost null 在服务器证书上强制执行特定的 SSL 主机身份
    sslProtocols={enum} SslProtocols null 使用加密连接时支持的 Ssl/Tls 版本。使用“|” 提供多个值。
    syncTimeout={int} SyncTimeout 5000 允许同步操作的时间(毫秒)
    asyncTimeout={int} AsyncTimeout SyncTimeout 允许异步操作的时间(毫秒)
    tiebreaker={string} TieBreaker __Booksleeve_TieBreak 用于在不明确的主要场景中选择服务器的关键
    version={string} DefaultVersion (4.0 in Azure, else 2.0) Redis 版本级别(当服务器不提供此功能时有用)
    tunnel={string} Tunnel null 连接隧道(用于http:{proxy url}基于“连接”的代理服务器)
    setlib={bool} SetClientLibrary true 是否尝试使用CLIENT SETINFO设置连接上的库名称/版本
    protocol={string} Protocol null 使用的Redis协议;请参阅下面的部分

六、哨兵模式使用

​ 在日常工作中,redis基本不会仅有一个服务器在工作,这会使系统有巨大的风险,一旦redis服务宕机了,依赖redis的服务就会跟随宕机,所以我们基本会采用一个redis集群(一台Master + sentinel角色,两台Slave + sentinel角色)。通过哨兵模式提高redis集群的可用性和稳定性。

using System;
using System.Collections.Generic;

namespace StackExchange.Redis.ASPNetCore
{
    class Program
    {
        static void Main(string[] args)
        {
            string key = "";//所需获取的key
            ConfigurationOptions sentinelOptions = new ConfigurationOptions();
            List<string> sentinelAdressList = new List<string>();
            sentinelAdressList.Add("");//服务器地址
            sentinelAdressList.Add("");//服务器地址
            sentinelAdressList.Add("");//服务器地址
            int sentinelPort = 6379;//端口号
            string serviceName = "";//用于通过sentinel解析服务的服务名称。
            string password = "";//密码
            string user = "";//用户名
            foreach (var sentinel in sentinelAdressList)
            {
                sentinelOptions.EndPoints.Add(sentinel, sentinelPort);
            }
            sentinelOptions.CommandMap = CommandMap.Sentinel;//命令映射设置成哨兵
            sentinelOptions.AbortOnConnectFail = false;//获取或设置是否应通过TimeoutException显式通知连接/配置超时。
            sentinelOptions.ServiceName = serviceName;
            sentinelOptions.Password = password;

            ConfigurationOptions redisOptions = new ConfigurationOptions();
            redisOptions.AbortOnConnectFail = false;//获取或设置是否应通过TimeoutException显式通知连接/配置超时。
            redisOptions.ServiceName = serviceName;
            redisOptions.Password = password;       
            redisOptions.User = user;
            //创建连接到Sentinel服务器的ConnectionMultiplexer实例
            ConnectionMultiplexer _sentinelConnect = ConnectionMultiplexer.SentinelConnect(sentinelOptions);
            var masterConnection = _sentinelConnect.GetSentinelMasterConnection(redisOptions);
            IDatabase db = masterConnection.GetDatabase(0);
            var result = db.StringGet(key);
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}

posted @   Destiny、Yang  阅读(631)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示