tldr:使用c#redis stackexchange在任何文件大小上进行pop和push的性能都可能达到redis基准测试的30%
命令的执行
redisConnection.GetDatabase().ListRightPushAsync(endPointName, jsonData);
和
redisConnection.GetDatabase().ListLeftPopAsync(endPointName);
与cmd命令相比
redis-benchmark -c 1 -t lpush -d 3
redis-benchmark -c 1 -t spop -d 3
redis-benchmark -c 1 -t lpush -d 500000
redis-benchmark -c 1 -t spop -d 500000
从我们的应用程序中得到的数据远远低于redis benchmark命令在命令提示符中得到的数据。运行redis benchmark单线程每秒可以获得20000个项目,但是无论我们做什么,每秒6000个项目的数量都是我们的极限。当使用500kb的数据时,我们的性能下降到700推送和150 pop(每秒项目数),而redis仍然能够每秒获得20000 pop和2000推送项目数,单线程
我们试着在一个循环中运行,只是等待每个调用,我们试着创建多个循环来尝试多线程,无论我们尝试什么,我们都无法接近基准分数
for(int i = 0; i < requests; i++)
await redisConnection.GetDatabase().ListRightPushAsync(endPointName, jsonData);
或
for(int threads = 0; threads < threadCount; threads++)
taskList.add(Task.Run(AboveLoopMethod()));
或
for(int i = 0; i<requests; i++){
taskList.add(redisConnection.GetDatabase().ListRightPushAsync(endPointName, jsonData));
if(taskList.Count > maxConcurrentTasks)
await RemoveFirstCompletedTaskMethod(taskList);
}
没有任何方法能让我们接近redis基准测试分数,是因为redis堆栈交换客户端增加了开销,还是我需要做一些特定的事情来提高性能?我的redis客户端的设置是
var configOptions = new ConfigurationOptions();
configOptions.EndPoints.Add("127.0.0.1");
configOptions.ClientName = "SafeRedisConnection";
configOptions.ConnectTimeout = 100000;
configOptions.SyncTimeout = 100000;
configOptions.AbortOnConnectFail = false;
configOptions.Password = "";
configOptions.Ssl = false;
return configOptions;
这是我必须面对的问题,还是有办法提高绩效?或者是redis benchmark实际上在做一些我认为不应该做的事情,而我的性能统计是正常的?
其他可能相关或不相关的问题,我们确保在运行测试时没有其他任何东西在使用redis,我们尝试同时执行push和pop,并单独执行它们。另一个有趣的点是,文件大小随时间的变化曲线在理论上达到一百万个条目时几乎是完全线性的
如果我没有包括任何重要的,请让我知道
谢谢你的帮助
暂无答案!
目前还没有任何答案,快来回答吧!