public void RedisResolver_does_reset_when_detects_invalid_master()
        {
            var invalidMaster = new[] { SlaveHosts[0] };
            var invalidSlaves = new[] { MasterHosts[0], SlaveHosts[1] };

            using (var redisManager = new PooledRedisClientManager(invalidMaster, invalidSlaves))
            {
                var resolver = (RedisResolver)redisManager.RedisResolver;

                using (var master = redisManager.GetClient())
                {
                    master.SetValue("KEY", "1");
                    Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                }
                using (var master = redisManager.GetClient())
                {
                    master.Increment("KEY", 1);
                    Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                }

                "Masters:".Print();
                resolver.Masters.PrintDump();
                "Slaves:".Print();
                resolver.Slaves.PrintDump();
            }
        }
        public void PooledRedisClientManager_alternates_hosts()
        {
            using (var redisManager = new PooledRedisClientManager(MasterHosts, SlaveHosts))
            {
                using (var master = redisManager.GetClient())
                {
                    Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                    master.SetValue("KEY", "1");
                }
                using (var master = redisManager.GetClient())
                {
                    Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                    master.Increment("KEY", 1);
                }

                5.Times(i =>
                {
                    using (var readOnly = redisManager.GetReadOnlyClient())
                    {
                        Assert.That(readOnly.GetHostString(), Is.EqualTo(SlaveHosts[i % SlaveHosts.Length]));
                        Assert.That(readOnly.GetValue("KEY"), Is.EqualTo("2"));
                    }
                });

                using (var cahce = redisManager.GetCacheClient())
                {
                    Assert.That(cahce.Get<string>("KEY"), Is.EqualTo("2"));
                }
            }
        }
        public void Crud_TODO_App()
        {
            //Thread-safe client factory
            var redisManager = new PooledRedisClientManager(TestConfig.SingleHostConnectionString);

            redisManager.ExecAs<Todo>(redisTodos =>
            {
                var todo = new Todo
                {
                    Id = redisTodos.GetNextSequence(),
                    Content = "Learn Redis",
                    Order = 1,
                };

                redisTodos.Store(todo);

                Todo savedTodo = redisTodos.GetById(todo.Id);
                savedTodo.Done = true;

                redisTodos.Store(savedTodo);

                redisTodos.DeleteById(savedTodo.Id);

                var allTodos = redisTodos.GetAll();

                Assert.That(allTodos.Count, Is.EqualTo(0));
            });
        }
		public void Can_support_64_threads_using_the_client_simultaneously()
		{
			var before = Stopwatch.GetTimestamp();

			const int noOfConcurrentClients = 64; //WaitHandle.WaitAll limit is <= 64

			var clientAsyncResults = new List<IAsyncResult>();
			using (var manager = new PooledRedisClientManager(TestConfig.MasterHosts, TestConfig.SlaveHosts))
			{
				manager.GetClient().Run(x => x.FlushAll());

				for (var i = 0; i < noOfConcurrentClients; i++)
				{
					var clientNo = i;
					var action = (Action)(() => UseClientAsync(manager, clientNo));
					clientAsyncResults.Add(action.BeginInvoke(null, null));
				}
			}

			WaitHandle.WaitAll(clientAsyncResults.ConvertAll(x => x.AsyncWaitHandle).ToArray());

			Debug.WriteLine(string.Format("Completed in {0} ticks", (Stopwatch.GetTimestamp() - before)));

            RedisStats.ToDictionary().PrintDump();
		}
		public void Issue37_Cannot_add_unknown_client_back_to_pool_exception()
		{
			pool = new PooledRedisClientManager();
			try
			{
				var threads = new Thread[100];
				for (var i = 0; i < threads.Length; i++)
				{
					threads[i] = new Thread(Stuff);
					threads[i].Start();
				}
				Debug.WriteLine("running, waiting 10secs..");
				Thread.Sleep(10000);
				using (var redisClient = (RedisClient)pool.GetClient())
				{
					Debug.WriteLine("shutdown Redis!");
					redisClient.Shutdown();
				}
			}
			catch (NotSupportedException nse)
			{
				Assert.Fail(nse.Message);
			}
			catch (Exception e)
			{
				Debug.WriteLine(e.Message);
			}
			
			Thread.Sleep(5000);
		}
        public void Can_Add_Update_and_Delete_Todo_item()
        {
            using (var redisManager = new PooledRedisClientManager())
            using (var redis = redisManager.GetClient())
            {
                var redisTodos = redis.As<Todo>();
                var todo = new Todo
                {
                    Id = redisTodos.GetNextSequence(),
                    Content = "Learn Redis",
                    Order = 1,
                };

                redisTodos.Store(todo);

                Todo savedTodo = redisTodos.GetById(todo.Id);
                savedTodo.Done = true;
                redisTodos.Store(savedTodo);

                "Updated Todo:".Print();
                redisTodos.GetAll().ToList().PrintDump();

                redisTodos.DeleteById(savedTodo.Id);

                "No more Todos:".Print();
                redisTodos.GetAll().ToList().PrintDump();
            }
        }
        public void Can_have_different_pool_size_and_host_configurations()
        {
            var writeHosts = new[] { "readwrite1" };
            var readHosts  = new[] { "read1", "read2" };

            const int poolSizeMultiplier = 4;

            using (var manager = new PooledRedisClientManager(writeHosts,
                                                              readHosts,
                                                              new RedisClientManagerConfig {
                MaxWritePoolSize = writeHosts.Length * poolSizeMultiplier,
                MaxReadPoolSize = readHosts.Length * poolSizeMultiplier,
                AutoStart = true
            }
                                                              )
                   ) {
                // A pool size of 4 will not block getting 4 clients
                using (var client1 = manager.GetClient()) {
                    using (var client2 = manager.GetClient()) {
                        using (var client3 = manager.GetClient()) {
                            using (var client4 = manager.GetClient()) {
                                AssertClientHasHost(client1, writeHosts[0]);
                                AssertClientHasHost(client2, writeHosts[0]);
                                AssertClientHasHost(client3, writeHosts[0]);
                                AssertClientHasHost(client4, writeHosts[0]);
                            }
                        }
                    }
                }

                // A pool size of 8 will not block getting 8 clients
                using (var client1 = manager.GetReadOnlyClient()) {
                    using (var client2 = manager.GetReadOnlyClient()) {
                        using (var client3 = manager.GetReadOnlyClient()) {
                            using (var client4 = manager.GetReadOnlyClient()) {
                                using (var client5 = manager.GetReadOnlyClient()) {
                                    using (var client6 = manager.GetReadOnlyClient()) {
                                        using (var client7 = manager.GetReadOnlyClient()) {
                                            using (var client8 = manager.GetReadOnlyClient()) {
                                                AssertClientHasHost(client1, readHosts[0]);
                                                AssertClientHasHost(client2, readHosts[1]);
                                                AssertClientHasHost(client3, readHosts[0]);
                                                AssertClientHasHost(client4, readHosts[1]);
                                                AssertClientHasHost(client5, readHosts[0]);
                                                AssertClientHasHost(client6, readHosts[1]);
                                                AssertClientHasHost(client7, readHosts[0]);
                                                AssertClientHasHost(client8, readHosts[1]);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Example #8
0
        public void Can_recover_from_server_terminated_client_connection()
        {
            const int SleepHoldingClientMs        = 5;
            const int SleepAfterReleasingClientMs = 0;
            const int loop = 1000;

            var admin = new RedisClient("localhost");

            admin.SetConfig("timeout", "0");
            var timeout = admin.GetConfig("timeout");

            timeout.Print("timeout: {0}");

            int remaining = loop;
            var stopwatch = Stopwatch.StartNew();

            var clientManager = new PooledRedisClientManager(new[] { "localhost" })
            {
            };

            loop.Times(i =>
            {
                ThreadPool.QueueUserWorkItem(x =>
                {
                    try
                    {
                        using (var client = (RedisClient)clientManager.GetClient())
                        {
                            client.IncrementValue("key");
                            var val = client.Get <long>("key");
                            "#{0}, isConnected: {1}".Print(val, true);     //client.IsSocketConnected()
                            Thread.Sleep(SleepHoldingClientMs);
                        }
                        Thread.Sleep(SleepAfterReleasingClientMs);
                    }
                    catch (Exception ex)
                    {
                        ex.Message.Print();
                    }
                    finally
                    {
                        remaining--;
                    }
                });
            });

            while (remaining > 0)
            {
                Thread.Sleep(10);
            }
            "Elapsed time: {0}ms".Print(stopwatch.ElapsedMilliseconds);

            var managerStats = clientManager.GetStats();

            managerStats.PrintDump();
        }
Example #9
0
 /// <summary>
 /// 创建链接池管理对象
 /// </summary>
 private static void CreateManager()
 {
     if (String.IsNullOrEmpty(ConfigurationManager.AppSettings["RedisConnectionString"]))
     {
         throw new Exception("Redis connection string is empty");
     }
     RedisPath = ConfigurationManager.AppSettings["RedisConnectionString"];
     Int32.TryParse(ConfigurationManager.AppSettings["RedisDBIndex"], out DBIndex);
     _prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath });
 }
Example #10
0
 public IRedisClient GetRedisClient()
 {
     _prcm = new PooledRedisClientManager(this.ReadWriteHosts, this.ReadOnlyHosts, new RedisClientManagerConfig()
     {
         AutoStart        = true,
         MaxReadPoolSize  = 5000,
         MaxWritePoolSize = 5000
     });
     return(_prcm.GetClient());
 }
 public static bool Clear()
 {
     using (var redisManager = new PooledRedisClientManager())
         using (var client = redisManager.GetClient())
         {
             var typedClient = client.As <CacheObject>();
             typedClient.FlushAll();
         }
     return(true);
 }
Example #12
0
 /// <summary>
 /// 创建链接池管理对象
 /// </summary>
 private static void CreateManager()
 {
     _prcm = new PooledRedisClientManager(RedisWriteServers, RedisReadServers, new RedisClientManagerConfig
     {
         AutoStart        = true,
         MaxReadPoolSize  = RedisPoolMaxRead,
         MaxWritePoolSize = RedisPoolMaxWrite,
         DefaultDb        = DefaultDb,
     });
 }
Example #13
0
 /// <summary>
 /// 创建redis连接池
 /// </summary>
 /// <returns></returns>
 private static void CreateRedisPool()
 {
     // 支持读写分离,均衡负载
     redisPoolManager = new PooledRedisClientManager(writeRedis, readOnlyRedis, new RedisClientManagerConfig
     {
         MaxWritePoolSize = 50, // “写”链接池链接数
         MaxReadPoolSize  = 50, // “读”链接池链接数
         AutoStart        = true,
     });
 }
Example #14
0
        public void Can_connect_to_redis_with_password_with_equals()
        {
            var connString   = "127.0.0.1?password="******"p@55w0rd=".UrlEncode();
            var redisManager = new PooledRedisClientManager(connString);

            using (var redis = redisManager.GetClient())
            {
                Assert.That(redis.Password, Is.EqualTo("p@55w0rd="));
            }
        }
        public void Does_set_Client_on_Pooled_Connection()
        {
            using (var redisManager = new PooledRedisClientManager("localhost?Client=nunit"))
            using (var redis = redisManager.GetClient())
            {
                var clientName = redis.GetClient();

                Assert.That(clientName, Is.EqualTo("nunit"));
            }
        }
Example #16
0
 public string GetCacheItem(string key)
 {
     using (var manager = new PooledRedisClientManager(_redisCacheConfiguration.RedisCacheServerAddress))
     {
         using (var client = manager.GetClient())
         {
             return(client.Get <string>(key));
         }
     }
 }
Example #17
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="OpenPooledRedis">是否开启缓冲池</param>
        public RedisService(bool OpenPooledRedis = false)
        {
            if (OpenPooledRedis)
            {
                //prcm = CreateManager(new[] { "[email protected]:6379" }, new[] { "[email protected]:6379" });
                prcm = CreateManager(new[] { "172.19.20.72:6379" }, new[] { "172.19.20.73:6379" });

                Redis = prcm.GetClient() as ServiceStack.Redis.RedisClient;
            }
        }
        public NotificationsHandlingHostedService(IConfiguration configuration, IHubContext <ChatHub> hub)
        {
            _configuration = configuration;
            _hubContext    = hub;

            var masters = _configuration.GetSection("ConnectionStrings:Redis:Masters").Get <string[]>();
            var slaves  = _configuration.GetSection("ConnectionStrings:Redis:Slaves").Get <string[]>();

            _clientManager = new PooledRedisClientManager(masters, slaves);
        }
Example #19
0
 public DequeueManager(PooledRedisClientManager clientManager, RedisSequentialWorkQueue <T> workQueue, string workItemId, string dequeueLockKey, int numberOfDequeuedItems, int dequeueLockTimeout)
 {
     this.workQueue             = workQueue;
     this.workItemId            = workItemId;
     this.clientManager         = clientManager;
     this.numberOfDequeuedItems = numberOfDequeuedItems;
     myLock = new DistributedLock();
     this.dequeueLockKey     = dequeueLockKey;
     this.dequeueLockTimeout = dequeueLockTimeout;
 }
Example #20
0
 /// <summary>
 /// 创建链接池管理对象
 /// </summary>
 private static void CreateManager(ref long initialDb, ref string[] readWriteHosts)
 {
     _prcm = new PooledRedisClientManager(readWriteHosts, readWriteHosts, new RedisClientManagerConfig
     {
         MaxWritePoolSize = 20, //“写”链接池链接数
         MaxReadPoolSize  = 20, //“写”链接池链接数
         DefaultDb        = 0,
         AutoStart        = true
     }, initialDb, null, null);
 }
Example #21
0
 public void Can_connect_to_ssl_azure_redis_with_PooledClientsManager()
 {
     using (var redisManager = new PooledRedisClientManager(connectionString))
     using (var client1 = redisManager.GetClient())
     using (var client2 = redisManager.GetClient())
     {
         client1.Set("foo", "bar");
         var foo = client2.GetValue("foo");
         foo.Print();
     }
 }
Example #22
0
 private static void CreateManager()
 {
     string[] WriteServerConStr = SplitString(RedisConfig.WriteServerConStr, ",");
     string[] ReadServerConStr  = SplitString(RedisConfig.ReadServerConStr, ",");
     prcm = new PooledRedisClientManager(ReadServerConStr, WriteServerConStr, new RedisClientManagerConfig()
     {
         MaxWritePoolSize = RedisConfig.MaxWritePoolSize,
         MaxReadPoolSize  = RedisConfig.MaxReadPoolSize,
         AutoStart        = RedisConfig.AutoStart
     });
 }
        public void Can_MqServer_recover_from_server_terminated_client_connections()
        {
            LogManager.LogFactory = new ConsoleLogFactory();

            var clientManager = new PooledRedisClientManager(new[] { "localhost" }) { CheckConnected = true };
            var mqHost = new RedisMqServer(clientManager, retryCount: 2);

            var sum = 0;
            mqHost.RegisterHandler<Incr>(c =>
                {
                    var dto = c.GetBody();
                    sum += dto.Value;
                    "Received {0}, sum: {1}".Print(dto.Value, sum); 
                    return null;
                });

            mqHost.Start();

            10.Times(i =>
                {
                    ThreadPool.QueueUserWorkItem(x => { 
                        using (var client = mqHost.CreateMessageQueueClient())
                        {
                            "Publish: {0}...".Print(i);
                            client.Publish(new Incr { Value = i });
                            
                            Thread.Sleep(10);
                        }
                    });
            });

            ThreadPool.QueueUserWorkItem(_ =>
                {
                    using (var client = (RedisClient)clientManager.GetClient())
                    {
                        client.SetConfig("timeout", "1");
                        var clientAddrs = client.GetClientList().ConvertAll(x => x["addr"]);
                        "Killing clients: {0}...".Print(clientAddrs.Dump());
                        clientAddrs.ForEach(client.ClientKill);
                    }
                });

            20.Times(i =>
            {
                using (var client = mqHost.CreateMessageQueueClient())
                {
                    "Publish: {0}...".Print(i);
                    client.Publish(new Incr { Value = i });
                }

                Thread.Sleep(2000);
            });

        }
Example #24
0
        public RedisClientService(string key, int maxReadPoolSize = 80, int maxWritePoolSize = 50)
        {
            string[] redisServerReadWrite = ConfigParam.RedisServerReadWrite.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            string[] redisServerRead      = ConfigParam.RedisServerRead.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

            Manager = new PooledRedisClientManager(redisServerReadWrite, redisServerRead,
                                                   new RedisClientManagerConfig()
            {
                MaxReadPoolSize = maxReadPoolSize, MaxWritePoolSize = maxWritePoolSize
            });
        }
Example #25
0
        // private static RedisClient redis;

        //Redis缓冲池
        // PooledRedisClientManager poolRedis = new PooledRedisClientManager();

        /// <summary>
        /// 创建Redis连接池管理对象
        /// </summary>
        /// <param name="readWriteUrl"></param>
        /// <param name="readOnlyUrl"></param>
        /// <returns></returns>
        public static void CreateManager(string[] readWriteUrl, string[] readOnlyUrl)
        {
            prc_Manager = new PooledRedisClientManager(readWriteUrl, readOnlyUrl, new RedisClientManagerConfig
            {
                MaxReadPoolSize  = redis_config.MaxReadPoolSize,
                MaxWritePoolSize = redis_config.MaxWritePoolSize,
                AutoStart        = redis_config.AutoStart
            });
            prc_Manager.PoolTimeOut = 2;
            //return manager;
        }
        public void Purge()
        {
            using var redisManager = new PooledRedisClientManager();
            using var redis        = redisManager.GetClient();

            var redisStoredEvent = redis.As <StoredEvent>();

            redisStoredEvent.SetSequence(0);

            redisStoredEvent.DeleteAll();
        }
        public void Store(StoredEvent storedEvent)
        {
            using var redisManager = new PooledRedisClientManager();
            using var redis        = redisManager.GetClient();

            var redisStoredEvent = redis.As <StoredEvent>();

            storedEvent.Id = redisStoredEvent.GetNextSequence();

            redisStoredEvent.Store(storedEvent);
        }
Example #28
0
 /// <summary>
 /// 创建连接对象
 /// </summary>
 private static void CreateManager()
 {
     string[] WriteServerConStr = _RedisConfigInfo.WriteServerList.Split(',');
     string[] ReadServerConStr  = _RedisConfigInfo.ReadServerList.Split(',');
     prcManager = new PooledRedisClientManager(ReadServerConStr, WriteServerConStr, new RedisClientManagerConfig
     {
         MaxReadPoolSize  = _RedisConfigInfo.MaxReadPoolSize,
         MaxWritePoolSize = _RedisConfigInfo.MaxReadPoolSize,
         AutoStart        = _RedisConfigInfo.AutoStart
     });
 }
Example #29
0
 /// <summary>
 /// 使用redis配置对象初始化连接池管理对象
 /// </summary>
 private static void CreateManager()
 {
     string[] readServerList  = redisConfig.ReadServerList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
     string[] writeServerList = redisConfig.WriteServerList.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
     redisClientManager = new PooledRedisClientManager(writeServerList, readServerList, new RedisClientManagerConfig
     {
         MaxReadPoolSize  = redisConfig.MaxReadPoolSize,
         MaxWritePoolSize = redisConfig.MaxWritePoolSize,
         AutoStart        = redisConfig.AutoStart
     });
 }
        public static object GetItem(string key)
        {
            using (var redisManager = new PooledRedisClientManager())
                using (var client = redisManager.GetClient())
                {
                    var typedClient = client.As <CacheObject>();

                    var savedCacheObject = typedClient.GetValue(key);
                    return(savedCacheObject?.Content);
                }
        }
Example #31
0
 /// <summary>
 /// 创建PooledRedisClientManager
 /// </summary>
 private void CreateManager()
 {
     string[] writeServerList = _redisConfig.WriteServerList.Split(',');
     string[] readServerList  = _redisConfig.ReadServerList.Split(',');
     _prcm = new PooledRedisClientManager(readServerList, writeServerList, new RedisClientManagerConfig
     {
         MaxWritePoolSize = _redisConfig.MaxWritePoolSize,
         MaxReadPoolSize  = _redisConfig.MaxReadPoolSize,
         AutoStart        = _redisConfig.AutoStart,
     });
 }
 /// <summary>
 /// 创建连接池管理对象
 /// </summary>
 private static void CreateManager()
 {
     redisConfigInfo = RedisHelper.GetConfig();
     string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");
     string[] readServerList  = SplitString(redisConfigInfo.ReadServerList, ",");
     prcm = new PooledRedisClientManager(readServerList, writeServerList, new RedisClientManagerConfig {
         AutoStart        = redisConfigInfo.AutoStart,
         MaxReadPoolSize  = redisConfigInfo.MaxReadPoolSize,
         MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
     });
 }
Example #33
0
 /// <summary>
 /// 创建PooledRedisClientManager
 /// </summary>
 private static void CreateManager()
 {
     string[] _writeServerList = redisConfigInfo.WriteServerList.Split(',');
     string[] _readServerList  = redisConfigInfo.ReadServerList.Split(',');
     prcm = new PooledRedisClientManager(_readServerList, _writeServerList, new RedisClientManagerConfig
     {
         MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
         MaxReadPoolSize  = redisConfigInfo.MaxReadPoolSize,
         AutoStart        = redisConfigInfo.AutoStart,
     });
 }
Example #34
0
          /// <summary>
          /// 构造函数
          /// </summary>
          /// <param name="openPooledRedis">是否开启缓冲池</param>
         public RedisHelper(bool openPooledRedis = false)
         
 {
                 if(openPooledRedis)
                  {
                         prcm  = CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" });
                         Redis = prcm.GetClient() as RedisClient;
                     
     }
             
 }
Example #35
0
 private PooledRedisClientManager GetDefaultManager()
 {
     if (_pcm != null)
     {
         return(_pcm);
     }
     _pcm = new PooledRedisClientManager(new[] { _RedisConnection });
     _pcm.ConnectTimeout  = 3000;
     _pcm.IdleTimeOutSecs = 30;
     return(_pcm);
 }
Example #36
0
        public RedisCache()
        {
            ConfigurationFileMap filemap = new ConfigurationFileMap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config/redis.config"));
            RedisConfig          config  = ConfigurationManager.OpenMappedMachineConfiguration(filemap).GetSection("redis") as RedisConfig;

            host = config.Host;
            if (!string.IsNullOrEmpty(host))
            {
                clientManager = new PooledRedisClientManager(host.Split(';'));
            }
        }
Example #37
0
        public TodoService()
        {
            #if DEBUG
            this._redisManager = new PooledRedisClientManager("localhost");
            #else
            this._redisManager = new PooledRedisClientManager("4lEL8GyQRI9grcsO1fm9URhsNBRxRD8pbHeBuvIeN7Q=@todo.redis.cache.windows.net:6379");
            #endif

            this._redis      = this._redisManager.GetClient();
            this._redisTodos = _redis.As <Todo>();
        }
Example #38
0
 public void Can_connect_to_ssl_azure_redis_with_PooledClientsManager()
 {
     using (var redisManager = new PooledRedisClientManager(connectionString))
         using (var client1 = redisManager.GetClient())
             using (var client2 = redisManager.GetClient())
             {
                 client1.Set("foo", "bar");
                 var foo = client2.GetValue("foo");
                 foo.Print();
             }
 }
        public void Can_recover_from_server_terminated_client_connection()
        {
            const int SleepHoldingClientMs = 5;
            const int SleepAfterReleasingClientMs = 0;
            const int loop = 1000;

            var admin = new RedisClient("localhost");
            admin.SetConfig("timeout", "0");
            var timeout = admin.GetConfig("timeout");
            timeout.Print("timeout: {0}");

            int remaining = loop;
            var stopwatch = Stopwatch.StartNew();

            var clientManager = new PooledRedisClientManager(new[] { "localhost" })
                {
                    
                };
            loop.Times(i =>
                {
                    ThreadPool.QueueUserWorkItem(x =>
                    {
                        try
                        {
                            using (var client = (RedisClient)clientManager.GetClient())
                            {
                                client.IncrementValue("key");
                                var val = client.Get<long>("key");
                                "#{0}, isConnected: {1}".Print(val, true); //client.IsSocketConnected()
                                Thread.Sleep(SleepHoldingClientMs);
                            }
                            Thread.Sleep(SleepAfterReleasingClientMs);
                        }
                        catch (Exception ex)
                        {
                            ex.Message.Print();
                        }
                        finally
                        {
                            remaining--;
                        }
                    });
                });

            while (remaining > 0)
            {
                Thread.Sleep(10);
            }
            "Elapsed time: {0}ms".Print(stopwatch.ElapsedMilliseconds);

            var managerStats = clientManager.GetStats();
            managerStats.PrintDump();
        }
        public void Can_connect_to_Slaves_and_Masters_with_Password()
        {
            var factory = new PooledRedisClientManager(
                readWriteHosts: new[] { "[email protected]:6379" },
                readOnlyHosts: new[] { "[email protected]:6380" });

            using (var readWrite = factory.GetClient())
            using (var readOnly = factory.GetReadOnlyClient())
            {
                readWrite.SetEntry("Foo", "Bar");
                var value = readOnly.GetEntry("Foo");

                Assert.That(value, Is.EqualTo("Bar"));
            }
        }
 public void Passwords_are_not_leaked_in_exception_messages()
 {
     const string password = "******";
     try
     {
         var factory = new PooledRedisClientManager(password + "@" + TestConfig.SingleHost); // redis will throw when using password and it's not configured
         using (var redis = factory.GetClient())
         {
             redis.SetEntry("Foo", "Bar");
         }
     }
     catch (RedisResponseException ex)
     {
         Assert.That(ex.Message, Is.Not.StringContaining(password));
         throw;
     }
 }
        public void Can_recover_from_server_terminated_client_connection()
        {
            const int loop = 200;

            var admin = new RedisClient("localhost");
            admin.SetConfig("timeout", "1");
            var timeout = admin.GetConfig("timeout");
            timeout.Print("timeout: {0}");

            int remaining = loop;

            var clientManager = new PooledRedisClientManager(new[] { "localhost" });
            loop.Times(i =>
                {
                    ThreadPool.QueueUserWorkItem(x =>
                    {
                        try
                        {
                            using (var client = clientManager.GetClient())
                            {
                                client.IncrementValue("key");
                                var val = client.Get<long>("key");
                                val.ToString().Print();
                                Thread.Sleep(2000);
                            }
                        }
                        catch (Exception ex)
                        {
                            ex.Message.Print();
                        }
                        finally 
                        {
                            remaining--;
                        }
                    });
                });

            while (remaining > 0)
            {
                Thread.Sleep(100);
            }
            
            var managerStats = clientManager.GetStats();
            managerStats.PrintDump();
        }
Example #43
0
        public void Does_set_all_properties_on_Client_using_ClientsManagers()
        {
            var connStr = "redis://*****:*****@host:1?ssl=true&db=0&connectTimeout=2&sendtimeout=3&receiveTimeout=4&idletimeoutsecs=5&NamespacePrefix=prefix.";
            var expected = "{Host:host,Port:1,Ssl:True,Client:nunit,Password:pass,Db:0,ConnectTimeout:2,SendTimeout:3,ReceiveTimeout:4,IdleTimeOutSecs:5,NamespacePrefix:prefix.}"
                .FromJsv<RedisEndpoint>();

            using (var pooledManager = new RedisManagerPool(connStr))
            {
                AssertClientManager(pooledManager, expected);
            }
            using (var pooledManager = new PooledRedisClientManager(connStr))
            {
                AssertClientManager(pooledManager, expected);
            }
            using (var basicManager = new BasicRedisClientManager(connStr))
            {
                AssertClientManager(basicManager, expected);
            }
        }
        public void Passwords_are_not_leaked_in_exception_messages()
        {            
            const string password = "******";

            Assert.Throws<ServiceStack.Redis.RedisResponseException>(() => {
                try
                {
                    var factory = new PooledRedisClientManager(password + "@" + TestConfig.SingleHost); // redis will throw when using password and it's not configured
                    using (var redis = factory.GetClient())
                    {
                        redis.SetEntry("Foo", "Bar");
                    }
                }
                catch (RedisResponseException ex)
                {
                    Assert.That(ex.Message, Is.Not.StringContaining(password));
                    throw;
                }
            },
	    "Expected an exception after Redis AUTH command; try using a password that doesn't match.");
        }
        public bool Can_connect_to_password_protected_redis_using_PooledRedisClientManager(string host)
        {

            try
            {
                var rPool = new PooledRedisClientManager(new List<string> { host }, new List<string> { host });

                rPool.GetClient();
                return true;
            }
            catch (Exception)
            {
                return false;
            }

        }
		public void Can_have_different_pool_size_and_host_configurations()
		{
			var writeHosts = new[] { "readwrite1" };
			var readHosts = new[] { "read1", "read2" };

			const int poolSizeMultiplier = 4;

			using (var manager = new PooledRedisClientManager(writeHosts, readHosts,
					new RedisClientManagerConfig {
						MaxWritePoolSize = writeHosts.Length * poolSizeMultiplier,
						MaxReadPoolSize = readHosts.Length * poolSizeMultiplier,
						AutoStart = true,
					}
				) {
					RedisClientFactory = mockFactory.Object,
				}
			)
			{
				//A poolsize of 4 will not block getting 4 clients
				using (var client1 = manager.GetClient())
				using (var client2 = manager.GetClient())
				using (var client3 = manager.GetClient())
				using (var client4 = manager.GetClient())
				{
					AssertClientHasHost(client1, writeHosts[0]);
					AssertClientHasHost(client2, writeHosts[0]);
					AssertClientHasHost(client3, writeHosts[0]);
					AssertClientHasHost(client4, writeHosts[0]);
				}

				//A poolsize of 8 will not block getting 8 clients
				using (var client1 = manager.GetReadOnlyClient())
				using (var client2 = manager.GetReadOnlyClient())
				using (var client3 = manager.GetReadOnlyClient())
				using (var client4 = manager.GetReadOnlyClient())
				using (var client5 = manager.GetReadOnlyClient())
				using (var client6 = manager.GetReadOnlyClient())
				using (var client7 = manager.GetReadOnlyClient())
				using (var client8 = manager.GetReadOnlyClient())
				{
					AssertClientHasHost(client1, readHosts[0]);
					AssertClientHasHost(client2, readHosts[1]);
					AssertClientHasHost(client3, readHosts[0]);
					AssertClientHasHost(client4, readHosts[1]);
					AssertClientHasHost(client5, readHosts[0]);
					AssertClientHasHost(client6, readHosts[1]);
					AssertClientHasHost(client7, readHosts[0]);
					AssertClientHasHost(client8, readHosts[1]);
				}

				mockFactory.VerifyAll();
			}
		}
 public void Can_change_db_for_client()
 {
     using (var db1 = new PooledRedisClientManager(1, new string[] { TestConfig.SingleHost }))
     using (var db2 = new PooledRedisClientManager(2, new string[] { TestConfig.SingleHost }))
     {
         var val = Environment.TickCount;
         var key = "test" + val;
         var db1c = db1.GetClient();
         var db2c = db2.GetClient();
         try
         {
             db1c.Set(key, val);
             Assert.That(db2c.Get<int>(key), Is.EqualTo(0));
             Assert.That(db1c.Get<int>(key), Is.EqualTo(val));
         }
         finally
         {
             db1c.Remove(key);
         }
     }
 }
Example #48
0
        public void SSL_can_support_64_threads_using_the_client_simultaneously()
        {
            var results = 100.Times(x => ModelWithFieldsOfDifferentTypes.Create(x));
            var testData = TypeSerializer.SerializeToString(results);

            var before = Stopwatch.GetTimestamp();

            const int noOfConcurrentClients = 64; //WaitHandle.WaitAll limit is <= 64

            var clientAsyncResults = new List<IAsyncResult>();
            using (var manager = new PooledRedisClientManager(TestConfig.MasterHosts, TestConfig.SlaveHosts))
            {
                manager.GetClient().Run(x => x.FlushAll());

                for (var i = 0; i < noOfConcurrentClients; i++)
                {
                    var clientNo = i;
                    var action = (Action)(() => UseClientAsync(manager, clientNo, testData));
                    clientAsyncResults.Add(action.BeginInvoke(null, null));
                }
            }

            WaitHandle.WaitAll(clientAsyncResults.ConvertAll(x => x.AsyncWaitHandle).ToArray());

            Debug.WriteLine(String.Format("Completed in {0} ticks", (Stopwatch.GetTimestamp() - before)));
        }
        public void Does_throw_TimeoutException_when_PoolTimeout_exceeded()
        {
            using (var manager = new PooledRedisClientManager(testReadWriteHosts, testReadOnlyHosts,
                new RedisClientManagerConfig
                {
                    MaxWritePoolSize = 4,
                    MaxReadPoolSize = 4,
                    AutoStart = false,
                }))
            {
                manager.PoolTimeout = 100;

                manager.Start();

                var masters = 4.Times(i => manager.GetClient());

                try
                {
                    manager.GetClient();
                    Assert.Fail("Should throw TimeoutException");
                }
                catch (TimeoutException ex)
                {
                    Assert.That(ex.Message, Is.StringStarting("Redis Timeout expired."));
                }

                var slaves = 4.Times(i => manager.GetReadOnlyClient());

                try
                {
                    manager.GetReadOnlyClient();
                    Assert.Fail("Should throw TimeoutException");
                }
                catch (TimeoutException ex)
                {
                    Assert.That(ex.Message, Is.StringStarting("Redis Timeout expired."));
                }
            }
        }
        public void PooledRedisClientManager_can_execute_CustomResolver()
        {
            var resolver = new FixedResolver(MasterHosts[0].ToRedisEndpoint(), SlaveHosts[0].ToRedisEndpoint());
            using (var redisManager = new PooledRedisClientManager("127.0.0.1:8888")
            {
                RedisResolver = resolver
            })
            {
                using (var master = redisManager.GetClient())
                {
                    Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                    master.SetValue("KEY", "1");
                }
                using (var master = redisManager.GetClient())
                {
                    Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                    master.Increment("KEY", 1);
                }
                Assert.That(resolver.NewClientsInitialized, Is.EqualTo(1));

                5.Times(i =>
                {
                    using (var slave = redisManager.GetReadOnlyClient())
                    {
                        Assert.That(slave.GetHostString(), Is.EqualTo(SlaveHosts[0]));
                        Assert.That(slave.GetValue("KEY"), Is.EqualTo("2"));
                    }
                });
                Assert.That(resolver.NewClientsInitialized, Is.EqualTo(2));

                redisManager.FailoverTo("127.0.0.1:9999", "127.0.0.1:9999");

                5.Times(i =>
                {
                    using (var master = redisManager.GetClient())
                    {
                        Assert.That(master.GetHostString(), Is.EqualTo(MasterHosts[0]));
                        Assert.That(master.GetValue("KEY"), Is.EqualTo("2"));
                    }
                    using (var slave = redisManager.GetReadOnlyClient())
                    {
                        Assert.That(slave.GetHostString(), Is.EqualTo(SlaveHosts[0]));
                        Assert.That(slave.GetValue("KEY"), Is.EqualTo("2"));
                    }
                });
                Assert.That(resolver.NewClientsInitialized, Is.EqualTo(4));
            }
        }
        public void Can_failover_MqServer_at_runtime()
        {
            const int iterations = 100;
            var failoverHost = "redis-failover:6379";
            var localClient = new RedisClient("localhost:6379");

            localClient.FlushDb();
            var failoverClient = new RedisClient(failoverHost);
            failoverClient.FlushDb();

            var clientManager = new PooledRedisClientManager(new[] { "localhost" });
            var mqHost = new RedisMqServer(clientManager);

            var map = new Dictionary<string, int>();
            var received = 0;
            mqHost.RegisterHandler<Msg>(c =>
            {
                var dto = c.GetBody();
                received++;
                int count;
                map.TryGetValue(dto.Host, out count);
                map[dto.Host] = count + 1;

                lock (clientManager)
                {
                    "Received #{0} from {1}".Print(received, dto.Host);
                    if (received == iterations)
                        Monitor.Pulse(clientManager);
                }

                return null;
            });

            mqHost.Start();

            RunMqInLoop(mqHost, iterations: iterations, callback: () =>
            {
                lock (clientManager)
                    "{0} msgs were published.".Print(iterations);
            });

            Thread.Sleep(500);

            clientManager.FailoverTo(failoverHost);

            lock (clientManager)
                Monitor.Wait(clientManager);

            map.PrintDump();
            "localclient inq: {0}, outq: {1}".Print(
                localClient.GetListCount("mq:Msg.inq"),
                localClient.GetListCount("mq:Msg.outq"));
            "failoverClient inq: {0}, outq: {1}".Print(
                failoverClient.GetListCount("mq:Msg.inq"),
                failoverClient.GetListCount("mq:Msg.outq"));

            Assert.That(received, Is.EqualTo(100));
            Assert.That(map.Count, Is.EqualTo(2));
            var msgsFromAllHosts = 0;
            foreach (var count in map.Values)
            {
                Assert.That(count, Is.GreaterThan(0));
                msgsFromAllHosts += count;
            }
            Assert.That(msgsFromAllHosts, Is.EqualTo(iterations));
        }
        public static bool RunInLoop(PooledRedisClientManager clientManager, int iterations = 100, int sleepMs = 10, Action callback=null)
        {
            int count = 0;
            int errors = 0;
            
            10.Times(i =>
            {
                ThreadPool.QueueUserWorkItem(_ =>
                {
                    while (Interlocked.Decrement(ref iterations) >= 0)
                    {
                        using (var client = clientManager.GetClient())
                        {
                            try
                            {
                                var result = client.Increment("test:failover", 1);
                                Interlocked.Increment(ref count);
                                if (count % (iterations / 10) == 0)
                                    lock (clientManager)
                                        Console.WriteLine("count: {0}, errors: {1}", count, errors);
                            }
                            catch (Exception ex)
                            {
                                Interlocked.Increment(ref errors);
                            }
                            Thread.Sleep(sleepMs);
                        }
                    }

                    if (callback != null)
                    {
                        callback();
                        callback = null;
                    }
                });
            });

            return true;
        }
        public void Can_failover_at_runtime()
        {
            var failoverHost = "redis-failover:6379";
            string key = "test:failover";

            var localClient = new RedisClient("localhost");
            localClient.Remove(key);
            var failoverClient = new RedisClient(failoverHost);
            failoverClient.Remove(key);

            var clientManager = new PooledRedisClientManager(new[] { "localhost" });

            RunInLoop(clientManager, callback:() =>
                {
                    lock (clientManager)
                        Monitor.Pulse(clientManager);
                });

            Thread.Sleep(100);

            clientManager.FailoverTo(failoverHost);

            lock (clientManager)
                Monitor.Wait(clientManager);

            var localIncr = localClient.Get<int>(key);
            var failoverIncr = failoverClient.Get<int>(key);
            Assert.That(localIncr, Is.GreaterThan(0));
            Assert.That(failoverIncr, Is.GreaterThan(0));
            Assert.That(localIncr + failoverIncr, Is.EqualTo(100));
        }