0

我有一个存储 JsonLongDocument V 的 couchbase 键 K。

每当我在时间 T 看到事件 E 时,我使用以下 java 客户端函数将 V 增加 1 并更新 T+n(sec) 的到期时间:

bucket.counter(K, 1, 1, n)

我有时还必须通过调用以下 java 客户端函数使用键 K 获取值 V:

bucket.get(K, classOf[JsonLongDocument]) 

但是,每当我调用简单的“获取”时,couchbase 都会更改文档的到期时间并将其设置为 0,这意味着永远存在。

我怎样才能在不改变其到期日的情况下仍然“获得”我的价值?

4

1 回答 1

0

通过密钥获取文档不会更改文档的到期时间。

您必须bucket.touch(K, n)在递增计数器后使用来更新到期时间。bucket.counter(K, 1, 1, n)仅当计数器文档不存在时才使用传递给的到期时间。

中返回的到期时间JsonLongDocument是传递给方法的到期值或零。它不反映存储在 Couchbase 中的实际到期时间戳。我不确定为什么 SDK 会以这种方式运行,但这是预期的行为

要查看真正的到期时间戳,您可以使用此处所述的 N1QL,可以检查计数器的数据文件。

从数据文件中获取文档到期的步骤:

  1. 确定文档所在的 vbucket 和服务器,下例中的 vbucket 8 和 localhost(需要libcouchbase,Couchbase C SDK)

    > cbc-hash test-counter-1
    test-counter-1: [vBucket=8, Index=0] 
        Server: localhost:11210, CouchAPI: http://localhost:8092/default
    Replica #0: Index=-1, Host=N/A
    
  2. 从 vbucket 数据文件中提取 counter 文档信息,8.couch.1在本例中

    > couch_dbdump 8.couch.1 | grep -B 2 -A 6 test-counter-1
    Dumping "8.couch.1":
    Doc seq: 63
         id: test-counter-1
         rev: 63
         content_meta: 128
         size (on disk): 11
         cas: 1501205424364060672, expiry: 1501205459, flags: 0, datatype: 1
         size: 1
         data: (snappy) 2
    

    请参阅服务器节点信息的文件位置或磁盘存储部分以找到存储数据文件的“数据”目录。vbucket 文件将位于以您的存储桶命名的“数据”的子目录中。

于 2017-07-28T03:09:37.960 回答