我还是NoSQL数据库的新手,多年来一直使用关系数据库管理系统(Oracle,MySQL)。现在,我们正在考虑将我们的一个数据库迁移到内存中的NoSQL DB中,并且我们坚持最好的设计方法。
我们正在考虑Redis,但它将与另一个键值商店(如RocksBD或LMDB)一起使用,还是最好单独使用,将基于我从您那里得到的建议。(你可以自由地就解决我们问题的完全不同的方法提出建议)。
要迁移到内存中的NoSQL的表格包含了人口学(如名字、姓氏、地址、出生日期、原籍国等)和生物特征数据(如照片、签名和所有10个指纹)。
查询将在人口学上运行,例如检索其中的名字= 'jones‘和姓氏= 'Andre’和DateofBirth >1984年9月13日
我们可以很容易地保存在redis的关键值商店的所有东西(包括照片,签名,指纹和所有人口),但我们担心它需要大量的RAM,特别是因为DB最终将增长到2亿条记录。因此,我们考虑在redis中存储一些常用的人口学数据(例如名字、姓氏、出生日期等),然后将其余的数据存储在键值存储中,比如LMDB或RocksDB (因为这自然需要比redis少得多的内存)。在这个实现中,当有人想检索firstname=jones和lastname=mark的位置时,它搜索redis,获取检索记录的id,然后从键值存储(lmdb或rocksDB)检索这些记录。
我们主要关心的是阅读性能,很少担心写。我们渴望快速阅读。
还请注意,当我们对人口统计的一个子集进行查询时,我们主要是检索整个数据集。(也就是说,对于每一个匹配的个体,我们检索到的是人口统计和生物特征)
发布于 2017-09-19 13:27:55
我非常喜欢Redis,因为它是一个很好的存储和索引工具。据我所见,您的需求并不适合100%的NoSQL设计。
我可能建议将数据保存在SQL上,并使用Redis构建复合索引。获取PK查找超高速SQL (PostgreSQL),并在Redis中通过PK对数据进行索引。您在内存使用方面不会有任何问题,一切都将以运行多个PK查询来获取大量数据而告终。或者,您可以应用一个策略来索引/缓存CHARS列,并将图像和超大值保存在SQL中。或临时缓存已被访问的大小数据并排除最近未被访问的数据的键。
关于内存,您所指出的是通过使用Redis集群解决的。
UPDATE通常尝试为我需要索引的每个值创建一个Redis键;如果您需要索引一个字符串,则使用单得分排序集并利用ZINDEXBYRANGE,对于datetime,您可以将分数设置为时间戳并使用ZRANGEBYSCORE。根据您的访问/存储模式,您可以决定将部分数据存储在SQL中。关于速度,我真的不能说,因为这取决于您如何决定如何设计您的键/值,以及您可以为任务分配多少RAM。
发布于 2017-09-19 11:06:33
如果您的要求是存储2亿条记录并在不同的条件下尽可能快地检索它们,那么确定哪种设计最适合您的唯一方法就是尝试它作为概念的证明。
不过,直观地看,拥有适当索引的关系数据库似乎是最好的选择,特别是如果您有经验的话。
作为另一种选择,您可以在多台机器上分发数据,但是这是一种很难的方法。
https://stackoverflow.com/questions/46276275
复制相似问题