我有一个随机数的锯齿状数组(1M x 100
):
0 --->[ 100 random numbers]
1 --->[ 100 random numbers]
2 --->[ 100 random numbers]
.. --->[ 100 random numbers]
.. --->[ 100 random numbers]
1M --->[ 100 random numbers]
那些100 random numbers
是图像ID,我需要将它们映射到userId(0..1M
)
我想将它们存储在Redis中。 (via Hash since I know that Hashes are stored very efficiently in Redis — it's also how instagram used it in order to solve similar problem)
Jagged数组:
int b = 1000000;
int[ ][] Friends = new int[b][];
(一切都好。)
随机数的初始化:
for (int i = 0; i < b; i++)
{
Friends[i] = ParallelEnumerable.Range(0, 100).Select(n => appRandom.Value.Next(1, b )).ToArray();
}
(一切都好。)
以下是我如何使用Redis客户端输入值:(I use 1000 buckets optimization method)
using (IRedisClient redisClient = new RedisClient(host))
{
for (int i = 0; i < Friends.Length; i++)
{
for (int j = 0; j < 100; j++)
redisClient.SetEntryInHash("urn:buck>" + (i / 1000), Friends[i][j].ToString(),i.ToString());
}
}
问题:
插入阶段(我不关心初始化时间) - 现在超过一小时仍然没有25%
!
相关信息:
我有一台功能强大的电脑:(赢8),还添加了<gcAllowVeryLargeObjects enabled="true" />
问题:
(相关信息:这100个数字是我需要将它们映射到userId的图片ID)
答案 0 :(得分:4)
请阅读http://redis.io/topics/benchmarks
您的性能瓶颈可能与您的应用程序和redis服务器之间的往返次数有关。您需要使用流水线操作,或使用并发连接或两者,以便最大化吞吐量。
请参阅以下流水线使用示例: https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests/ServiceStack.Redis.Tests/RedisPipelineTests.cs
最后一点:Windows肯定不是从Redis获得最佳性能的最佳平台,而C#不是实现非常高吞吐量的最佳语言。