2

我正在研究是否使用 Redis 缓存大型数据集。

最大的数据集包含大约 500 万个对象。尽管每个对象都有一个唯一的标识符,但客户端永远不会单独使用它们;对整个数据集执行聚合和连接操作。

目标环境是 4 台服务器,每台服务器配备 144 Gb 内存、24 核和千兆网卡 - 运行 Windows 2008 R2 企业版。为此,我在每个盒子上安装了 10 个来自 Microsoft Open Technologies 的 Redis-64.2.6.12.1 实例。我正在使用 ServiceStack 的 Redis 客户端。

我已将数据分片为 1000 个对象的块(这似乎提供了最佳性能),并使用 ShardedRedisClientManager 对每个块 id 进行散列以将数据分布在 40 个缓存中。对象映射被持久化,以便客户端应用程序可以仅使用数据集 id 继续检索所有对象。Redis 列表用于对象和对象映射。

事务并没有提高性能,但是通过按连接对卡盘进行分组,并行处理确实提高了性能。然而,表现仍然不尽如人意。设置然后获得 5m 个对象加上对象映射的最佳时间是 268055 毫秒。

那么,有没有更好的方法来使用 Redis 缓存大型数据集?缓存这样的数据集是否合理?我是否应该将序列化到磁盘并将处理移至数据ala hadoop?

4

1 回答 1

1

问题不在于 Redis 是否适合大型数据集,而在于您的数据集和用例是否适合 Redis。

Redis 本质上允许您维护分布式计算机科学集合,并让您以线程安全的原子方式以每种数据集合类型允许的最佳 Big O 表示法性能访问和交互它们。

网络往返和带宽延迟以及数据访问模式

Redis 可能很快,但它仍然受到网络延迟和最佳数据存储和访问模式的限制,例如,您仍然需要关注所需的网络往返次数和带宽,无论您的数据访问是否需要全表扫描或者可以通过自定义索引和您正在使用的序列化库的性能开销来减少。

  • 您需要全表数据扫描还是可以维护自定义索引
  • 您需要传输整个数据集吗?
  • 您能否利用服务器端 LUA 操作来最大程度地减少往返行程并减少带宽?

您应该改用 Blob 存储吗?

每次都希望传输整个 DataSet 似乎很奇怪,这可能表明您不应该维护数据集并将其逐项列出到 Redis 服务器集合中。如果您只是在客户端访问和操作数据集,那么将数据存储到 Redis 集合中并没有真正的好处。

如果您的用例是我可以将 5M 对象水合到内存中的 .NET 数据结构中的最快方法,那么这只是将整个数据集作为 blob 存储到单个 GET/SET 条目中二进制格式,如 ProtoBuf 或 MessagePack。通过这种方式,Redis 仅充当快速的内存 blob 存储。如果对数据存储的访问不需要分布式(即通过网络访问),那么像Level DB这样的快速嵌入式数据存储会更理想。

跨多个复制或分片的 redis 服务器分布和分块数据集

为了获得最佳性能,您可以更进一步并使用GETRANGE/SETRANGE从多个复制的 redis 服务器读取块,或者只是将序列化的二进制 blob 块化到多个分片的 redis 服务器 - 尽管这意味着块本身没有它们的整个聚合是无用的,所以损坏的块将使整个数据集无效。

于 2013-06-16T23:21:07.240 回答