Values & Objects¶
Keys in Riak are namespaced into
buckets, and their associated values are represented
objects, not to be confused with Python
RiakObject is a container for the key, the
Vector clock, the value(s) and any metadata associated with the
Values may also be
are not discussed here.
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.
Fetching, storing, and deleting keys are the bread-and-butter of Riak.
Value and Metadata¶
Unless you have enabled Siblings via the
allow_mult bucket property, you can
inspect and manipulate the value and metadata of an object directly using these
properties and methods:
Because Riak’s consistency model is “eventual” (and not linearizable), there is no way for it to disambiguate writes that happen concurrently. The Vector clock helps establish a “happens after” relationships so that concurrent writes can be detected, but with the exception of Data Types, Riak has no way to determine which write has the correct value.
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 objects, which contain all of the same
Value and Metadata methods and attributes as the parent object.
You do not typically have to create
RiakContent objects yourself, but they will be created
for you when
fetching objects from Riak.
The Value and Metadata accessors on
are actually proxied to the first sibling when the object has only
Conflicts and Resolvers¶
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
If you do not supply a resolver function, or your resolver leaves
multiple siblings present, accessing the Value and Metadata will
result in a
ConflictError being raised.