0

最近我们开始使用couchbase,我们正在使用java spring-data-couchbase 和Jersey 来访问couchbase。访问低级 java-sdk-api 我们使用 KEY(id) 为特定文档设置过期时间 (TTL)。它工作正常。代码如下。

// define couchbaseTemplate for lower-level access to Java SDK
@Autowired
CouchbaseTemplate couchbaseTemplate;


// setExpiry method update expiry given a doc ID
@Override
public void setExpiry(String key, int expN) throws RepositoryException {
    couchbaseTemplate.getCouchbaseClient().touch(key, expN);
}

我们面临的问题是当我们尝试使用查询获取文档列表时,该列表包含过期的文档。当我们尝试访问列表中的文档时,我们发现它为空。

但是如果我们在一段时间后执行查询,过期文档不再包含在列表中。

例子:当expN=10秒,我们设置TTL后10秒左右执行查询,过期文档包含如果我们设置TTL后20秒左右执行查询,过期文档不再包含

在我们设置的陈旧选项中

Query.setStale(Stale.false) 

我们试图操纵

Query.setIncludeDocs

但没有运气,任何帮助....

4

2 回答 2

2

Couchbase 服务器确实会延迟到期。商品过期的三种方式:

  1. 当访问文档(获取操作)时,会检查过期值
  2. 当到期寻呼机运行时
  3. 当磁盘压缩过程运行时(仅在 Couchbase Server 3 及更高版本中)

因此,在这三个过程之一发生之前​​,不会更新视图。

对于这个用例,您可以简单地使用当前时间对视图进行范围查询,以便它只返回未过期的文档。假设集群和客户端的时间相同,并且正在使用的视图是这个:

function (doc, meta) {
  emit(meta.expiration, null);
}

meta.expiration 是一个纪元时间戳,因此可以使用以下查询:

String currentEpoch = String.valueOf((System.currentTimeMillis()/1000)); 
bucket.query(ViewQuery.from("designdoc", "myview").startkey(currentEpoch));

请注意,这将返回所有设置了过期时间的有效文档。

如果您想对日期格式做一些更有趣的事情,请查看Couchbase Server手册查看和查询示例章节中的日期和时间选择

于 2015-07-29T00:06:04.617 回答
0

正如Couchbase 官方文件所说,

检测结果集中过期的文档:如果您使用视图来索引 Couchbase 服务器中的项目,则在过期寻呼机维护过程中尚未删除的项目将成为查询视图返回的结果集的一部分。要从结果集中排除这些项目,您应该使用将查询参数 include_doc 设置为 true。

对于过期的文档,如果您设置 include_doc=true ,Couchbase Server 会返回一个结果集,指示该文档不再存在。具体来说,已过期但尚未被清理过程删除的键将在结果集中显示为 "doc":null 的行

因此,这就是 Couchbase 处理过期文档的方式。

对于您的情况,只需过滤掉文档为空的项目,其余的将是您的预期结果。

于 2017-09-18T14:49:32.117 回答