riak.riak_object
Keys in Riak are namespaced into buckets
<riak.bucket.RiakBucket>
, and their associated values are represented by objects <RiakObject>
, not to be confused with Python "objects". A RiakObject
is a container for the key, the vclock
, the value(s) and any metadata associated with the value(s).
Values may also be datatypes <riak.datatypes.Datatype>
, but are not discussed here.
RiakObject
key
The key of this object, a string. If not present, the server will generate a key the first time this object is stored.
bucket
The bucket <riak.bucket.RiakBucket>
to which this object belongs.
resolver
vclock
The vclock
for this object.
exists
Vector clocks are Riak's means of tracking the relationships between writes to a key. It is best practice to fetch the latest version of a key before attempting to modify or overwrite the value; if you do not, you may create siblings
or lose data! The content of a vector clock is essentially opaque to the user.
VClock
Fetching, storing, and deleting keys are the bread-and-butter of Riak.
RiakObject.store
RiakObject.reload
RiakObject.delete
Unless you have enabled siblings
via the allow_mult
<riak.bucket.RiakBucket.allow_mult>
bucket property, you can inspect and manipulate the value and metadata of an object directly using these properties and methods:
RiakObject.data
RiakObject.encoded_data
RiakObject.content_type
RiakObject.charset
RiakObject.content_encoding
RiakObject.last_modified
RiakObject.etag
RiakObject.usermeta
RiakObject.links
RiakObject.indexes
RiakObject.add_index
RiakObject.remove_index
RiakObject.set_index
RiakObject.add_link
Because Riak's consistency model is "eventual" (and not linearizable), there is no way for it to disambiguate writes that happen concurrently. The vclock
helps establish a "happens after" relationships so that concurrent writes can be detected, but with the exception of datatypes
, Riak has no way to determine which write has the correct value.
Instead, when allow_mult <riak.bucket.RiakBucket.allow_mult>
is True
, Riak keeps all writes that appear to be concurrent. Thus, the contents of a key's value may, in fact, be multiple values, which are called "siblings". Siblings are modeled in RiakContent
<riak.content.RiakContent>
objects, which contain all of the same object_accessors
methods and attributes as the parent object.
RiakObject.siblings
riak.content.RiakContent
You do not typically have to create RiakContent
<riak.content.RiakContent>
objects yourself, but they will be created for you when fetching <RiakObject.reload>
objects from Riak.
Note
The object_accessors
accessors on RiakObject
are actually proxied to the first sibling when the object has only one.
When an object is not in conflict, it has only one sibling. When it is in conflict, you will have to resolve the conflict before it can be written again. How you choose to resolve the conflict is up to you, but you can automate the process using a resolver
<RiakObject.resolver>
function.
riak.resolver.default_resolver
riak.resolver.last_written_resolver
If you do not supply a resolver function, or your resolver leaves multiple siblings present, accessing the object_accessors
will result in a ConflictError <riak.ConflictError>
being raised.
riak.ConflictError