我打算将redis用作已经存在的数据库(MS SQL)的缓存。我想使用redis中的数据放在前端。我将在一天内处理大约100GB的大量数据。我将主要有一个包含时间值和一些计数器值(大约 10-100 列)的表。如果我要基于小时、天等对这些大量数据进行聚合,redis 将如何执行……(即基于时间列。)redis 是正确的方法还是有其他选择?与 RDBMS 相比,我不知道 nosql 在处理聚合时有多好。MonogoDB 在这种情况下会怎么做?
谢谢
我打算将redis用作已经存在的数据库(MS SQL)的缓存。我想使用redis中的数据放在前端。我将在一天内处理大约100GB的大量数据。我将主要有一个包含时间值和一些计数器值(大约 10-100 列)的表。如果我要基于小时、天等对这些大量数据进行聚合,redis 将如何执行……(即基于时间列。)redis 是正确的方法还是有其他选择?与 RDBMS 相比,我不知道 nosql 在处理聚合时有多好。MonogoDB 在这种情况下会怎么做?
谢谢
如果您需要存储 100Gb 并且您不希望您的数据集增长太多,请从 3 个 redis 实例开始,每个实例具有 64Gb 的 RAM,总共 192Gb,足以容纳您的数据集并有增长空间.
每个 redis 实例都将是一个主实例,因此您的数据将在实例之间平均分配。您需要使用简单的散列算法从应用程序层对实例进行分片,例如...
(from your application layer)
shardKey = "redis" + getShardKey( cacheKey);
redisConnection = getRedisConnectionByShardKey( shardKey);
//do work with redisConnection here
该函数getShardKey(string)
获取 cacheKey,将其转换为整数,然后根据 redis 实例的数量对其进行修改,返回 0、1 或 2。为每个 redis 实例配置一个连接池,为每个实例命名,如redis0
,redis1
等。 ,调用hash函数后,使用shard key获取目标redis实例的连接。获得所需数据后,在应用程序层进行聚合。
这是一种简单的方法;它在 redis 实例之间平均分配数据(或多或少),并避免将所有内容填充到单个 redis 实例中。Redis 是单线程的,所以如果你做大量的 I/O,你会受到 CPU 服务请求的速度的限制;使用多个实例会分配该负载。
当您的数据集超过 180Gb 时,此解决方案就会失效。如果您添加另一个 redis 实例以容纳更大的数据集,则必须更新哈希函数以反映模 4,而不是 3,并且您必须移动大部分数据,这很丑陋,因此仅在以下情况下使用此方法您 100% 确定数据集将保持在 150Gb 以下。