我正在研究是否使用 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?