【问题标题】:What is the easiest way to simulate a database table with an index in a key value store?用键值存储中的索引模拟数据库表的最简单方法是什么?
【发布时间】:2011-01-17 09:31:27
【问题描述】:

用键值存储中的索引模拟数据库表的最简单方法是什么?键值存储没有范围查询和有序键。

我要模拟的东西(按优先级排序):

  1. 创建表
  2. 添加列
  3. 创建索引
  4. 根据主键查询
  5. 基于任意列的查询

【问题讨论】:

  • 模拟什么方面? SQL 兼容性?性能品质?只是根据整数主键获取正确的对象?
  • 可以以高性能方式实现的任何方面。
  • 你的问题不是很清楚,你的“澄清”没有澄清任何事情。回答@MB 的 cmets 会让你得到更好的回应。
  • 谢谢,我现在已经扩展了问题
  • 键值存储通常是无模式的“键+值”存储。表的列和索引是非常多的 RDBMS 结构。索引只是提供另一个键来访问您的值。

标签: database key-value redis riak


【解决方案1】:

如果您使用Redis(一种支持字符串、列表、集合等的高级键值存储),那么这很容易。我已经开发了一个C# redis client,它对存储 POCO 的数据模型具有原生支持。 OrmLite 可以使用这些完全相同的 POCO 将其存储在 RDBMS 中。

顺便说一下 Redis 速度很快,我有一个 benchmark,它可以在 1.2 秒内存储和检索整个 Northwind 数据库(3202 条记录)(在 3yo iMac 上的 UnitTest 中运行)

我以两种方式存储实体

  • 不同的实体,我将类类型名称和主键结合起来创建一个唯一键,例如urn:user:1
    • 然后我维护一组单独的主键(在 Redis 集中)来跟踪我的所有实体,使用如下键:ids:user
  • 在 Redis 服务器端列表中 - 它的行为非常类似于支持分页的表,使用如下键:lists:user

【讨论】:

  • 我过去使用过 Redis,是的,它的速度非常快,我喜欢它,尤其是它具有的所有范围、集合和原子(incr 和 decr)操作。只是现在我正在处理一个在动态可扩展数据库 (Riak) 中存储数十亿条记录的系统,所以 Redis 不太适合这个,因为一切都必须适合内存
  • 实际上 redis trunk 包含一个 VM,它允许您仅使用 1.6GB 内存来存储 1000 万个密钥(具有任何大小的值),同时仍然保持极快 - 请参阅:antirez.com/post/redis-virtual-memory-story.html
  • 是的,我看到了,非常酷!!事实上,即使是 Riak 也有基于 Redis 的后端。虽然它仍然无法扩展到数十亿条记录,但非常好。
  • 数十亿条记录不是硬件问题吗?我们有 64GB RAM 的入门级戴尔服务器。 64GB ~= 400M 密钥。所以 3 台服务器 = 12 亿条记录。使用具有一致哈希的客户端,你就在那里。
  • 是的,这是一种可能性。但是,一旦您开始在集群上运行 Riak 范围查询和有序列表,您就必须执行分布式合并和类似的事情,并且性能下降 1000 倍(我已经尝试过)。我建议尝试一下。在另一个项目中,我们按照您的描述进行了操作,但我们有九台服务器(数据的 3 个副本)。我们最终对所有索引和范围查询进行了手工编码,因此它们最终在集群上工作,因为 Redis 还不支持这些。回想起来,我们应该在那个项目中使用 MongoDB
【解决方案2】:

使用哈希表或字典。如果您想要唯一的键值,您可以使用 GUID 或哈希码。

【讨论】:

  • 你的意思是主键的hastable吗?字典适合放在哪里?
  • 事实上,我认为哈希表可能更适合您。字典只是另一种可能的选择。
【解决方案3】:

键值存储应支持对键进行排序和对键的范围访问。

那么你应该创建两个字典:

id -> payload

col1, id -> NULL

,其中payload 应包含数据库表将包含的所有数据,第二个字典的键应包含第一个字典每个条目中(col1, id) 的值。

【讨论】:

  • 我使用的键值存储不支持键排序或范围访问。
  • 另外,你能改一下答案吗,我不明白关于字典的部分。还有什么是 col1?
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 2021-04-21
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多