Riak Dataypes:默认值与不存在的键

Riak Dataypes: default values vs non-existing keys

似乎 Riak 数据类型 API 不允许区分不存在的键和默认值。例如,如果我按如下方式查询不存在的键:

val fetchOp = new FetchCounter.Builder(key).build()
val c = client.execute(fetchOp).getDatatype

我将得到一个包含 0 的计数器。现在,如果我将值为 0 的计数器放在这个键和 运行 查询中,我会得到相同的结果。有什么办法可以区分这两种不同的状态吗?

注意:在使用集合时,有一个上下文可供我检查。如果我获取一个集合,上下文为空,则意味着该集合不存在于该键下。但是这个技巧对计数器不起作用,因为它们不维护上下文。

更新: Dmitri 的以下建议导致以下解决方案:

val fetchOp = new FetchValue.Builder(location).withOption(FetchValue.Option.HEAD, java.lang.Boolean.TRUE).build()
val res = client.execute(fetchOp) // res.isNotFound should equal(true)

但是,缺点是现在我需要进行额外的查询。

据我了解,这是特定客户端的限制(顺便说一句,那是什么语言?)。请随意在 Github 上为此打开一个问题。

至少 HTTP API 确实区分了不存在的计数器和值恰好为 0 的计数器。

例如,这是尝试访问现有密钥(值设置为 0)的结果:

$ curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/room-215 -v
> GET /types/counters/buckets/room_occupancy/datatypes/room-215 HTTP/1.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:38:56 GMT
< Content-Type: application/json
< Content-Length: 28
< 
* Connection #0 to host localhost left intact
{"type":"counter","value":0}

这是检索不存在的键的值的结果:

curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/non-existent-room -v
> GET /types/counters/buckets/room_occupancy/datatypes/non-existent-room HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8098
> Accept: */*
> 
< HTTP/1.1 404 Object Not Found
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:32:51 GMT
< Content-Type: application/json
< Content-Length: 37
< 
{"type":"counter","error":"notfound"}

但是,您可以使用现有客户端来解决此问题。

您可以为该计数器发出常规的获取对象操作(最好将 'HEAD only' 选项设置为 true)。 Riak 计数器(或任何其他数据类型)仍然作为常规对象存在,您可以向它发出 HEAD 请求(而不是 Fetch 计数器或其他任何东西),它会 return 预期的 404 .