【问题标题】:How to set TTL for a specific Couchbase document using spring-data-couchbase?如何使用 spring-data-couchbase 为特定的 Couchbase 文档设置 TTL?
【发布时间】:2015-07-21 00:53:05
【问题描述】:
【问题讨论】:
标签:
java
couchbase
ttl
spring-data-couchbase
content-expiration
【解决方案1】:
使用 Spring data couchbase,这是一种可以为每个文档配置 ttl 的简单方法。
public class CouchbaseConfig extends AbstractCouchbaseConfiguration {
@Override
protected List<String> bootstrapHosts() {
return Arrays.asList("localhost");
}
@Override
protected String getBucketName() {
return "default";
}
@Override
protected String getBucketPassword() {
return "password1";
}
@Bean
public MappingCouchbaseConverter mappingCouchbaseConverter() throws Exception {
MappingCouchbaseConverter converter = new ExpiringDocumentCouchbaseConverter(couchbaseMappingContext());
converter.setCustomConversions(customConversions());
return converter;
}
class ExpiringDocumentCouchbaseConverter extends MappingCouchbaseConverter {
/**
* Create a new {@link MappingCouchbaseConverter}.
*
* @param mappingContext the mapping context to use.
*/
public ExpiringDocumentCouchbaseConverter(MappingContext<? extends CouchbasePersistentEntity<?>, CouchbasePersistentProperty> mappingContext) {
super(mappingContext);
}
// Setting custom TTL on documents.
@Override
public void write(final Object source, final CouchbaseDocument target) {
super.write(source, target);
if (source instanceof ClassContainingTTL) {
target.setExpiration(((ClassContainingTTL) source).getTimeToLive());
}
}
}
}
【解决方案2】:
使用 Spring-Data-Couchbase,您不能在特定实例上设置 TTL。考虑到 CouchbaseTemplate save 方法中隐藏的转码步骤,一次性插入(变异)和设置 TTL 将非常复杂。
但是,如果您只想更新已保存文档的 TTL(这是 getAndTouch 所做的),则有一种方法不涉及任何转码,因此可以轻松应用:
- 从
CouchbaseTemplate,通过getCouchbaseClient() 访问底层SDK 客户端(注意 现在sdc 是在上一代SDK 1.4.x 之上构建的,但很快就会有 sdc-2.0 的预览版;))
- 使用 SDK,对文档 ID 执行
touch 操作,为其赋予新的 TTL
-
touch() 方法返回 OperationFuture(它是异步的),因此请确保阻止它或仅在回调中通知时才考虑触摸完成。
【解决方案3】:
从spring-data-couchbase:4.3.0 开始,代码应类似于yourRepository.getOperations().getCouchbaseClientFactory().getCollection(null).touch(id, ttl),或者这可以通过CouchbaseTemplate 作为couchbaseTemplate.getCollection(null).touch(id, ttl) 完成
【解决方案4】:
findById() 有一个 withExpiry() 方法,导致使用 getAndTouch() 并设置过期
用户 foundUser = couchbaseTemplate.findById(User.class).withExpiry(Duration.ofSeconds(1)).one(id);