首页 文章

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

提问于
浏览
2

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

但似乎有办法为http://docs.couchbase.com/developer/dev-guide-3.0/read-write.html中提到的特定文件"Get and touch: Fetch a specified document and update the document expiration."设置到期(TTL)时间

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

任何帮助.....

2 回答

  • 2

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

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

    • CouchbaseTemplate 开始,通过 getCouchbaseClient() 访问基础SDK客户端( note 现在sdc是基于上一代SDK构建的, 1.4.x ,但很快就会有sdc-2.0的预览;))

    • 使用SDK,对文档的ID执行 touch 操作,为其提供新的TTL

    • touch() 方法返回 OperationFuture (它是异步),因此请确保阻止它或者仅在回调中通知时才考虑触摸完成 .

  • 1

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

相关问题