我打算使用redis作为现有数据库(MS SQL)的缓存。我想使用redis中的数据放入前端。我将处理大约100GB的大量数据。我将主要拥有一个包含时间值和一些计数器值(大约10-100列)的表。如果我要基于小时,天等对这些大量数据进行聚合,redis将如何执行....(即基于时间列。) redis是正确的做法还是有其他选择?与RDBMS相比,我不知道在处理aggreagation时nosql有多好。 MonogoDB在这种情况下会怎么做?
由于
答案 0 :(得分:4)
如果你需要存储100Gb并且你不希望你的数据集增长太多,那么从3个redis实例开始,每个实例有64Gb的RAM,总共192Gb,足以容纳你的数据集和成长的空间。
每个redis实例都是master,因此您的数据将在实例之间平均分配。您需要使用简单的散列算法对应用程序层中的实例进行分片,例如......
(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
等,在调用哈希函数后,使用分片键获取目标redis实例的连接。获得所需数据后,在应用程序层中进行聚合。
这是一种简单的方法;它在redis实例(或多或少)之间平均分配数据,并避免将所有内容填充到单个redis实例中。 Redis是单线程的,所以如果你做了很多I / O,你将受到cpu服务请求的速度的限制,使用多个实例分发负载。
当您的数据集超过180Gb时,此解决方案会崩溃。如果您添加另一个redis实例以容纳更大的数据集,则必须更新散列函数以反映模4而不是3,并且您将不得不移动大部分数据,这会变得很难看,所以只有在您100%确定数据集将保持在150Gb以下。