我已经想到两个方法,我真的不喜欢:如何检查Couchbase中是否存在密钥?
- 电话触摸(键,NULL)内部在try..catch ..从 闭锁段返回false。但后来我改变了TTL这是不是对我好 。
- 电话加(键,值)内部在try..catch ..并返回 从闭锁段错误 - 该缺陷的效率,因为我 必须删除他们键入我刚刚加入不必要的。
顺便说一句,我的环境是PHP。
有什么建议吗?
谢谢!
我已经想到两个方法,我真的不喜欢:如何检查Couchbase中是否存在密钥?
顺便说一句,我的环境是PHP。
有什么建议吗?
谢谢!
一个简单的办法,是做一个GET(键);如果该键存在,则返回该值,否则操作返回null。
它是确定您的应用程序?
注意,因为所有的钥匙都在内存中是一样快当钥匙的存在与否做一个GET。
检查到这个例子,从couchbase
#retrieve the last access date/time of the script.
#the key name is is the script name prefixed with DATE::
$last_access_date=$cb_obj->get("DATE::" . $script_name);
#handle the case where this is the first access to the script
#and that key doesn't yet exist
if($last_access_date == NULL){
$last_access_date = "never";
}
我失去了一个简单的Exists
成员以及拍摄。
在.Net客户端中,您有client.TryGet
,但它仍然会将该项目取出,当它返回false
时,它并不意味着它不存在,只是它无法将其拉出(只是试图执行它与我的节点关闭)。
同样对于.NET客户端,但ExecuteGet
会给你一个IGetOperationResult
将暴露e.g HasValue
,但在实际值再次拉低。
使用视图?也许有点肮脏,但你可以有一个视图只返回Ids,这将消除检索文档的需要。不知道它是否真的会表现更好。
Couchbase并没有在这个时候提供一个exists
方法,但你可以使用add
和delete
做到这一点的东西,这也是工作有用的内存缓存/ Memcached的
public function exists($key)
{
if ($this->object->add($key, true)) {
$this->object->delete($key);
return false;
}
return true;
}
https://github.com/twinh/widget/blob/master/lib/Widget/Couchbase.php#L118
但如果什么密钥的值为空?密钥存在但其值为空。 – avivklas
或者,值可能是兆字节大小;也许你不想不必要地拉它。 –