【问题标题】:Database equivalent to redis + rdbms相当于redis + rdbms的数据库
【发布时间】:2016-04-29 13:01:34
【问题描述】:

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

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

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

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

  2. 非统一的 API。我需要将查询分成几部分,一份用于sqlite,一份用于redis,分别运行,分别处理结果并将它们组合起来。

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

是否有一个数据库可以满足我的需求?也许redis有一些配置选项?

【问题讨论】:

    标签: database redis


    【解决方案1】:

    此类操作应在应用层发出 Redis 命令进行开发,并且在某些情况下使用 Lua 脚本。

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

    对 redis 运行查询可能会很耗时,因为有 没有键的索引。调用keys阻塞服务器,调用scan 通常以太多的迭代而告终。

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

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

    是否有一个数据库可以满足我的需求?

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

    【讨论】:

    • 您能否更详细地描述或提供有关如何“在 Redis 中以最佳方式对我的数据建模”和“使用其内置数据结构来索引您的数据以便能够分类的链接”它”?我使用 redis 作为键值存储。也许我错了,键上有索引,但是通过keys xyz* 的模式搜索大约需要 2 秒,在此期间服务器被阻止。如果我使用scan 0 xyz*,遍历所有键大约需要 50 秒。
    • @xaxa 似乎您忽略了 Redis 键可以存储集合、列表、哈希...您不仅限于字符串键。例如,请参阅此问答,我自己自动回答了我的问题:stackoverflow.com/questions/19066462/…
    • @xaxa 关于如何对数据进行建模没有明确的答案,但请看一下:redis.io/topics/data-types-intro
    • 不,我不是在存储字符串,而是在存储哈希值(hsethget 等)。但是,redis 既不能将 hash 存储在 hash 中,也不能使用 hash 作为键名(仅限字符串)。
    • @xaxa 这是您需要进入使用 Redis 中可用工具对数据进行建模并在检索数据时仍然高效的精彩世界的时候。正如我之前在一些评论中所说,您的问题没有明确的答案。您需要使用这些数据结构以多种方式索引您的数据,然后高效地访问您的数据。
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多