[英]How to set TTL for a specific Couchbase document using spring-data-couchbase?
如何使用 spring-data-couchbase 為特定的 couchbase 文檔設置 TTL(生存時間)? 我知道有一種方法可以使用文檔表示法設置到期時間,如下所示 @Document(expiry = 10)
http://docs.spring.io/spring-data/couchbase/docs/1.1.1.RELEASE/reference/html/couchbase.entity.html
它將為通過實體 class 保存的所有文檔設置 TTL。
但似乎有辦法為特定文檔設置過期(TTL)時間“獲取並觸摸:獲取指定文檔並更新文檔過期時間。” 在http://docs.couchbase.com/developer/dev-guide-3.0/read-write.html中提到
如何通過 spring-data-couchbase 實現上述功能即使我可以使用 Java SDK 實現功能,也可以。
任何幫助......
使用Spring數據文件庫,這是您可以為每個文檔配置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());
}
}
}
}
使用Spring-Data-Couchbase,您無法在特定實例上設置TTL。 鑒於CouchbaseTemplate
save
方法中隱藏的轉碼步驟,一次性插入(變異)和設置TTL會非常復雜。
但是,如果您只想更新一個已經保存的文檔的TTL( getAndTouch
就是getAndTouch
做的),則有一種方法不涉及任何轉碼,因此可以很容易地應用:
CouchbaseTemplate
,可以通過getCouchbaseClient()
訪問底層的SDK客戶端getCouchbaseClient()
現在注意 sdc是在上一代SDK 1.4.x
基礎上構建的,但是很快將預覽sdc-2.0;)) touch
操作,為其指定新的TTL touch()
方法返回一個OperationFuture
(它是異步的),因此請確保在其上阻塞或僅考慮在回調中得到通知的情況下才完成觸摸。 從spring-data-couchbase:4.3.0
,代碼應該看起來像yourRepository.getOperations().getCouchbaseClientFactory().getCollection(null).touch(id, ttl)
或者這可以通過CouchbaseTemplate
作為couchbaseTemplate.getCollection(null).touch(id, ttl)
findById() 有一個 withExpiry() 方法,導致使用 getAndTouch() 並設置到期時間
User foundUser = couchbaseTemplate.findById(User.class).withExpiry(Duration.ofSeconds(1)).one(id);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.