Distributed cache and in-memory key/value data store. It can be used both as an embedded Go library and as a language-independent service.
With Olric, you can instantly create a fast, scalable, shared pool of RAM across a cluster of computers.
At a glance
- Designed to share some transient, approximate, fast-changing data between servers,
- Embeddable but can be used as a language-independent service with olricd,
- Supports different eviction algorithms,
- Fast binary protocol,
- Highly available and horizontally scalable,
- Provides best-effort consistency guarantees without being a complete CP (indeed PA/EC) solution,
- Supports replication by default (with sync and async options),
- Quorum-based voting for replica control (Read/Write quorums),
- Supports atomic operations,
- Supports distributed queries on keys,
- Provides a plugin interface for service discovery daemons,
- Provides a locking primitive which inspired by SETNX of Redis,
- Supports distributed topic data structure,
With this feature set, Olric is suitable to use as a distributed cache. But it also provides distributed topics, data replication, failure detection and simple anti-entropy services. So it can be used as an ordinary key/value data store to scale your cloud application.
Features
- Designed to share some transient, approximate, fast-changing data between servers,
- Accepts arbitrary types as value,
- Only in-memory,
- Implements a fast and simple binary protocol,
- Embeddable but can be used as a language-independent service with olricd,
- GC-friendly storage engine,
- O(1) running time for lookups,
- Supports atomic operations,
- Provides a lock implementation which can be used for non-critical purposes,
- Different eviction policies: LRU, MaxIdleDuration and Time-To-Live (TTL),
- Highly available,
- Horizontally scalable,
- Provides best-effort consistency guarantees without being a complete CP (indeed PA/EC) solution,
- Distributes load fairly among cluster members with a consistent hash function,
- Supports replication by default (with sync and async options),
- Quorum-based voting for replica control,
- Thread-safe by default,
- Supports distributed queries on keys,
- Provides a plugin interface for service discovery daemons and cloud providers,
- Provides a command-line-interface to access the cluster directly from the terminal,
- Supports different serialization formats. Gob, JSON and MessagePack are supported out of the box,
- Provides a locking primitive which inspired by SETNX of Redis,
- Supports distributed topic data structure,
Golang Client
This repo contains the official Golang client for Olric. It implements Olric Binary Protocol(OBP). With this client, you can access to Olric clusters in your Golang programs. In order to create a client instance:
var clientConfig = &client.Config{
Addrs: []string{"localhost:3320"},
DialTimeout: 10 * time.Second,
KeepAlive: 10 * time.Second,
MaxConn: 100,
}
client, err := client.New(clientConfig)
if err != nil {
return err
}
dm := client.NewDMap("foobar")
err := dm.Put("key", "value")
// Handle this error
The official Golang client has its dedicated documentation. Please take a look at this.
Operation Modes
Olric has two different operation modes.
Embedded Member
In Embedded Member Mode, members include both the application and Olric data and services. The advantage of the Embedded Member Mode is having a low-latency data access and locality.
Client-Server
In the Client-Server deployment, Olric data and services are centralized in one or more server members and they are accessed by the application through clients. You can have a cluster of server members that can be independently created and scaled. Your clients communicate with these members to reach to Olric data and services on them.
Client-Server deployment has advantages including more predictable and reliable performance, easier identification of problem causes and, most importantly, better scalability. When you need to scale in this deployment type, just add more Olric server members. You can address client and server scalability concerns separately.
See olricd section to get started.