如何解决Redis性能问题?

时间:2017-08-21 19:57:02

标签: c# redis stackexchange.redis

我正在使用C#客户端“StackExchange.Redis”来对Redis进行基准测试。 数据集是一个接近1600万条记录的文本文件。每条记录有六个条目,其中三个是双,另外三个是整数。 当我使用LPush(api中的LPushRight)时,将所有数据添加到Redis需要将近4分钟。 之后,当我使用(LRange in api)检索数据时,检索所有列表大约需要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();

检索:

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();

对于配置:

我已将 maxmemory 设置为 4GB ,将 maxmemory-policy 设置为 volatile-lru

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

请您帮我确定一下我需要考虑的因素,以提高效果。另外,redis适用于这种数据集吗?

2 个答案:

答案 0 :(得分:0)

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

总之,redis适用于您的情况。加速插入的另一件事是你可以使用redis管道来减少网络传输时间。

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

请参阅https://redis.io/topics/pipelining 这不仅仅是RTT 部分。流水线保存redis服务器read()和write()时间。

答案 1 :(得分:0)

是的,您遇到的问题是Redis官方网站documentation中提到的问题:

  

Redis列表通过链接列表实现。这意味着即使列表中有数百万个元素,也会在常量时间内在列表的头部或尾部添加新元素。使用LPUSH命令将新元素添加到包含十个元素的列表头部的速度与使用1000万个元素向列表头部添加元素相同。

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

  

有什么缺点?通过索引访问元素非常快   使用Array实现的列表(常量时间索引访问)和 not   如此快速在链表实现的列表中(操作的位置)   需要与所访问的索引成比例的工作量   元素)。

如果您想要快速访问,该文档还建议使用分类集:

  

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