【问题标题】:Redis as a cache for RDBMSRedis 作为 RDBMS 的缓存
【发布时间】:2013-04-16 15:01:12
【问题描述】:

我打算使用 redis 作为现有数据库(MS SQL)的缓存。我想使用 redis 中的数据放入前端。我将处理大约 100GB 的大量数据一天。我将主要有一个包含时间值和一些计数器值(大约 10-100 列)的表。如果我要基于小时、天等对这些大量数据进行聚合,redis 将如何执行......(即基于时间列。) redis 是正确的方法还是有其他选择?与 RDBMS 相比,我不知道 nosql 在处理聚合时有多好。 MonogoDB 在这种情况下会怎么做?

谢谢

【问题讨论】:

  • 您是将所有数据转储到 Redis(可能是个坏主意)还是编写一个将一些数据放入 Redis 并在一段时间后过期的包装器。另外,我正在等待这个问题的答案,如果 Redis 是最好的方法。
  • 我将保存数据最长 1 个月。
  • 请记住,您必须将存储在 redis 中的所有数据放入 RAM 中
  • 是的,这就是为什么在生产中,非常昂贵
  • @brainOverflow 是的,但是有一些方法可以节省 redis 的空间。在我们公司,我们主要将数据存储在字符串/值对和排序集中;在这两种情况下,我们都使用 MessagePack 在存储到 redis 之前对数据进行序列化。根据我们的测试,使用 MessagePack 在 redis 中将 1Gb 的数据压缩到 250Mb。

标签: sql-server caching nosql redis aggregate-functions


【解决方案1】:

如果您需要存储 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实例配置一个连接池,给每个redis实例一个名称如redis0redis1等,调用hash函数后,使用shard key获取目标redis实例的连接。获得所需数据后,在应用层进行聚合。

这是一个简单的方法;它在 redis 实例之间平均分配数据(或多或少),并避免将所有内容填充到单个 redis 实例中。 Redis 是单线程的,所以如果你做大量的 I/O,你会受到 CPU 服务请求的速度的限制;使用多个实例会分配负载。

当您的数据集超过 180Gb 时,此解决方案就会失效。如果您添加另一个 redis 实例以容纳更大的数据集,则必须更新哈希函数以反映模 4,而不是 3,并且您必须移动大部分数据,这很丑陋,因此仅在以下情况下使用此方法您 100% 确定数据集将保持在 150Gb 以下。

【讨论】:

  • +1 供您输入:There are methods by which to conserve space in redis. At our firm, we store data mostly in string/value pairs and sorted sets; in both cases, we use MessagePack to serialize data before storing in redis. Based on our tests, 1Gb of data compresses down to 250Mb in redis with MessagePack.
猜你喜欢
  • 2015-12-04
  • 2015-06-07
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
相关资源
最近更新 更多