美文网首页ABPRedisdotNET
C#使用redis作为缓存服务器之 高可用/分布式/集群 <

C#使用redis作为缓存服务器之 高可用/分布式/集群 <

作者: 诸葛_小亮 | 来源:发表于2017-01-03 17:24 被阅读919次

    源代码:https://git.oschina.net/zhaord/redis_sentinel_demo.git


    简介

    通过C#使用redis作为缓存服务器之 高可用/分布式/集群 <一> —— C# Docker redis 集群,我们可以大家docker 下的redis集群,那么如何使用这个集群呢?
    接下来,我们基于abp.net框架的缓存模块,来实现案例!


    项目结构

    类型:Console
    依赖类库:Abp.RedisCache、Abp


    主要代码

    1.程序模块

    根据abp编码规则,定义console的模块

    
        /// <summary>
        /// reids 集群测试 module
        /// </summary>
        [DependsOn(typeof(AbpRedisCacheModule))]
        public class ReidsSentinelCacheModule : AbpModule
        {
            public override void PreInitialize()
            {
                this.Configuration.Caching.ConfigureAll(cache =>
                    {
                        //cache.DefaultSlidingExpireTime = TimeSpan.FromMinutes(1);// 多久未访问
                        // 设置1min缓存失效
                        cache.DefaultAbsoluteExpireTime = TimeSpan.FromMinutes(1);// 定时销毁
                    });
                this.Configuration.Caching.UseRedis();
    
            }
        }
    
    2.初始化ABP
    
            /// <summary>
            ///     初始化abp
            /// </summary>
            private static void InitAbp()
            {
                var bootstrapper = AbpBootstrapper.Create<ReidsSentinelCacheModule>();
                bootstrapper.Initialize();
                _cacheManager = IocManager.Instance.Resolve<ICacheManager>();
            }
    
    3.可配置console标题
    
            private static void InitConsole()
            {
                var title= ConfigurationManager.AppSettings["title"];
                Console.Title = title.IsNullOrEmpty() ? "master" : title;
            }
    
    4.取值
    
            /// <summary>
            ///     获取缓存值
            /// </summary>
            /// <returns>随机值</returns>
            public static int GetCacheItem()
            {
                var cache = _cacheManager.GetCache("RANDOMCACHE");
                
                return int.Parse((cache.Get(
                    "RandomValue",
                    () =>
                    {
                        Console.WriteLine("非缓存数据");
                        Random rd = new Random();
                        return rd.Next(1, 100000);
                    })).ToString());
            }
    
    5.main方法
    
            static void Main(string[] args)
            {
                InitConsole();
                InitAbp();
                
                var randomValue = GetCacheItem();
                Console.WriteLine("第一次取值:{0}",randomValue);
                
                Stopwatch watch = new Stopwatch();
                watch.Start();
                while (true)
                {
                    Thread.Sleep(5000); // 等待500ms
                    // 每500 ms取一次
                    randomValue = GetCacheItem();
                    Console.WriteLine("{1}取值:{0}", randomValue, DateTime.Now.ToString("HH:mm:ss.fff"));
    
                    if (watch.ElapsedMilliseconds > 10*60 * 1000)
                    {
                        // 运行 1min
                        break;
                    }
                }
    
                watch.Stop();
    
                Console.ReadKey(true);
            }
    

    程序运行 10min,每5s取一次数据,缓存设定定时1min失效!

    6.配置文件
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        
      </configSections>
      <appSettings>
        <!--区分程序-->
        <add key="title" value="" />
        <!--指定redis数据库-->
        <add key="Abp.Redis.Cache.DatabaseId" value="-1" />
        
      </appSettings>
      <connectionStrings>
        <!--设置redis数据库连接-->
        <add name="Abp.Redis.Cache" connectionString="localhost:6379,localhost:6380,localhost:6381"/>
      </connectionStrings>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
    </configuration>
    

    运行结果

    现在我们运行三个程序,标题分别为 master、slavo1、slavo2,将生产的debug文件夹复制三个,分别重命名

    图片.png
    修改三个文件夹配置文件: <add key="title" value="" />来指定console显示的标题。
    期望结果

    分别运行 三个程序,期望得到的结果是:master、s1、s2 获取到的缓存数据都是一样的,并且如果 三个程序,有一个改变了缓存,其他程序也能正确获取到缓存值,运行结果如下:

    图片.png

    我们发现master第一次产生的数据:76347,而其他程序启动之后,没有显示非缓存数据,而是直接取缓存数据76347,得到预期运行结果。

    master 关闭,

    接下来,我们stop master

    图片.png

    在来看程序运行结果

    图片.png

    程序正常运行


    总结

    通过该实例,我们发现,可以正常使用redis 集群缓存。
    并且学习了 abp 的基本用法和 abp.rediscache的用法。
    为什么要用三个同样的程序跑呢?我是为了以后web做负载均衡的时候,能够确保每个程序都会正确的读取到缓存数据,经过实验证明,方案是可行的。
    接下来,将会分享nginx+iis的负载均衡。


    QQ:1260825783

    相关文章

      网友评论

        本文标题:C#使用redis作为缓存服务器之 高可用/分布式/集群 <

        本文链接:https://www.haomeiwen.com/subject/jxdnvttx.html