4

如何使用 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

它将为通过 Entity 类保存的所有文档设置 TTL。

但似乎有办法为特定文档设置过期时间(TTL)“获取并触摸:获取指定文档并更新文档过期时间。” 在http://docs.couchbase.com/developer/dev-guide-3.0/read-write.html中提到

如何通过 spring-data-couchbase 实现上述功能即使我可以使用 Java SDK 实现该功能,也可以。

任何帮助......

4

4 回答 4

5

使用 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());
            }
        }
    }


}
于 2015-07-31T16:58:01.670 回答
3

使用 Spring-Data-Couchbase,您不能在特定实例上设置 TTL。考虑到方法中隐藏的转码步骤,一次性插入(变异)和设置 TTL 将非常复杂CouchbaseTemplate save

但是,如果您想要做的只是更新已经保存的文档的 TTL(就是这样getAndTouch做的),那么有一种方法不涉及任何转码,因此可以轻松应用:

  • 从 中CouchbaseTemplate,通过以下方式访问底层 SDK 客户端getCouchbaseClient() 请注意,现在 sdc 是在上一代 SDK 之上构建的1.4.x,但很快就会有 sdc-2.0 的预览版;))
  • 使用 SDK,touch对文档的 ID 进行操作,赋予它新的 TTL
  • touch()方法返回一个OperationFuture(它是异步的),因此请确保阻止它或仅在回调中通知时才考虑触摸完成。
于 2015-07-21T07:46:07.797 回答
0

findById() 有一个 withExpiry() 方法,导致使用 getAndTouch() 并设置过期

用户 foundUser = couchbaseTemplate.findById(User.class).withExpiry(Duration.ofSeconds(1)).one(id);

于 2022-02-18T18:42:41.087 回答
0

spring-data-couchbase:4.3.0代码应该看起来像,yourRepository.getOperations().getCouchbaseClientFactory().getCollection(null).touch(id, ttl)或者这可以通过CouchbaseTemplateascouchbaseTemplate.getCollection(null).touch(id, ttl)

于 2022-01-04T10:12:07.137 回答