Reading Objects
You can think of reads in Riak as analogous to HTTP GET requests. You specify a bucket type, bucket, and key, and Riak either returns the object that’s stored there—including its siblings (more on that later)—or it returns not found (the equivalent of an HTTP 404 Object Not Found).
Here is the basic command form for retrieving a specific key from a bucket:
GET /types/<type>/buckets/<bucket>/keys/<key> Here is an example of a read performed on the key rufus in the bucket dogs, which bears the bucket type animals. Please note that for this example to work, you must have first created the bucket-type animals as per the instructions on the bucket type page.
// In the Java client, it is best to specify a bucket type/bucket/key // Location object that can be used as a reference for further // operations, as in the example below: Location myKey = new Location(new Namespace("animals", "dogs"), "rufus"); bucket = client.bucket_type('animals').bucket('dogs') obj = bucket.get('rufus') $response = (new \Riak\Riak\Command\Builder\FetchObject($riak)) ->buildLocation('rufus', 'users', 'animals') ->build() ->execute(); bucket = client.bucket_type('animals').bucket('dogs') obj = bucket.get('rufus') // Using the Riak .NET Client it is best to specify a bucket type/bucket/key // RiakObjectId object that can be used as a reference for further // operations var id = new RiakObjectId("animals", "dogs", "rufus"); client.fetchValue({ bucketType: 'animals', bucket: 'dogs', key: 'rufus' }, function (err, rslt) { assert(rslt.isNotFound); }); {ok, Obj} = riakc_pb_socket:get(Pid, {<<"animals">>, <<"dogs">>}, <<"rufus">>). cmd, err = riak.NewFetchValueCommandBuilder(). WithBucketType("animals"). WithBucket("dogs"). WithKey("rufus"). Build() if err != nil { // error occurred } curl http://localhost:8098/types/animals/buckets/dogs/keys/rufus Read Parameters
| Parameter | Default | Description |
|---|---|---|
r | quorum | How many replicas need to agree when retrieving an existing object before the write |
pr | 0 | How many vnodes must respond for a read to be deemed successful |
notfound_ok | true | If set to true, if the first vnode to respond doesn’t have a copy of the object, Riak will deem the failure authoritative and immediately return a notfound error to the client |
Riak also accepts many query parameters, including r for setting the R-value for GET requests (R values describe how many replicas need to agree when retrieving an existing object in order to return a successful response).
Here is an example of attempting a read with r set to 3:
// Using the "myKey" location specified above: FetchValue fetch = new FetchValue.Builder(myKey) .withOption(FetchOption.R, new Quorum(3)) .build(); FetchValue.Response response = client.execute(fetch); RiakObject obj = response.getValue(RiakObject.class); System.out.println(obj.getValue()); bucket = client.bucket_type('animals').bucket('dogs') obj = bucket.get('rufus', r: 3) p obj.data $response = (new \Riak\Riak\Command\Builder\FetchObject($riak)) ->buildLocation('rufus', 'dogs', 'animals') ->build() ->execute(); var_dump($response->getObject()->getData()); bucket = client.bucket_type('animals').bucket('dogs') obj = bucket.get('rufus', r=3) print obj.data var id = new RiakObjectId("animals", "dogs", "rufus"); var opts = new RiakGetOptions(); opts.SetR(3); var rslt = client.Get(id, opts); Debug.WriteLine(Encoding.UTF8.GetString(rslt.Value.Value)); var fetchOptions = { bucketType: 'animals', bucket: 'dogs', key: 'rufus', r: 3 }; client.fetchValue(fetchOptions, function (err, rslt) { var riakObj = rslt.values.shift(); var rufusValue = riakObj.value.toString("utf8"); logger.info("rufus: %s", rufusValue); }); {ok, Obj} = riakc_pb_socket:get(Pid, {<<"animals">>, <<"dogs">>}, <<"rufus">>, [{r, 3}]). cmd, err := riak.NewFetchValueCommandBuilder(). WithBucketType("animals"). WithBucket("dogs"). WithKey("rufus"). WithR(3). Build() if err != nil { fmt.Println(err.Error()) return } if err := cluster.Execute(cmd); err != nil { fmt.Println(err.Error()) return } fvc := cmd.(*riak.FetchValueCommand) rsp := svc.Response curl http://localhost:8098/types/animals/buckets/dogs/keys/rufus?r=3 If you’re using HTTP, you will most often see the following response codes:
200 OK300 Multiple Choices304 Not Modified
The most common error code:
404 Not Found
If you’re using a Riak client instead of HTTP, these responses will vary a great deal, so make sure to check the documentation for your specific client.
Not Found
If there’s no object stored in the location where you attempt a read, you’ll get the following response:
java.lang.NullPointerException Riak::ProtobuffsFailedRequest: Expected success from Riak but received not_found. The requested object was not found. $response->getStatusCode(); // 404 $response->isSuccess(); // false riak.RiakError: 'no_type' result.IsSuccess == false result.ResultCode == ResultCode.NotFound rslt.isNotFound === true; {error,notfound} fvc := cmd.(*riak.FetchValueCommand) rsp := fvc.Response rsp.IsNotFound // Will be true not found 