如何检查Couchbase中是否存在密钥?

时间:2013-02-07 14:52:24

标签: php couchbase

我已经想过两种我不喜欢的方法:

  1. 在try..catch ..中调用 touch(key,null)并从中返回false 捕获部分。但后来我改变了不好的ttl 为了我。
  2. 在try..catch ..中调用 add(key,value)并返回 来自捕获部分的错误 - 这种缺陷效率因为我 必须删除它们我刚刚不必要地添加的密钥。
  3. BTW,我的环境是PHP。

    有什么建议吗?

    谢谢!

4 个答案:

答案 0 :(得分:1)

Couchbase目前尚未提供exists方法,但您可以使用adddelete来执行此操作,这对Memcache / 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

答案 1 :(得分:0)

一个简单的方法是做一个get(key);如果密钥存在,则返回该值,否则操作返回null。

你的申请可以吗?

请注意,由于所有密钥都在内存中,因此当密钥存在与否时,可以快速获取密钥。

答案 2 :(得分:0)

查看此示例,取自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";
   }

Article Link

答案 3 :(得分:0)

我也缺少一个简单的Exists成员。

在.Net客户端中,您有client.TryGet,但仍然会提取项目,当它返回false时,它并不意味着它不存在,只是它不能拉它(只是尝试在我的节点关闭时执行它。)

再次针对.Net客户端,但ExecuteGet会给你一个IGetOperationResult,它会公开例如HasValue,但会再次提取实际值。

使用视图?也许有点脏,但你可以有一个只返回ID的视图,这也将消除检索文档的需要。不确定它是否真的会表现得更好。