1

我有一个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是我需要将它们映射到 userId 的图像 ID(即0..1M

我想将它们存储在 Redis 中。(通过哈希,因为我知道哈希在 Redis 中非常有效地存储——这也是instagram使用它来解决类似问题的方式


锯齿状数组:

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 客户端输入值:(我使用 1000 桶优化方法

  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%

相关资料:

我有一台功能强大的电脑:(win 8),还添加了<gcAllowVeryLargeObjects enabled="true" />

在此处输入图像描述

问题 :

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

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

4

1 回答 1

4

请阅读http://redis.io/topics/benchmarks

您的性能瓶颈可能与您的应用程序和 redis 服务器之间的往返次数有关。您需要使用流水线,或使用并发连接,或两者兼而有之,以最大限度地提高吞吐量。

请参阅流水线使用示例: https ://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests/ServiceStack.Redis.Tests/RedisPipelineTests.cs

最后一点:Windows 肯定不是从 Redis 获得最佳性能的最佳平台,C# 也不是实现非常高吞吐量的最佳语言。

于 2014-05-11T08:36:11.597 回答