免责声明:我是Redis和StackExchange.Redis客户端的新手。
场景:我有一个使用ASP.NET Session State Provider for Azure Redis Cache的ASP.NET MVC网络应用。
这就像一个魅力!
现在,我的控制器调用我的服务层(它只是一个DLL引用,但有一天可能成为Web Api调用)。我正在尝试使用Autofac配置我的redis客户端,如下所示:
var redis = ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["redis.connectionstring"]);
builder.RegisterInstance(redis).AsSelf().SingleInstance();
builder.RegisterType<RedisCacheClient>().As<ICacheClient>().WithParameter("db", redis.GetDatabase());
连接设置成功,当我在 redis-cli.exe 上运行客户端列表时,我可以看到一个新客户端。
我的RedisCacheClient类只是IDatabase上的一个瘦包装器:
public void Add(string key, object value)
{
_db.StringSet(key, Serialize(value));
}
public T Get<T>(string key)
{
byte[] buffer = _db.StringGet(key);
T o = Deserialize<T>(buffer);
return o;
}
private static byte[] Serialize(object o)
{
if (o == null)
{
throw new ArgumentNullException("Cannot cache null values.");
}
var binaryFormatter = new BinaryFormatter();
using (var memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, o);
byte[] buffer = memoryStream.ToArray();
return buffer;
}
}
private static T Deserialize<T>(byte[] stream)
{
if (stream == null)
{
return default(T);
}
var binaryFormatter = new BinaryFormatter();
using (var memoryStream = new MemoryStream(stream))
{
T result = (T)binaryFormatter.Deserialize(memoryStream);
return result;
}
}
问题:我可以成功存储对象,但永远无法检索!无论我做什么,我都会不断获得连接超时(当前超时为30秒)。 我花了最后4个小时试图解决这个问题并且没有运气。真的很挣扎:(
Timeout performing SET {Key}, inst: 0, mgr: Inactive, queue: 2, qu=1, qs=1, qc=0, wr=1/1, in=0/0
StackExchange.Redis with Azure Redis is unusably slow or throws timeout errors
Azure Redis cache - timeouts on GET calls
https://github.com/StackExchange/StackExchange.Redis/issues/122
https://github.com/StackExchange/StackExchange.Redis/issues/83
P.S:我在本地或天蓝色的地方运行它的行为非常相同。
答案 0 :(得分:0)
尽管我真的不喜欢这个,但我不得不说这个问题早已不复存在,我 不明白为什么。 我认为这是与我的设置有关的某种间歇性问题(MacBook Pro在并行VM上运行Windows),有时可能会使Redis拒绝或不处理其队列中的项目。嗯,这是我唯一可以提出的,因为我已经运行了相同的软件几天,并没有任何问题。