【问题标题】:Usage of Redis for very large memory cacheRedis 用于超大内存缓存
【发布时间】:2015-10-01 12:36:39
【问题描述】:

我打算考虑使用 Redis 在缓存中存储大量数据。目前我将它们存储在我自己用java编写的缓存中。我的用例如下。

我从一个来源获得 15 分钟的数据,我需要每小时汇总一次数据。因此,对于给定的对象 A,每小时我会得到 4 个值,我需要将它们聚合为一个值,我将使用的公式将是 max / min / sum。

我打算像下面这样使用敌人制造钥匙

a) 对象 id - 长

b) 时间 - 长

c) 属性 id - int(每个对象可能有很多属性,我需要为每个属性分别聚合)

所以最终键看起来像;

objectid_time_propertyid

每 15 分钟我可能会得到大约 50 到 6000 万个键,每次将属性值转换为双倍并应用公式(最大/最小/总和等)然后转换回字符串并存储时,我都需要获取这些键背部。 因此,我看到每个键在每种情况下都有一个读取和一个写入和转换。

我的问题如下。

  1. 建议将 redis 用于此类用例,今后我可能会将每小时数据汇总到每天、每天到每周等等。
  2. 缓存中读取和写入的性能如何(我在 Windows 上做了一个示例测试,100K 键读取和写入花费了 30-40 秒,这不是很好,但我在 windows 上做了,我最终需要在 linux 上运行。
  3. 我想用redis的持久化功能,有什么优缺点?

如果有人真正使用redis作为memcache需要经常更新,请给个建议。

【问题讨论】:

  • 上述情况并不少见,而redis非常适合此类任务。一个重要的限制 - 是 RAM。 6000万个按键粗略计算需要12GB左右的RAM。并且您需要更多内存来正常运行其他系统(如果它不是redis的专用服务器)。或许提高生产力就是尝试在redis的服务端脚本中移动部分逻辑。并且还要考虑跨多个物理服务器对数据进行分区。
  • 是的,你是对的,我需要关心 RAM,所以我正在考虑减少数据大小的方法。 Redis 是否将数据以压缩形式存储在内存和磁盘中,是否可以在不影响性能的情况下进行设置。

标签: node.js caching redis jedis


【解决方案1】:
  1. 建议将 redis 用于此类用例,今后我可能会将每小时数据汇总到每天、每天到每周等等。

建议取决于你问谁,但我当然认为 Redis 可以胜任这项工作。如果单个服务器还不够,您的描述表明数据集可以轻松分片,因此集群可以让您扩展。

不过,我建议您存储数据的方式稍有不同。首先,Redis 中的每个键都有开销,因此这些键越多,您需要的 RAM 就越多。因此,我建议不要为每个对象时间属性保留一个键,而是将哈希作为一种将一些值聚合在一起的方法。例如,您可以使用 object_id:timestamp 键并将 property_id:value 对存储在其下。

此外,我建议您仅保留聚合并使用新的测量值更新它们,而不是按时间戳为每个对象属性保留 4 个离散测量值并重新计算您的聚合。所以,你基本上会有一个object_id Hash,结构如下:

object_id:hourtimestamp  ->  property_id1:max = x
                             property_id1:min = y
                             property id1:sum = z

当获取新数据 - d - 对象的属性时,只需重新计算聚合:

property_id1:max = max(x, d)
property_id1:min = min(y, d)
property_id1:sum = z + d

对所需的每个分辨率重复相同的操作,例如使用object_id:daytimestamp 保存日级聚合。

最后,不要忘记在不再需要密钥后使它们过期(即为每小时计数器设置 24 小时 TTL 等等)。

还有其他可能的方法,主要是使用排序集,可适用于解决您的查询需求(请记住,存储数据是容易的部分 - 取回数据通常更难;))。

  1. 缓存中读取和写入的性能如何(我在 Windows 上做了一个示例测试,100K 键读取和写入花费了 30-40 秒,这不是很好,但我在 windows 上做了,我最终需要在 linux 上运行。

Redis 在我的笔记本电脑上的 Linux 虚拟机上运行时,每秒执行超过 500K 的读取和写入操作。性能很大程度上取决于您如何使用 Redis 的数据类型和 API。考虑到您在 15 分钟内的 6000 万个值的吞吐量,或者大约 70K/秒的小数据写入,Redis 完全有能力处理这个问题。

  1. 想用redis的持久化功能,有什么优缺点?

这是一个非常有据可查的主题 - 初学者请参阅 http://redis.io/topics/persistencehttp://oldblog.antirez.com/post/redis-persistence-demystified.html

【讨论】:

  • @Haber ,非常感谢。我打算将值用作 Map ,其中键是属性 ID 和属性值。现在我的数据将作为资源 id、时间戳、属性 id 和值到达。因此,每次有新数据出现时,我都需要获取密钥并获取当前值再次计算属性值并重置哈希图。我有点担心没有。我需要做的查询和更新。延迟是我计划选择 Redis 的一个重要因素,所以我应该在 9:05 之前 8:00 、 8:15 、 8:30 和 8:45 时间点数据(8:45 的最后一个数据可能是 9: 00)。我打算做一些测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2016-03-29
  • 2016-08-28
  • 2014-11-06
  • 2021-10-14
相关资源
最近更新 更多