NoSQL(Redis)设计建议

NoSQL (Redis) design advice

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

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

迁移到内存中 NoSQL 的 table 包含人口统计数据(例如名字、姓氏、地址、出生日期、原籍国等大约 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. 如何解决这样的挑战?

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

如果您的要求是存储 2 亿条记录并在不同条件下尽可能快地检索它们,那么确定最适合您的设计的唯一方法是尝试将其作为概念证明。

虽然从直觉上看,具有适当索引的关系数据库似乎是最佳选择,尤其是如果您有相关经验的话。

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

我非常喜欢 Redis,因为它是一个很棒的存储和索引工具。据我所知,您的要求不太适合 100% 否SQL 设计。

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

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

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