我正在使用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适用于这种数据集吗?
答案 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 如此快速在链表实现的列表中(操作的位置) 需要与所访问的索引成比例的工作量 元素)。
如果您想要快速访问,该文档还建议使用分类集:
当快速访问大量元素集合的中间位置很重要时,可以使用不同的数据结构,称为排序集。排序集将在本教程后面介绍。