数据库相当于redis + rdbms

时间:2016-04-29 13:01:35

标签: database redis

我有一组存储json数据的键。在一段时间内,这些密钥经常被我的应用程序更新,但在此之后它们将过期,并且不会(或很少会)再次更新。
但是,需要在这些"键"上运行类似聚合的查询(例如SELECT SUM(value) FROM keys WHERE property1='...')。整个历史记录,包括过期密钥和当前密钥。

目前我使用redis + sqlite的组合。 Redis将当前密钥集存储在内存中。然后一个作业scan重新启动,将数据导出到sqlite 当我需要运行聚合查询时,我首先在sqlite上运行它,然后在scan redis上运行以获取其他值。

虽然这个组合似乎有用,但有一些烦恼:

  1. 需要维护两个单独的服务。如果由于某种原因redis停止工作或作业失败或sqlite表被破坏,我最终会处于未定义状态。

  2. 非均匀的api。我需要将查询分成几部分,一个用于sqlite,一个用于redis,单独运行它们,单独处理结果并将它们组合起来。

  3. 针对redis运行查询可能非常耗时,因为没有键的索引。调用keys会阻止服务器,调用scan通常会导致迭代次数过多。

  4. 是否有适合我需求的单一数据库?也许redis有一些配置选项?

1 个答案:

答案 0 :(得分:1)

此类操作应在发布Redis命令的应用程序层中开发,在某些情况下应使用Lua脚本编写。

如果您在Redis中以最佳方式对数据建模,您应该能够根据需要获取数据,以便稍后使用您选择的应用程序层语言(JavaScript,C#,Java,Python,Ruby)对其进行操作。 )。

  

对redis运行查询可能非常耗时,因为有   没有键的索引。调用键会阻塞服务器,调用扫描   通常会在太多的迭代中结束。

这是一个完全错误的陈述。 Redis 是索引本身。实际上,它就像直接使用索引一样。

您需要使用其内置数据结构来索引数据,以便能够对其进行分类,然后根据自定义应用程序层标准检索数据的子集。

  

是否有适合我需求的单一数据库?

也许你应该看看Cassandra。表格NoSQL数据库,具有聚合函数。或者Mongo。那里有很多选择但是没有它们会胜过Redis,这是迄今为止最快的一个(当用例非常适合Redis时,当然!)。