1、安装了一下Redis,有绿色版,很方便,配置也很简单;

2、试验了一下主从复制,效果没大规模进行,不是很了解,Master可以读写,但Slave只能读,利用这个性质可以进行读写分离,提高吞吐性能;

3、用C#(ServiceStack.Redis)访问了一下,没什么很特别的;

4、ServiceStack并不是传统意义上的线程安全,仅仅适用每个线程用自己的RedisClient才会安全,多个线程用同一个Client还是会有问题的。潜在问题当然是死锁。

5、Redis本身并不提供分布式,但只要进行简单封装,也很容易得到分布式效果,不过真正要做到好,高可靠也不是容易的事情,当然事情也不要想得过于复杂,适合就好。

using (RedisClient redisClient = new RedisClient(host, 6379))
            {
                //获取指定Key的值,没有为空null;

                string theV = redisClient.Get<string>(elementKey);
                this.textBox1.Text = theV;
                //设置一个Key-value对,Key存在则修改.
                //这个泛型封装是作者库里专门为C#类型做了转换,可以简化你的编程,Redis本身没有这么丰富的类型.
                redisClient.Set<string>("KeyAAA","sadfsdffdsa");
                
                //事务
                using (IRedisTransaction IRT = redisClient.CreateTransaction())
                {
                    try
                    {

                        IRT.QueueCommand(r => r.Set("keyA", 20));
                        IRT.QueueCommand(r => r.Increment("keyA", 1));
                        //注意,如果有下面这条语句,提交事务会报错,这说明启动事务后的
                        //Client操作都必须在IRT内调用.
                        //redisClient.Set<string>("KeyABC", "sadfsdffdsa");
                        
                        //throw new Exception("数据库操作错误!");
                        // 提交事务
                        IRT.Commit();
                    }
                    catch
                    {
                        IRT.Rollback();
                    }
                    //keyA不存在,但KeyABC的值存在.
                    string theV1 = redisClient.Get<int>("keyA").ToString();
                    string theV2 = redisClient.Get<string>("KeyABC");
                    
                    //并发锁
                    redisClient.Add("mykey", 1);
                    // 支持IRedisTypedClient和IRedisClient
                    //注意这里是Form调用,测试不出效果,如果是网页程序,则可获得锁效果.
                    using (redisClient.AcquireLock("testlock"))
                    {
                        var counter = redisClient.Get<int>("mykey");
                        Thread.Sleep(100);
                        redisClient.Set("mykey", counter + 1);
                    }

                }


            }