C#中的Redis客户端:使管道饱和?

时间:2016-05-02 08:33:40

标签: c# .net redis

我的C#代码中有几个组件在多线程上下文中读取和设置Redis中的键/值对。以下最小例子

using System;
using System.Threading;

//Uncomment one of these two
//using CSRedis;
using Sider;

namespace FailureTesting
{
    class UsingRedis
    {
        static RedisClient client = new RedisClient("localhost");

        static void Main(string[] args)
        {
            Thread read = new Thread(Reader);
            Thread set = new Thread(Setter);

            read.Start();
            set.Start();
        }

        static void Reader()
        {
            while(true)
            {
                client.Get("key");
            }
        }

        static void Setter()
        {
            while (true)
            {
                client.Set("key", "value");
            }
        }
    }
}

使用Additional information: Expecting a Bulk reply, got instead 69 reply抛出一个未处理的异常,这让我觉得C#和Redis之间的管道已经饱和。这种情况发生在我使用CSRedis或Sider之后。

另一方面,如果我使用第二个客户端,这是Setter方法的第二个管道,那么一切正常(设置static RedisClient client2 = new RedisClient("localhost");然后client2.Set(...)

最后,使用带有以下等效代码的StackExchange.Redis库

using System;
using System.Threading;

using StackExchange.Redis;
namespace FailureTesting
{
    class TestingSider
    {
        static IDatabase db = ConnectionMultiplexer.Connect("localhost:6379").GetDatabase();
        static void Main(string[] args)
        {
            Thread read = new Thread(Reader);
            Thread set = new Thread(Setter);

            read.Start();
            set.Start();
        }

        static void Reader()
        {
            while (true)
            {
                db.StringGet("key");
            }
        }

        static void Setter()
        {
            while (true)
            {
                db.StringSet("key", "value");
            }
        }
    }
}
然后一切顺利。我遇到的问题是StackExchange库只有.NET Framework 4.5支持,而我必须使用.Net Framework 4.0。

有人能给我一些关于这里发生的事情的见解吗?我不想在我的代码中放入锁或互斥,而Redis保证所有操作都是原子的......

0 个答案:

没有答案