C# 如何解决Redis的性能问题?
我正在使用C#client“StackExchange.Redis”对Redis进行基准测试。 数据集是一个包含近1600万条记录的文本文件。每个记录有六个条目,其中三个是双精度的,另外三个是整数。 当我使用LPush(api中的LPushRight)时,将所有数据添加到Redis需要将近4分钟的时间。 之后,当我使用(api中的LRange)检索数据时,检索所有列表几乎需要1.5分钟。 我正在使用以下代码: 连接: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
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万个元素的列表头添加元素的速度相同 这就是插入操作非常快的原因。该文件还继续: 缺点是什么?在这种情况下,通过索引访问元素的速度非常快 使用数组实现的列表(固定时间索引访问)和非 在由链表实现的列表中如此快速(其中 需要的工作量与所访问数据的索引成比例 元素) 如果您想要快速访问,文档进一步建议使用排序集: 当快速访问大量元素集合的中间部分非常重要时,则