我有一组存储json数据的键。在一段时间内,这些密钥经常被我的应用程序更新,但在此之后它们将过期,并且不会(或很少会)再次更新。
但是,需要在这些"键"上运行类似聚合的查询(例如SELECT SUM(value) FROM keys WHERE property1='...'
)。整个历史记录,包括过期密钥和当前密钥。
目前我使用redis + sqlite的组合。 Redis将当前密钥集存储在内存中。然后一个作业scan
重新启动,将数据导出到sqlite
当我需要运行聚合查询时,我首先在sqlite上运行它,然后在scan
redis上运行以获取其他值。
虽然这个组合似乎有用,但有一些烦恼:
需要维护两个单独的服务。如果由于某种原因redis停止工作或作业失败或sqlite表被破坏,我最终会处于未定义状态。
非均匀的api。我需要将查询分成几部分,一个用于sqlite,一个用于redis,单独运行它们,单独处理结果并将它们组合起来。
针对redis运行查询可能非常耗时,因为没有键的索引。调用keys
会阻止服务器,调用scan
通常会导致迭代次数过多。
是否有适合我需求的单一数据库?也许redis有一些配置选项?
答案 0 :(得分:1)
此类操作应在发布Redis命令的应用程序层中开发,在某些情况下应使用Lua脚本编写。
如果您在Redis中以最佳方式对数据建模,您应该能够根据需要获取数据,以便稍后使用您选择的应用程序层语言(JavaScript,C#,Java,Python,Ruby)对其进行操作。 )。
对redis运行查询可能非常耗时,因为有 没有键的索引。调用键会阻塞服务器,调用扫描 通常会在太多的迭代中结束。
这是一个完全错误的陈述。 Redis 是索引本身。实际上,它就像直接使用索引一样。
您需要使用其内置数据结构来索引数据,以便能够对其进行分类,然后根据自定义应用程序层标准检索数据的子集。
是否有适合我需求的单一数据库?
也许你应该看看Cassandra。表格NoSQL数据库,具有聚合函数。或者Mongo。那里有很多选择但是没有它们会胜过Redis,这是迄今为止最快的一个(当用例非常适合Redis时,当然!)。