【问题标题】:Storing data in Redis and/or relational database在 Redis 和/或关系数据库中存储数据
【发布时间】:2012-02-21 14:47:45
【问题描述】:

我在 Redis 中存储了大约 50,000 个 json 对象。 这适用于通过唯一键查找对象的主要用例。

我现在必须添加一项功能,以根据基于对象数据的复杂查询来搜索对象。例如,在 2011 年 3 月 1 日至 2012 年 1 月 12 日之间发布的所有作者为“lex”的项目,库存超过 5 件。

使用 SQL,这很简单。 我对 Redis 不是很了解,但没见过这样的东西。

所以我想有一个小型关系数据库来存储 Redis 键和我需要搜索的数据。当需要复杂的查询时,我点击 SQL 并获取一组键以退出 Redis。

我拥有的数据很少更改,我会知道何时以及发生了什么变化。所以我可以在更新时将数据导入到 rmdb 和 Redis 中。

这种方法是个好主意吗?

【问题讨论】:

  • 为什么不完全切换到关系数据库? 50k 个对象不算什么,任何数据库都会处理。
  • 如果你还想存储JSON,我推荐MongoDB
  • 我有 json 格式的数据,我将它提供给其他需要 json 格式的程序。当它只是一个键值查找时,让一个 db 将其映射到表然后将其重建回 json 似乎很奇怪。
  • 使用mongodb,它存储JSON并有索引。
  • 听起来很有趣,我会看看这个。

标签: relational-database redis


【解决方案1】:

查询是动态的吗?因为您可以在 Redis 中构建结构来执行您所描述的查询。例如,使用有序集作为时间,有另一个有序集作为库存编号,查询并相交它们。如果你清楚地知道你想运行什么搜索,你可以让 Redis 为你做的非常快。如果查询一直在变化(使用数据、分析数据等),那么这不是一个很好的解决方案。

所以为了存储一些东西

set key object1

zadd time_set object1.time object1
zadd inventory_set object1.inventory object1

查询时间和库存

zrangebyscore time_set min_time max_time
zrangebyscore inventory_set min_inventory max_inventory

Then you intersect them yourself, since results are just ids this is really fast. Once you intersected them just do an

mget item1, item 2...

一般来说,当您确切知道您将在其上运行哪些查询时,Redis 会运行良好。

【讨论】:

    【解决方案2】:

    您需要的是文档数据库(NoSQL 的优势之一)。

    正如@Sergio 建议的那样,MongoDB 就是其中之一。还有其他(CouchDBRavenDB 等等),您必须检查一下哪个最适合您。它们在性能、复制能力、稳定性、成熟度、支持等方面有所不同。

    【讨论】:

    • 我现在有机会制作 MongoDB 原型,对于这个特定的用例,它似乎比我的想法更合适。