Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决Redis的性能问题?_C#_Redis_Stackexchange.redis - Fatal编程技术网

C# 如何解决Redis的性能问题?

C# 如何解决Redis的性能问题?,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我正在使用C#client“StackExchange.Redis”对Redis进行基准测试。 数据集是一个包含近1600万条记录的文本文件。每个记录有六个条目,其中三个是双精度的,另外三个是整数。 当我使用LPush(api中的LPushRight)时,将所有数据添加到Redis需要将近4分钟的时间。 之后,当我使用(api中的LRange)检索数据时,检索所有列表几乎需要1.5分钟。 我正在使用以下代码: 连接: ConnectionMultiplexer redis = Connectio

我正在使用C#client“StackExchange.Redis”对Redis进行基准测试。 数据集是一个包含近1600万条记录的文本文件。每个记录有六个条目,其中三个是双精度的,另外三个是整数。 当我使用LPush(api中的LPushRight)时,将所有数据添加到Redis需要将近4分钟的时间。 之后,当我使用(api中的LRange)检索数据时,检索所有列表几乎需要1.5分钟。 我正在使用以下代码:

连接:

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();
插入:

IEnumerable<string> lines =
File.ReadLines(@"C:\Hep.xyz");
    List<string> linesList = lines.ToList();
    int count = lines.Count();
    string[] toks;
    RedisValue[] redisToks = { "", "", "", "", "", "" };
    for (int i = 0; i < count; i++)
    {
         toks = linesList[i].Split(' ', '\t');
         for (int j = 0; j < 6; j++)
         {
                redisToks[j] = toks[j];
         }
         db.ListRightPushAsync("PS:DATA:", redisToks);
         if (i % 1000000 == 0)
         {
              Console.WriteLine("Lines Read: {0}", i);
         }
    }
    Console.WriteLine("Press any key to continue ...");
    Console.ReadLine();
IEnumerable行=
ReadLines(@“C:\Hep.xyz”);
List linesList=lines.ToList();
int count=lines.count();
字符串[]toks;
RedisValue[]redisToks={“”、“”、“”、“”、“”、“”、“”};
for(int i=0;i
检索:

long len  = db.ListLength("PS:DATA:");

long start = 0;
long end = 99999;
while (end < len)
{
      RedisValue[] val = db.ListRange("PS:DATA:", start, end);
      int length = val.Length;
      start += 100000;
      end += 100000;
}
Console.WriteLine("Press any key to continue ...");
Console.ReadLine();
long len=db.ListLength(“PS:DATA:”);
长启动=0;
长端=99999;
while(end
对于配置:

我已将maxmemory设置为4GB,并将maxmemory策略设置为易失性lru

我正在我的系统上本地运行所有这些。我的系统规格是 8GB内存 内核间i7-5500U CPU@2.4GHz(4个CPU),~2.4 GHz


你能帮我确定我需要调查的因素,以提高绩效吗。另外,redis是否适合这种数据集?

这不是因为redis速度慢。因为将数据保存到redis时,时间成本还包括文件io(磁盘io)和网络io,特别是从磁盘文件读取行的时间,这需要很大的时间成本。因此,当您从redis检索数据时,所需时间仅为1.5分钟,而插入数据时所需时间约为4分钟

总之,redis在您的案例中运行良好。加快插入速度的另一件事是,您可以使用redis管道来减少网络传输时间

异步写入与管道不同。但是您应该注意到,异步写入并不会阻塞客户机。但是,管道正在批发送命令和批读取回复。所以它是不同的


请参见这不仅仅是RTT的问题。流水线还可以保存redis服务器的读()和写()时间。

这不是因为redis速度慢造成的。因为将数据保存到redis时,时间成本还包括文件io(磁盘io)和网络io,特别是从磁盘文件读取行的时间,这需要很大的时间成本。因此,当您从redis检索数据时,所需时间仅为1.5分钟,而插入数据时所需时间约为4分钟

总之,redis在您的案例中运行良好。加快插入速度的另一件事是,您可以使用redis管道来减少网络传输时间

异步写入与管道不同。但是您应该注意到,异步写入并不会阻塞客户机。但是,管道正在批发送命令和批读取回复。所以它是不同的


请参见这不仅仅是RTT的问题。管道化还可以节省redis服务器的读写时间。

是的,您面临的是redis官方网站中提到的问题:

Redis列表是通过链表实现的。这意味着,即使列表中有数百万个元素,在列表的开头或结尾添加新元素的操作也会在固定时间内执行。使用LPUSH命令向包含10个元素的列表头添加新元素的速度与向包含1000万个元素的列表头添加元素的速度相同

这就是插入操作非常快的原因。该文件还继续:

缺点是什么?在这种情况下,通过索引访问元素的速度非常快 使用数组实现的列表(固定时间索引访问)和非 在由链表实现的列表中如此快速(其中 需要的工作量与所访问数据的索引成比例 元素)

如果您想要快速访问,文档进一步建议使用排序集:

当快速访问大量元素集合的中间部分非常重要时,可以使用不同的数据结构,称为排序集。本教程稍后将介绍排序集


是的,你面临的是Redis官方网站上提到的问题:

Redis列表是通过链表实现的。这意味着,即使列表中有数百万个元素,在列表的开头或结尾添加新元素的操作也会在固定时间内执行。使用LPUSH命令向包含10个元素的列表头添加新元素的速度与向包含1000万个元素的列表头添加元素的速度相同

这就是插入操作非常快的原因。该文件还继续:

缺点是什么?在这种情况下,通过索引访问元素的速度非常快 使用数组实现的列表(固定时间索引访问)和非 在由链表实现的列表中如此快速(其中 需要的工作量与所访问数据的索引成比例 元素)

如果您想要快速访问,文档进一步建议使用排序集:

当快速访问大量元素集合的中间部分非常重要时,则