使用StackExchange.Redis并行执行?

 灬丶领袖 发布于 2023-01-15 16:15

我有一个1M项目商店,List我正在序列化以插入Redis.(2.8)

我将10 Tasks<>每个部分的工作划分为自己的部分(List<>对于readonly是线程安全的(在List上执行多个读取操作是安全的)

简化:

例:

因为 ITEMS=100,THREADS=10每个人Task都会捕获自己的PAGE并处理相关范围.

对于exaple:

void Main()
{
    var ITEMS=100;
    var THREADS=10;
    var PAGE=4;

    List lst = Enumerable.Range(0,ITEMS).ToList();

    for (int i=0;i< ITEMS/THREADS ;i++)
    {
      lst[PAGE*(ITEMS/THREADS)+i].Dump();
    }
}

PAGE=0 将处理: 0,1,2,3,4,5,6,7,8,9

PAGE=4 将处理: 40,41,42,43,44,45,46,47,48,49

一切都好.

现在回到SE.redis.

我想实现这种模式,所以我做了 :(有ITEMS=1,000,000)

在此输入图像描述

我的测试:

(这是dbsize每秒检查):

在此输入图像描述

如您所见,通过10个线程添加了1M记录.

现在,我不知道它是否很快但是,当我将ITEMS 1M改为时10M- 事情变得非常缓慢并且我得到例外:

for循环中有例外.

未处理的异常:System.AggregateException:发生一个或多个错误.---

System.TimeoutException:在StackExchange.Redis上执行SET urn:user> 288257,inst:1,queu e:11,qu = 0,qs = 11,qc = 0,wr = 0/0,in = 0/0的超时. ConnectionMultiplexer.ExecuteSyncImpl [T](消息消息,ResultProcessor 1 processor, ServerEndPoint server) in c:\TeamCity\buildAgen t\work\58bc9a6df18a3782\StackExchange.Redis\StackExchange\Redis\ConnectionMultip lexer.cs:line 1722 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProces sor1处理器,ServerEndPoint服务器)位于c:\ TeamCity\buildAgent\work\58bc9a6df 18a3782\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:第79行...... . 按任意键继续 ...

题:

我的分工方式是正确的方式(最快)

如何让事情变得更快(非常感谢示例代码)

我该如何解决此异常?

相关信息:

存在于App.config中(否则我得到outOfmemoryException),也 - 为x64bit构建,我有16GB,ssd驱动器,i7 cpu).

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有