如何使用spring-data-couchbase为特定的Couchbase文档设置TTL?

时间:2015-07-21 00:53:05

标签: java couchbase ttl spring-data-couchbase content-expiration

如何使用spring-data-couchbase为特定的couchbase文档设置TTL(生存时间)? 我知道有办法使用Document notation设置到期时间如下 @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实现功能,也没关系。

任何帮助.....

2 个答案:

答案 0 :(得分: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(它是异步的),因此请确保阻止它或仅在回调中通知时才考虑触摸。

答案 1 :(得分:2)

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


}