Current version: v3.2.1
.
Riak KV version: 2.0 or higher, the latest version of Riak KV is always recommended.
goriak is a wrapper around riak-go-client (version 1.9.0
or newer is required) to make it easier and more friendly for developers to use Riak KV.
As a Go module (requires Go 1.11 or later):
go get github.com/zegl/goriak/v3@v3.2.3
As a Go package:
go get -u gopkg.in/zegl/goriak.v3
The main feature of goriak is that goriak automatically can marshal/unmarshal your Go types into Riak data types.
In the example below Name
will be saved as a register, and Aliases
will be a set.
type User struct {
Name string
Aliases []string
}
user := User {
Name: "Foo",
Alises: []string{"Foo", "Bar"},
}
goriak.Bucket("bucket-name", "bucket-type").Set(user).Key("key").Run(c)
Struct tags can be used to change the name of the item, or to ignore it.
type User struct {
Name string `goriak:"-"` // Ignore field
Aliases []string `goriak:"aliases"` // Save as "aliases" in Riak KV
}
The map can later be retreived as a whole:
var res User
goriak.Bucket("bucket-name", "bucket-type").Get("key", &res).Run(c)
Go Type | Riak Type |
---|---|
struct |
map |
string |
register |
[n]byte |
register |
[]byte |
register |
[]slice |
set |
[]slice |
set |
[][]byte |
set |
map |
map |
time.Time |
register |
int [1] | register |
1: All signed and unsigned integer types are supported.
Supported key types: all integer types, string
.
Supported value types: string
, []byte
.
Some actions are more complicated then necessary with the use of the default Go types and MapOperations
.
This is why goriak contains the types Counter
, Set
, Flag
and Register
. All of these types will help you performing actions such as incrementing a value, or adding/removing items.
Riak Counters is supported with the special goriak.Counter
type.
Example:
type Article struct {
Title string
Views *goriak.Counter
}
// Get our object
var article Article
goriak.Bucket("articles", "map").Get("1-hello-world", &article).Run(con)
// Increase views by 1
err := article.Views.Increase(1).Exec(con)
// check err
Counter.Exec(con)
will make a lightweight request to Riak, and the counter is the only object that will be updated.
You can also save the changes to your counter with SetMap()
, this is useful if you want to change multiple counters at the same time.
Check godoc for more information.
You can chose to use goriak.Set
to help you with Set related actions, such as adding and removing items. goriak.Set
also has support for sending incremental actions to Riak so that you don't have to build that functionality yourself.
Example:
type Article struct {
Title string
Tags *goriak.Set
}
// Get our object
var article Article
goriak.Bucket("articles", "map").Get("1-hello-world", &article).Run(con)
// Add the tag "animals"
err := article.Tags.AddString("animals").Exec(con)
// check err
Check godoc for more information.
Values can be automatically JSON Marshalled/Unmarshalled by using SetJSON()
and GetJSON()
.
There is also SetRaw()
and GetRaw()
that works directly on []byte
s.
// Set object
goriak.Bucket("bucket-name", "bucket-type").SetJSON(obj).Key("key").Run(con)
// Get object
goriak.Bucket("bucket-name", "bucket-type").GetJSON("key", &obj).Run(con)
There is a time in everyones life where you need to perform raw MapOperations on your Riak Data Values.
Some operations, such as RemoveFromSet
requires a Context to perform the operation.
A Context can be retreived from Get
by setting a special context type.
type ourType struct {
Aliases []string
// The context from Riak will be added if the tag goriakcontext is provided
Context []byte `goriak:"goriakcontext"`
}
// ... GetMap()
// Works with MapOperation from github.com/basho/riak-go-client
operation := goriak.NewMapOperation()
operation.AddToSet("Aliases", []byte("Baz"))
goriak.MapOperation("bucket-name", "bucket-type", "key", operation, val.Context)
You can set secondary indexes automatically with SetJSON()
by using struct tags.
Strings and all signed integer types are supported. Both as-is and in slices.
type User struct {
Name string `goriakindex:"nameindex_bin"`
Aliases []string
}
Indexes can also be used in slices. If you are using a slice every value in the slice will be added to the index.
type User struct {
Aliases []string `goriakindex:"aliasesindex_bin"`
}
When saved the next time the index will be updated.
Keys in a particular index can be retreived with KeysInIndex
.
callback := func(item goriak.SecondaryIndexQueryResult) {
// use item
}
goriak.Bucket("bucket-name", "bucket-type").
KeysInIndex("nameindex_bin", "Value", callback).
Run(con)
An alternative way of setting Secondary Indexes is by using AddToIndex()
.
goriak.Bucket("bucket-name", "bucket-type").
SetRaw(data).
AddToIndex("indexname_bin", "value").
Run(con)