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

时间:2015-08-06 00:59:20

标签: scala riak crdt

似乎Riak Datatype 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)

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

1 个答案:

答案 0 :(得分:1)

根据我的理解,这是该特定客户的限制(顺便说一下,这是什么语言?)。随意在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"}

但是,您可以使用现有客户端进行解决方法。

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