Как установить TTL для конкретного документа Couchbase, используя spring-data-couchbase?
Как установить TTL (время жизни) для конкретного документа couchbase, используя spring-data-couchbase? Я знаю, что есть способ установить время истечения с помощью нотации документа следующим образом @Document (expiry = 10)
http://docs.spring.io/spring-data/couchbase/docs/1.1.1.RELEASE/reference/html/couchbase.entity.html
Он установит TTL для всех документов, сохраненных через класс Entity.
Но, похоже, есть способ установить время истечения (TTL) для конкретного документа "Получить и коснуться: получить указанный документ и обновить срок действия документа". упоминается в http://docs.couchbase.com/developer/dev-guide-3.0/read-write.html
Как я могу достичь вышеупомянутой функциональности с помощью spring-data-couchbase? Даже если бы я мог добиться функциональности с помощью Java SDK, было бы хорошо.
Любая помощь.....
4 ответа
Используя 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());
}
}
}
}
Используя Spring-Data-Couchbase, вы не можете установить TTL для конкретного экземпляра. Вставка (изменение) и установка TTL за один раз были бы довольно сложными, учитывая шаги транскодирования, которые скрыты в CouchbaseTemplate
save
метод.
Однако, если вы хотите просто обновить TTL уже сохраненного документа (вот что getAndTouch
делает), есть способ, который не требует какого-либо транскодирования и поэтому может быть легко применен:
- От
CouchbaseTemplate
получить доступ к клиенту SDK черезgetCouchbaseClient()
(на данный момент sdc построен поверх предыдущего поколения SDK,1.4.x
, но скоро будет предварительный просмотр sdc-2.0;)) - Используя SDK, выполните
touch
операция над идентификатором документа, присвоить ему новый TTL touch()
метод возвращаетOperationFuture
(это асинхронный режим), поэтому убедитесь, что он либо заблокирован, либо считается, что касание выполнено только в случае уведомления в обратном вызове.
findById() имеет метод withExpiry(), который приводит к использованию getAndTouch() и установке срока действия
Найденный пользовательПользователь = CouchbaseTemplate.findById(User.class).withExpiry(Duration.ofSeconds(1)).one(id);
По состоянию на
spring-data-couchbase:4.3.0
код должен выглядеть
yourRepository.getOperations().getCouchbaseClientFactory().getCollection(null).touch(id, ttl)
или альтернативно это можно сделать через
CouchbaseTemplate
в качестве
couchbaseTemplate.getCollection(null).touch(id, ttl)