4

我建议这应该是常见的情况之一,但可能我在谷歌搜索时使用了错误的关键字。

我只需要用完全随机的键创建新的表记录。假设我获得了具有良好随机性(几乎随机)的密钥。但是我不能 100% 确定没有行存在。所以我需要原子地做:

  • 行键检查不存在行。
  • 如果行存在则拒绝操作。
  • 如果它不退出,则创建行。

我在这个主题上找到的最有用的信息是关于HBase 行锁的文章。 我认为 HBase 行锁是合适的解决方案,但我想在没有显式行锁定的情况下做得更好。

  • ICV 看起来不合适,因为我确实希望密钥是随机的。
  • 如果 CAS 可以在“行不存在”的条件下工作,那么他们会很棒,但看起来他们不能。
  • 显式行锁具有区域拆分问题等缺点。

有人可以添加有用的建议吗?优选的 API 是基于 Java 的,但实际上它更多的是关于概念而不是实现。

4

1 回答 1

10

这种情况下的“足够好”的解决方案恰好是基于checkAndPut()method。我打算做的是带有键重复检查的新行插入,并且对于单个插入解决方案是完美的:

  • HTable checkAndPut()方法可以检查某些列是否未设置(检查它的null值)。
  • 由于行无论如何都包含一些对所有对象都是必需的“ID”字段(您可以使用您始终为对象设置的任何其他字段),因此可以检查行是否存在。
  • Put传递给的对象 checkAndPut()是包含具有强制字段集的初始对象状态。

好吧,对于批量插入(我真正需要的),它碰巧太慢了,所以我转移到用作行键的 UUID 而不对新行插入进行任何检查。对我来说,这要好得多。在这种情况下,唯一需要考虑的是非常好的随机生成器。标准 Javajava.util.UUID类包含我需要的一切,包括它基于有点慢但非常强大的java.security.SecureRandom生成器。

请注意:由于与其使用相关的安全/其他风险,看起来 HBase 用户行锁定功能将被删除。

于 2013-05-18T10:41:05.867 回答