2017-09-18 106 views
1

我还是NoSQL数据库的新手,多年来一直在使用RDBMS(Oracle,MySQL)。现在,我们正在考虑将我们的一个数据库迁移到内存中的NoSQL DB,并且我们坚持采用最佳设计方法。NoSQL(Redis)设计建议

我们正在考虑Redis,但是否会与另一个Key-value商店(如RocksBD或LMDB)一起使用,或者最好单独使用它们将基于我从您那里得到的建议。 (您可以通过完全不同的方法来解决我们的问题。

迁移到内存中的NoSQL表包含人口统计信息(例如名字,姓氏,地址,出生日期,出生国家等等约40个不同的人口统计字段)和生物特征数据,如照片,签名和全部10个指纹。

查询将人口统计如检索其中姓名=“琼斯”和姓氏=“安德烈”和出生日期> 1984年9月13日

我们可以很容易地保存在redis的键值存储一切(包括照片运行,签名,指纹和所有人口统计数据),但我们担心它需要大量的RAM,特别是因为DB最终会增长到大约2亿条记录。因此,我们考虑存储一些在redis中频繁搜索的人口统计数据(例如,名字,姓氏,生日等),然后将其余数据存储在键值存储中,如LMDB或RocksDB(因为这当然需要远内存少于redis)。在这个实现中,当有人想要检索firstname = jones和lastname = mark时,它会搜索redis,获取检索到的记录的id,然后从键值存储区(lmdb或rocksDB)中取回这些记录。 我们主要关心的是阅读性能,对于编写很少担心。 我们希望阅读速度非常快。

  1. 这是一个很好的设计方法,或有人建议更好的设计方法,将导致更好的性能。请记住,目标是最大限度地减少内存需求并获得非常好的读取性能。

  2. 顺便说一句,这是一种很好的方法来存储这种性质的生物识别技术吗?

  3. 怎么都是这样challanges解决

还要注意的是,虽然我们对查询的人口,做检索的一个子集,我们主要检索整个数据集的。 (即每个匹配的个体我们检索其他人口统计和生物特征)

+0

请阅读[在什么情况下我可以添加“紧急”或其他类似的短语到我的问题,以获得更快的答案?](/ meta.stackoverflow.com/q/326569) - 总结是,这不是解决志愿者问题的理想方式,而且可能对获得答案起反作用。请不要将这添加到您的问题。 – halfer

+0

不知道条件如name ='jhon'&& last ='doe'将在key-value存储中实现,redis是否支持这一点? – ren

+0

是的。 redis支持这种搜索 – SWILL

回答

0

我是Redis的忠实粉丝,因为它是一款出色的存储和索引工具。据我所见,你的需求并不适合100%的NoSQL设计。

我可能会建议将数据保存在SQL中,并使用Redis构建复合索引。在Redis中获取PK查找超快SQL(PostgreSQL)并通过PK索引数据。你不会有任何内存使用的问题,一切都将最终运行多个PK查询来获取大量的数据。或者您可以应用策略来仅索引/缓存CHARS列,并将图像和超大值保留在SQL中。或临时缓存已访问的大小的数据,并驱逐最近未访问的数据的密钥。

关于内存,您指出的内容是使用Redis Cluster解决的。

[更新]通常我会尝试为每个需要索引的值创建一个Redis键;如果您需要索引字符串,请使用单声道分类排序集并利用ZINDEXBYRANGE,对于日期时间,您可以将分数设置为时间戳并使用ZRANGEBYSCORE。根据您的访问/存储模式,您可以决定存储部分数据,并将批量保留在SQL中。关于速度,我不能说,因为它取决于你决定如何设计你的键/值和你可以分配多少内存来完成任务。

+0

非常感谢您的意见。你的建议需要维护一个RDBMS和一个No-sql数据库。如果它是最好的前进方向,那将会被考虑。 Howerever,我知道redis支持这样的搜索(即,如果索引值被查询,例如firstname ='jones'和lastname ='eva'和dateofbirth> 1984年9月12日)。您是否认为redis在这些查询中表现不佳?你认为做两个调用来获取记录(首先调用rdbms,另一个调用redix)会比在redis上调用更好吗? – SWILL

+0

@SWILL查看回复更新 – tuned

0

如果您的要求是存储200毫升记录并在不同条件下尽快找回它们,那么确定最适合您的设计的唯一方法是尝试它作为概念的证明。

尽管如此,似乎关系数据库与适当的索引是最好的选择,特别是如果你有它的经验。

作为另一种选择,您可以将数据分布到多台机器上,但这是困难的。

+0

非常感谢您的输入 – SWILL