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

源代码: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容