我的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保证所有操作都是原子的......