我建议这应该是常见的情况之一,但可能在谷歌搜索时使用错误的关键字.
我只需要用完全随机的密钥创建新的表记录.假设我获得了具有良好随机性的密钥(几乎是随机的).但是,我不能100%确定没有行存在.所以我需要原子地做什么:
有行键检查还没有行.
如果行存在则拒绝操作.
如果没有退出则创建行.
我在这个主题上找到的最有用的信息是关于HBase行锁的文章. 我认为HBase行锁是合适的解决方案,但我想在没有显式行锁定的情况下更好地做到这一点.
ICV看起来不合适,因为我确实希望密钥是随机的.
如果他们可以在"行不存在"条件下工作,CAS会很棒,但看起来他们不能.
显式行锁具有区域拆分问题等缺点.
有人可以加一些有用的建议吗?优选的API是基于Java的,但实际上它更多的是概念而不是实现.
对于这种情况,"足够好"的解决方案恰好基于checkAndPut()
方法.我打算做的是新的行插入与密钥重复检查和单个插入解决方案是完美的:
HTable checkAndPut()
方法可以检查某些列是否未设置(检查它的null
值).
由于行无论如何都包含一些"ID"字段,该字段对于所有对象都是必需的(您可以使用您始终为对象设置的任何其他字段),因此可以检查行是否存在.
Put
传递给的对象 checkAndPut()
是包含具有必填字段集的初始对象状态.
好吧,对于批量插入(我真正需要的)它碰巧太慢了所以我移动到用作行键的UUID而没有对新行插入进行任何检查.对我来说它好多了.在这种情况下唯一的考虑因素是非常好的随机发生器.标准Java java.util.UUID
类包含我需要的一切,包括它基于有点慢但非常强大的java.security.SecureRandom
生成器.
请注意:由于与其使用相关的安全性/其他风险,HBase用户行锁定功能似乎将被删除.