最近我们开始使用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);
}
我们面临的问题是当我们尝试使用查询获取文档列表时,列表包含过期的文档 . 当我们尝试从列表中访问文档时,我们发现它是null .
但是如果我们在一段时间后执行查询,则过期的文档不再包含在列表中 .
示例:当expN = 10秒时,我们在设置TTL后大约10秒执行查询,包含过期文档如果我们在设置TTL后大约20秒执行查询,则不再包含过期文档
在我们设定的陈旧选项中
Query.setStale(Stale.false)
我们试图操纵
Query.setIncludeDocs
但没有运气,任何帮助....
2 回答
Couchbase Server懒洋洋地做了expiries . 项目可以通过三种方式过期:
访问文档(获取操作)时,将检查到期值
当到期寻呼机运行时
磁盘compaction process运行时(仅限Couchbase Server 3及更高版本)
由于这些视图在这三个进程中的一个发生之前不会更新 .
对于此用例,您可以使用当前时间对视图进行范围查询,因此它只返回尚未过期的文档 . 假设集群上的时间与客户端相同,并且正在使用的视图是这个:
meta.expiration是一个纪元时间戳,因此可以使用以下查询:
请注意,这将返回所有已设置到期日的活动文档 .
如果您想使用日期格式做一些更有趣的事情,请在Couchbase Server manual的View and query examples章节中查看日期和时间选择的一半 .
正如Couchbase official documents所说,
因此,这就是Couchbase如何处理过期文档 .
对于您的情况,只需过滤掉doc为null的项目,其余的将是您的预期结果 .