Redis用于非常大的内存缓存

时间:2015-07-13 09:46:05

标签: node.js caching redis jedis

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

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

敌人制作钥匙我打算像下面那样使用

a)对象id - 长

b)时间长

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

所以最后的键看起来像;

objectid_time_propertyid

每15分钟我可能会得到大约5到6千万个密钥,每次将属性值转换为double时我需要获取这些密钥并应用公式(max / min / sum等)然后转换回String并存储背部。 所以我看到每个键都有一个读取,一个写入和转换。

我的问题随之而来。

  1. 建议将redis用于此类用例,我可以将每小时数据汇总至每日,每日汇总至每周等。
  2. 在缓存中读取和写入的性能是什么(我在Windows上进行了一次示例测试,100K密钥读取和写入需要30-40秒,这不是很好,但我在Windows上做了,我终于需要在linux上运行。
  3. 我想使用redis的持久性功能,它的优点和缺点是什么?
  4. 如果任何人有使用redis作为内存缓存的实际经验,需要经常更新,请提出建议。

1 个答案:

答案 0 :(得分:3)

  
      
  1. 建议将redis用于此类用例,我可以将每小时数据汇总至每日,每日汇总至每周等。
  2.   

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

但是,我建议您存储数据的方式略有不同。首先,Redis中的每个密钥都有一个开销,所以这些中的更多,你需要的内存越多。因此,我建议使用Hashes作为将某些值聚合在一起的方法,而不是按每个对象时间属性保留一个键。例如,您可以使用object_id:timestamp键并在其下存储property_id:value对。

此外,不是通过时间戳保持每个对象属性的4个离散度量并重新计算聚合,我建议您只保留聚合并使用新的度量更新这些度量。所以,你基本上有一个object_id哈希,具有以下结构:

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上运行。
  2.   

Redis,当我在Linux上的笔记本电脑上运行时,每秒执行超过500K的读写操作。性能非常依赖于您使用Redis的数据类型和API的方式。鉴于您在15分钟内的吞吐量达到了6000万,或者大约70,000 /秒的小数据写入,Redis已经无法满足要求。

  
      
  1. 我想使用redis的持久性功能,它的优点和缺点是什么?
  2.   

这是一个记录极为明确的主题 - 首先请参考http://redis.io/topics/persistencehttp://oldblog.antirez.com/post/redis-persistence-demystified.html