StackExchange.Redis和Azure Redis速度异常缓慢或引发超时错误

我正在将我现有的Azure角色内缓存使用的所有内容移动到Redis,并决定将Azure Redis预览与StackExchange.Redis库一起使用(https://github.com/StackExchange/StackExchange.Redis). 我为它编写了所有代码,没有太多问题,但在运行时,它的速度非常慢,并且经常抛出超时错误(我的超时时间设置为15秒)

以下是我如何设置Redis连接并将其用于简单操作的相关代码:

专用静态连接多路复用器\u缓存服务;
私有静态IDatabase_数据库;
私有静态对象_lock=新对象();
私有void初始化()
{
if(_cacheService==null)
{
锁
{
if(_cacheService==null)
{
var options=新配置选项();
options.EndPoints.Add(“{myurl}”,6380);
options.Ssl=true;
options.Password=“我的密码”;
//需要使用FLUSHDB命令
options.AllowAdmin=true;
//必要吗?
options.KeepAlive=30;
options.ConnectTimeout=15000;
options.SyncTimeout=15000;
int数据库=0;
_cacheService=ConnectionMultiplexer.Connect(选项);
_database=\u cacheService.GetDatabase(数据库);
}
}
}
}
公共无效集(字符串键、对象数据、TimeSpan?到期=null)
{
如果(_database!=null)
{
_数据库设置(键、数据、到期日:到期日);
}
}
公共对象获取(字符串键)
{
如果(_database!=null)
{
返回_database.Get(key);
}
返回null;
}

执行Get和Set等非常简单的命令通常会超时或需要5-10秒才能完成。如果它比实际从我的数据库中获取真实数据慢得多,那么它似乎否定了将其用作缓存的全部目的:)

我做了什么明显不正确的事吗

编辑:以下是我从服务器(使用Redis桌面管理器)中提取的一些统计数据,以防对任何事情有所帮助

服务器
redis_版本:2.8.12
redis_模式:独立
操作系统:Windows
拱形位:64
多路复用api:winsock\u IOCP
gcc_版本:0.0.0
流程识别号:2876
tcp_端口:6379
正常运行时间(秒):109909
正常运行时间(天):1
赫兹:10
lru_时钟:16072421
配置文件:C:\Resources\directory\xxxx.Kernel.localStore\1\redis\u 2092\u port6379.conf
客户
已连接的用户:5
客户端\u最长\u输出\u列表:0
客户端\u最大\u输入\u buf:0
客户端\u总\u写入\u未完成:0
客户端\u总数\u已发送\u字节\u未完成:0
已阻止的\u客户端:0
记忆力
已用内存:4256488
已用内存:4.06M
已用内存rss:67108864
已用内存rss人:64.00M
已用内存峰值:5469760
已用内存峰值人:5.22米
已用内存:33792
记忆碎片比率:15.77
内存分配器:dlmalloc-2.8
坚持不懈
加载:0
rdb_自上次保存后更改:72465
rdb_bgsave_正在进行:0
rdb_上次保存时间:1408471440
rdb_上次保存状态:ok
rdb\u上次\u bg保存时间\u秒:-1
rdb\u当前\u bgsave\u时间\u秒:-1
已启用aof_:0
aof_正在重写:0
计划的aof_重写_:0
aof\u上次\u重写\u时间\u秒:-1
aof\u当前\u重写\u时间\u秒:-1
aof_上次_bg重写_状态:确定
aof\u上次写入\u状态:ok
统计数据
收到的连接总数:25266
处理的命令总数:123389
每秒瞬时操作数:10
每秒接收字节数:275
每秒发送的字节数:65
每秒钟接收字节数:

edit2:下面是我用于Get/Set的扩展方法——它们是非常简单的方法,只需将对象转换为JSON并调用StringSet

公共静态对象Get(此IDatabase缓存,字符串键)
{
返回反序列化JSON<对象>(cache.StringGet(key));
}
公共静态无效集(此IDatabase缓存、字符串键、对象值、TimeSpan?expiry=null)
{
StringSet(key,SerializeJson(value),expiry:expiry);
}

编辑3:以下是几个示例错误消息:

StackExchange.Redis.dll中发生了类型为“System.TimeoutException”的首次意外异常
执行GET-MyCachedList时超时,指令:11,队列:1,qu=1,qs=0,qc=0,wr=0/1,in=0/0
StackExchange.Redis.dll中发生类型为“System.TimeoutException”的第一次意外异常
执行GET-MyCachedList时超时,指令:1,队列:97,qu=0,qs=97,qc=0,wr=0/0,in=3568/0

以下是Azure Redis缓存文档中推荐的模式:

私有静态延迟<连接多路复用器>lazyConnection=新的Lazy<连接多路复用器>(()=&gt{
返回ConnectionMultiplexer.Connect(“mycache.redis.cache.windows.net,abortConnect=false,ssl=true,password=…”;
});
公共静态连接多路复用器连接{
得到{
返回lazyConnection.Value;
}
}

有几点很重要:

  • 它使用Lazy<T>处理线程安全初始化的步骤
  • 它设置“abortConnect=false”,这意味着如果初始连接尝试失败,ConnectionMultiplexer将在后台默默重试,而不是抛出异常
  • 它不会检查IsConnected属性,因为如果连接断开,ConnectionMultiplexer将在后台自动重试

发表评论