【问题标题】:How to set TTL for a specific Couchbase document using spring-data-couchbase?如何使用 spring-data-couchbase 为特定的 Couchbase 文档设置 TTL?
【发布时间】:2015-07-21 00:53:05
【问题描述】:

如何使用 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 实现该功能,也可以。

任何帮助.....

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案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(它是异步的),因此请确保阻止它或仅在回调中通知时才考虑触摸完成。

      【讨论】:

        【解决方案3】:

        从spring-data-couchbase:4.3.0 开始,代码应类似于yourRepository.getOperations().getCouchbaseClientFactory().getCollection(null).touch(id, ttl),或者这可以通过CouchbaseTemplate 作为couchbaseTemplate.getCollection(null).touch(id, ttl) 完成

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-31
            • 1970-01-01
            • 1970-01-01
            • 2016-10-29
            • 1970-01-01
            • 2019-03-21
            • 1970-01-01
            相关资源
            最近更新 更多