Redis插入哈希非常(!)慢?

时间:2014-05-11 07:09:40

标签: c# performance redis .net-4.5 servicestack.redis

我有一个随机数的锯齿状数组(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" />

enter image description here

问题:

  • 我做错了什么,如何让插入更快?

(相关信息:这100个数字是我需要将它们映射到userId的图片ID)

1 个答案:

答案 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#不是实现非常高吞吐量的最佳语言。