.net core使用CSRedisCore访问Redis主从+哨兵

本文主要目的是对Redis主从+哨兵的高可用方案进行实验,文中使用的技术不进行深入说明,想深入了解的可自行百度。

用到的软件和版本:

  • CSRedisCore版本:3.0.6.2   (https://github.com/2881099/csredis)
  • Redis版本:3.2.100 (windows)

 

1. 下载Redis安装包

本示例使用Windows10搭建Redis环境,Windows下的Redis下载方式如下

打开网址 https://github.com/microsoftarchive/redis/releases,下载3.2.100的压缩包

.net core使用CSRedisCore访问Redis主从+哨兵_第1张图片

2. 搭建Redis主从集群

将压缩包解压然后复制,总共3份,我们搭建1主2从模式,Redis6379(主),Redis6479(从),Redis6579(从)

.net core使用CSRedisCore访问Redis主从+哨兵_第2张图片

主Redis配置,进入Redis6379目录中,配置 redis.windows.conf

#配置IP绑定
bind 0.0.0.0
#配置端口
port 6379
#是否保护模式
protected-mode no

为了方便运行,目录下加个run.bat文件

redis-server redis.windows.conf

从Redis配置,分别进入Redis6479和Redis6579目录,配置redis.windows.conf,并添加run.bat文件

#配置IP绑定
bind 0.0.0.0
#配置端口,分别配置6479和6579
port 6479
#是否保护模式
protected-mode no
#配置主redisd的IP和端口
slaveof 192.168.1.5 6379

现在Redis配置好了,运行3个Redis目录中的run.bat启动服务,运行后可以看到主从都成功连接。

.net core使用CSRedisCore访问Redis主从+哨兵_第3张图片

3.搭建哨兵

实际使用中一般会使用多个哨兵进行监控,本文作了简化,只使用1个哨兵,多个哨兵都是相同的配置,仅区分端口。

将Redis目录复制一份命名为RedisSentinel,添加sentinel.conf文件,内容如下:

port 27000 #哨兵运行端口
protected-mode no  #非保护模式运行
#监控的主Redis的IP和端口,1表示1个哨兵
sentinel monitor redis-master 192.168.1.5 6379 1  
#主机掉线以后5s进行认证,如果无法连接则重新由哨兵从slave中选出新的master
sentinel down-after-milliseconds redis-master 5000 
sentinel failover-timeout redis-master 60000

CMD中通过命令运行哨兵

redis-server sentinel.conf --sentinel 

可以看到哨兵已经发现1主2从并开始监听了

.net core使用CSRedisCore访问Redis主从+哨兵_第4张图片

也可通过命令查看哨兵状态

redis-cli -p 27000 info sentinel

.net core使用CSRedisCore访问Redis主从+哨兵_第5张图片

4. .NET Core中使用Redis集群

我们使用CSRedisCore来访问Redis,CSRedisCore是国内大牛开发的一个.net core redis 组件,源码可读性很强非常干净,几乎无任何依赖。性能相比ServiceStack.Redis和StackExchange.Redis会快10%左右,支持Redis的高级特性:订阅/发布,Pipeline,MGet/MSet,集群,分区。

创建一个.net core 控制台程序,然后添加nuget包

nuget Install-Package CSRedisCore

Program.cs代码

using System;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //连接哨兵
            var csredis = new CSRedis.CSRedisClient("redis-master", new[] {"127.0.0.1:27000" });

            //初始化 RedisHelper
            RedisHelper.Initialization(csredis);

            while (true)
            {
                try
                {
                    Test();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                Console.ReadLine();
            }
            Console.ReadKey();
        }

        static void Test()
        {
            RedisHelper.Set("name", "祝雷");//设置值。默认永不过期
            Console.WriteLine(RedisHelper.Get("name"));

            RedisHelper.Set("time", DateTime.Now, 1);
            Console.WriteLine(RedisHelper.Get("time"));
            Console.WriteLine(RedisHelper.Get("time"));

            // 列表
            RedisHelper.RPush("list", "第一个元素");
            RedisHelper.RPush("list", "第二个元素");
            RedisHelper.LInsertBefore("list", "第二个元素", "我是新插入的第二个元素!");
            Console.WriteLine($"list的长度为{RedisHelper.LLen("list")}");
            Console.WriteLine($"list的第二个元素为{RedisHelper.LIndex("list", 1)}");
        }
    }
}

模拟故障进行测试,启动程序后,杀死主Redis进程,.net core程序再次访问Redis会出现一次异常检查,然后能正常切换到新的master上。

.net core使用CSRedisCore访问Redis主从+哨兵_第6张图片

你可能感兴趣的:(redis)