码迷,mamicode.com
首页 > 其他好文 > 详细

Redis学习笔记~Redis实现多个緩存服务器,读写分离

时间:2014-10-21 11:41:11      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   使用   for   

回到目录

Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布式的,而Redis与WWW之间也是一种分布式,对于各个redis之间的分布式不需要我们去干预,它是由我们的redis客户端去负责链接的,你当时链到哪台服务器,完全由客户端去控制。

下面看一下redisConfig里的相关配置,我加了一些说明

    /// <summary>
    /// redis主要信息的配置参数
    /// </summary>
    public sealed class RedisConfigInfo : ConfigurationSection
    {
        public static RedisConfigInfo GetConfig()
        {
            RedisConfigInfo section = (RedisConfigInfo)ConfigurationManager.GetSection("RedisConfig");
            return section;
        }

        public static RedisConfigInfo GetConfig(string sectionName)
        {
            RedisConfigInfo section = (RedisConfigInfo)ConfigurationManager.GetSection("RedisConfig");
            if (section == null)
                throw new ConfigurationErrorsException("Section " + sectionName + " is not found.");
            return section;
        }
        /// <summary>
        /// 可写的Redis链接地址,多个主机用逗号分开
        /// </summary>
        [ConfigurationProperty("WriteServerList", IsRequired = false)]
        public string WriteServerList
        {
            get
            {
                return (string)base["WriteServerList"]; 
            }
            set
            {
                base["WriteServerList"] = value;
            }
        }

        
        /// <summary>
        /// 可读的Redis链接地址,多个主机用逗号分开
        /// </summary>
        [ConfigurationProperty("ReadServerList", IsRequired = false)]
        public string ReadServerList
        {
            get
            {
                return (string)base["ReadServerList"]; 
            }
            set
            {
                base["ReadServerList"] = value;
            }
        }

        
        /// <summary>
        /// 最大写链接数
        /// </summary>
        [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)]
        public int MaxWritePoolSize
        {
            get
            {
                int _maxWritePoolSize = (int)base["MaxWritePoolSize"];
                return _maxWritePoolSize > 0 ? _maxWritePoolSize : 5;
            }
            set
            {
                base["MaxWritePoolSize"] = value;
            }
        }

       
        /// <summary>
        /// 最大读链接数
        /// </summary>
        [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)]
        public int MaxReadPoolSize
        {
            get
            {
                int _maxReadPoolSize = (int)base["MaxReadPoolSize"];
                return _maxReadPoolSize > 0 ? _maxReadPoolSize : 5;
            }
            set
            {
                base["MaxReadPoolSize"] = value;
            }
        }

         
        /// <summary>
        /// 自动重启
        /// </summary>
        [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)]
        public bool AutoStart
        {
            get
            {
                return (bool)base["AutoStart"];
            }
            set
            {
                base["AutoStart"] = value;
            }
        }


        
        /// <summary>
        /// 本地缓存到期时间(超时时间),单位:秒
        /// </summary>
        [ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)]
        public int LocalCacheTime
        {
            get
            {
                return (int)base["LocalCacheTime"];
            }
            set
            {
                base["LocalCacheTime"] = value;
            }
        }

       
        /// <summary>
        /// 是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项
        /// </summary>
        [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)]
        public bool RecordeLog
        {
            get
            {
                return (bool)base["RecordeLog"];
            }
            set
            {
                base["RecordeLog"] = value;
            }
        }        

    }

而配置文件中,我们可以把redis读服务器和写服务器进行配置,多个服务器使用逗号分开(redis本身就是支持读写分离的)

  <RedisConfig WriteServerList="192.168.2.71:6379,192.168.2.72:6379" ReadServerList="192.168.2.71:6379,192.168.2.72:6379" MaxWritePoolSize="60" MaxReadPoolSize="60" AutoStart="true" LocalCacheTime="180" RecordeLog="false">
  </RedisConfig>

而我们使用多线程来测试一下

      //testing redis 100 threads
            for (int i = 0; i < 100; i++)
            {
                Task.Run(() =>
                {
                    using (var redisClient = RedisManager.GetClient())
                    {
                        using (var test = redisClient.GetTypedClient<string>())
                        {

                            test.Lists["print"].Enqueue("信息被添加");
                            var s = test.Lists["print"].Dequeue();
                            Response.Write(s);
                            Response.Write(redisClient.Host);
                            Response.Write("<br>");
                        }
                    }
                });
            }

测试的结果就是,在每个客户端请求时,都会随机去分配一个redis服务器,我们可以看一下截图

bubuko.com,布布扣

通过上面的图可以看到,我们的信息被分别写到了两台redis服务器中,而问题又来了,在客户端去取数据时,你可能会取redisserver1里的数据,也有可能取redisserver2里的数据,而真正完整的数据是这两台server的并集,如何将多台server的数据合并,这是我们要解决的问题,如果这个问题不能解决,那多台server也就没有意思了,下一讲,我们将主要来说一下多台redisServer的数据同步问题。

回到目录

Redis学习笔记~Redis实现多个緩存服务器,读写分离

标签:style   blog   http   color   io   os   ar   使用   for   

原文地址:http://www.cnblogs.com/lori/p/4039735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!