4

我已经想到了两种我不太喜欢的方法:

  1. 在 try..catch..中调用touch(key, null)并从 catch 部分返回 false。但是后来我正在更改对我不利的 ttl。
  2. 在 try..catch..中调用add(key, value)并从 catch 部分返回 false - 这会降低效率,因为我必须删除我刚刚添加的键。

顺便说一句,我的环境是 PHP。

有什么建议么?

谢谢!

4

4 回答 4

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

于 2013-05-03T06:31:24.077 回答
0

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

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

再次为.Net 客户端,但ExecuteGet会给你一个IGetOperationResult将暴露例如HasValue,但再次拉入实际值。

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

于 2013-03-14T20:37:54.453 回答
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";
   }

文章链接

于 2013-02-13T20:40:00.117 回答
0

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

你的申请还可以吗?

请注意,由于所有键都在内存中,因此无论键是否存在,获取都一样快。

于 2013-02-07T15:46:01.240 回答