database-design - NoSQL(Redis)设计建议

标签 database-design redis in-memory-database lmdb nosql

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

我们正在考虑 Redis,但它是与其他键值存储(如 RocksBD 或 LMDB)结合使用还是最好单独使用将取决于我从您那里收到的建议。 (您可以就解决我们问题的完全不同的方法提出建议)。

要迁移到内存中 NoSQL 的表包含人口统计数据(例如名字、姓氏、地址、出生日期、原籍国等大约 40 个不同的人口统计字段)和生物特征数据(例如照片、签名和所有 10 个指纹)。

查询将在人口统计数据上运行,例如检索 where firstname = 'jones' and lastname = 'Andre' and DateofBirth > 13 sept 1984

我们可以非常轻松地在 Redis 键值存储中保存所有内容(包括照片、签名、指纹和所有人口统计信息),但我们担心它需要大量的 RAM,尤其是因为数据库最终会增长到大约 2 亿条记录.因此,我们考虑在 Redis 中存储一些经常被搜索的人口统计数据(例如名字、姓氏、出生日期等),然后将其余数据存储在键值存储中,例如 LMDB 或 RocksDB(因为这自然需要很长时间内存比 redis 少)。在此实现中,当有人希望检索 firstname=jones 和 lastname=mark 时,它会搜索 redis,获取检索到的记录的 id,然后从键值存储(lmdb 或 rocksDB)中检索这些记录。

我们主要担心读取性能,很少担心写入性能。我们希望阅读速度非常快。

  1. 这是一种好的设计方法吗?或者有人可以建议更好的设计方法来实现更好的性能。请记住,目标是最小化 RAM 需求并获得非常好的读取性能。

  2. 顺便说一句,将这种性质的生物特征存储在内存中甚至是一种好方法吗?

  3. 如何解决此类挑战?

另请注意,虽然我们查询人口统计的子集,进行检索,但我们主要检索的是整个数据集。 (也就是说,对于每个匹配的个体,我们都会检索人口统计和生物特征)

最佳答案

我非常喜欢 Redis,因为它是一种出色的存储和索引工具。据我所知,您的要求并不真正适合 100% NoSQL 设计。

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

关于内存,你说的是用Redis Cluster解决的。

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

关于database-design - NoSQL(Redis)设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46276275/

相关文章:

python - 如果每天晚上我需要处理日常记录然后删除它们,如何在DynamoDB中构建模型?

php - 在 SQL 数据库中存储表单数据

redis - 无法在 ubuntu 12.04 上安装 redis 2.7+

Redis 分片、流水线和往返

c# - 将磁盘上的SQLite数据库加载到内存数据库中并进行同步

Mysql表设计建议

sql-server - 设计大型实体的最佳实践

redis - Redis Sentinel 是否应该监控集群中的每个 Master?

mysql - 用于单元测试的 Oracle 内存数据库

django - 我们怎样才能使 Django 测试更快?