Simple key-value store abstraction and implementations for Go (Redis, Consul, etcd, bbolt, BadgerDB, LevelDB, Memcached, DynamoDB, S3, PostgreSQL, MongoDB, CockroachDB and many more)

Overview

gokv

GoDoc Build Status Go Report Card codecov GitHub Releases Mentioned in Awesome Go

Simple key-value store abstraction and implementations for Go

Contents

  1. Features
    1. Simple interface
    2. Implementations
    3. Value types
    4. Marshal formats
    5. Roadmap
  2. Usage
  3. Project status
  4. Motivation
  5. Design decisions
  6. Related projects

Features

Simple interface

Note: The interface is not final yet! See Project status for details.

type Store interface {
    Set(k string, v interface{}) error
    Get(k string, v interface{}) (found bool, err error)
    Delete(k string) error
    Close() error
}

There are detailed descriptions of the methods in the docs and in the code. You should read them if you plan to write your own gokv.Store implementation or if you create a Go package with a method that takes a gokv.Store as parameter, so you know exactly what happens in the background.

Implementations

Some of the following databases aren't specifically engineered for storing key-value pairs, but if someone's running them already for other purposes and doesn't want to set up one of the proper key-value stores due to administrative overhead etc., they can of course be used as well. In those cases let's focus on a few of the most popular though. This mostly goes for the SQL, NoSQL and NewSQL categories.

Feel free to suggest more stores by creating an issue or even add an actual implementation - PRs Welcome.

For differences between the implementations, see Choosing an implementation.
For the GoDoc of specific implementations, see https://www.godoc.org/github.com/philippgille/gokv#pkg-subdirectories.

Again:
For differences between the implementations, see Choosing an implementation.
For the GoDoc of specific implementations, see https://www.godoc.org/github.com/philippgille/gokv#pkg-subdirectories.

Value types

Most Go packages for key-value stores just accept a []byte as value, which requires developers for example to marshal (and later unmarshal) their structs. gokv is meant to be simple and make developers' lifes easier, so it accepts any type (with using interface{} as parameter), including structs, and automatically (un-)marshals the value.

The kind of (un-)marshalling is left to the implementation. All implementations in this repository currently support JSON and gob by using the encoding subpackage in this repository, which wraps the core functionality of the standard library's encoding/json and encoding/gob packages. See Marshal formats for details.

For unexported struct fields to be (un-)marshalled to/from JSON/gob, the respective custom (un-)marshalling methods need to be implemented as methods of the struct (e.g. MarshalJSON() ([]byte, error) for custom marshalling into JSON). See Marshaler and Unmarshaler for JSON, and GobEncoder and GobDecoder for gob.

To improve performance you can also implement the custom (un-)marshalling methods so that no reflection is used by the encoding/json / encoding/gob packages. This is not a disadvantage of using a generic key-value store package, it's the same as if you would use a concrete key-value store package which only accepts []byte, requiring you to (un-)marshal your structs.

Marshal formats

This repository contains the subpackage encoding, which is an abstraction and wrapper for the core functionality of packages like encoding/json and encoding/gob. The currently supported marshal formats are:

More formats will be supported in the future (e.g. XML).

The stores use this encoding package to marshal and unmarshal the values when storing / retrieving them. The default format is JSON, but all gokv.Store implementations in this repository also support gob as alternative, configurable via their Options.

The marshal format is up to the implementations though, so package creators using the gokv.Store interface as parameter of a function should not make any assumptions about this. If they require any specific format they should inform the package user about this in the GoDoc of the function taking the store interface as parameter.

Differences between the formats:

Roadmap

  • Benchmarks!
  • CLI: A simple command line interface tool that allows you create, read, update and delete key-value pairs in all of the gokv storages
  • A combiner package that allows you to create a gokv.Store which forwards its call to multiple implementations at the same time. So for example you can use memcached and s3 simultaneously to have 1) super fast access but also 2) durable redundant persistent storage.
  • A way to directly configure the clients via the options of the underlying used Go package (e.g. not the redis.Options struct in github.com/philippgille/gokv, but instead the redis.Options struct in github.com/go-redis/redis)
    • Will be optional and discouraged, because this will lead to compile errors in code that uses gokv when switching the underlying used Go package, but definitely useful for some people
  • More stores (see stores in Implementations list with unchecked boxes)
  • Maybe rename the project from gokv to SimpleKV?
  • Maybe move all implementation packages into a subdirectory, e.g. github.com/philippgille/gokv/store/redis?

Usage

First, download the module you want to work with:

  • For example when you want to work with the gokv.Store interface:
  • For example when you want to work with the Redis implementation:

Then you can import and use it.

Every implementation has its own Options struct, but all implementations have a NewStore() / NewClient() function that returns an object of a sctruct that implements the gokv.Store interface. Let's take the implementation for Redis as example, which is the most popular distributed key-value store.

package main

import (
    "fmt"

    "github.com/philippgille/gokv"
    "github.com/philippgille/gokv/redis"
)

type foo struct {
    Bar string
}

func main() {
    options := redis.DefaultOptions // Address: "localhost:6379", Password: "", DB: 0

    // Create client
    client, err := redis.NewClient(options)
    if err != nil {
        panic(err)
    }
    defer client.Close()

    // Store, retrieve, print and delete a value
    interactWithStore(client)
}

// interactWithStore stores, retrieves, prints and deletes a value.
// It's completely independent of the store implementation.
func interactWithStore(store gokv.Store) {
    // Store value
    val := foo{
        Bar: "baz",
    }
    err := store.Set("foo123", val)
    if err != nil {
        panic(err)
    }

    // Retrieve value
    retrievedVal := new(foo)
    found, err := store.Get("foo123", retrievedVal)
    if err != nil {
        panic(err)
    }
    if !found {
        panic("Value not found")
    }

    fmt.Printf("foo: %+v", *retrievedVal) // Prints `foo: {Bar:baz}`

    // Delete value
    err = store.Delete("foo123")
    if err != nil {
        panic(err)
    }
}

As described in the comments, that code does the following:

  1. Create a client for Redis
    • Some implementations' stores/clients don't require to be closed, but when working with the interface (for example as function parameter) you must call Close() because you don't know which implementation is passed. Even if you work with a specific implementation you should always call Close(), so you can easily change the implementation without the risk of forgetting to add the call.
  2. Call interactWithStore(), which requires a gokv.Store as parameter. This method then:
    1. Stores an object of type foo in the Redis server running on localhost:6379 with the key foo123
    2. Retrieves the value for the key foo123
      • The check if the value was found isn't needed in this example but is included for demonstration purposes
    3. Prints the value. It prints foo: {Bar:baz}, which is exactly what was stored before.
    4. Deletes the value

Now let's say you don't want to use Redis but Consul instead. You just have to make three simple changes:

  1. Replace the import of "github.com/philippgille/gokv/redis" by "github.com/philippgille/gokv/consul"
  2. Replace redis.DefaultOptions by consul.DefaultOptions
  3. Replace redis.NewClient(options) by consul.NewClient(options)

Everything else works the same way. interactWithStore() is completely unaffected.

Project status

Note: gokv's API is not stable yet and is under active development. Upcoming releases are likely to contain breaking changes as long as the version is v0.x.y. You should use vendoring to prevent bad surprises. This project adheres to Semantic Versioning and all notable changes to this project are documented in RELEASES.md.

Planned interface methods until v1.0.0:

  • List(interface{}) error / GetAll(interface{}) error or similar

The interface might even change until v1.0.0. For example one consideration is to change Get(string, interface{}) (bool, error) to Get(string, interface{}) error (no boolean return value anymore), with the error being something like gokv.ErrNotFound // "Key-value pair not found" to fulfill the additional role of indicating that the key-value pair wasn't found. But at the moment we prefer the current method signature.

Also, more interfaces might be added. For example so that there's a SimpleStore and an AdvancedStore, with the first one containing only the basic methods and the latter one with advanced features such as key-value pair lifetimes (deletion of key-value pairs after a given time), notification of value changes via Go channels etc. But currently the focus is simplicity, see Design decisions.

Motivation

When creating a package you want the package to be usable by as many developers as possible. Let's look at a specific example: You want to create a paywall middleware for the Gin web framework. You need some database to store state. You can't use a Go map, because its data is not persisted across web service restarts. You can't use an embedded DB like bbolt, BadgerDB or SQLite, because that would restrict the web service to one instance, but nowadays every web service is designed with high horizontal scalability in mind. If you use Redis, MongoDB or PostgreSQL though, you would force the package user (the developer who creates the actual web service with Gin and your middleware) to run and administrate the server, even if she might never have used it before and doesn't know how to configure them for high performance and security.

Any decision for a specific database would limit the package's usability.

One solution would be a custom interface where you would leave the implementation to the package user. But that would require the developer to dive into the details of the Go package of the chosen key-value store. And if the developer wants to switch the store, or maybe use one for local testing and another for production, she would need to write multiple implementations.

gokv is the solution for these problems. Package creators use the gokv.Store interface as parameter and can call its methods within their code, leaving the decision which actual store to use to the package user. Package users pick one of the implementations, for example github.com/philippgille/gokv/redis for Redis and pass the redis.Client created by redis.NewClient(...) as parameter. Package users can also develop their own implementations if they need to.

gokv doesn't just have to be used to satisfy some gokv.Store parameter. It can of course also be used by application / web service developers who just don't want to dive into the sometimes complicated usage of some key-value store packages.

Initially it was developed as storage package within the project ln-paywall to provide the users of ln-paywall with multiple storage options, but at some point it made sense to turn it into a repository of its own.

Before doing so I examined existing Go packages with a similar purpose (see Related projects), but none of them fit my needs. They either had too few implementations, or they didn't automatically marshal / unmarshal passed structs, or the interface had too many methods, making the project seem too complex to maintain and extend, proven by some that were abandoned or forked (splitting the community with it).

Design decisions

  • gokv is primarily an abstraction for key-value stores, not caches, so there's no need for cache eviction and timeouts.
    • It's still possible to have cache eviction. In some cases you can configure it on the server, or in case of Memcached it's even the default. Or you can have an implementation-specific Option that configures the key-value store client to set a timeout on some key-value pair when storing it in the server. But this should be implementation-specific and not be part of the interface methods, which would require every implementation to support cache eviction.
  • The package should be usable without having to write additional code, so structs should be (un-)marshalled automatically, without having to implement MarshalJSON() / GobEncode() and UnmarshalJSON() / GobDecode() first. It's still possible to implement these methods to customize the (un-)marshalling, for example to include unexported fields, or for higher performance (because the encoding/json / encoding/gob package doesn't have to use reflection).
  • It should be easy to create your own store implementations, as well as to review and maintain the code of this repository, so there should be as few interface methods as possible, but still enough so that functions taking the gokv.Store interface as parameter can do everything that's usually required when working with a key-value store. For example, a boolean return value for the Delete method that indicates whether a value was actually deleted (because it was previously present) can be useful, but isn't a must-have, and also it would require some Store implementations to implement the check by themselves (because the existing libraries don't support it), which would unnecessarily decrease performance for those who don't need it. Or as another example, a Watch(key string) (<-chan Notification, error) method that sends notifications via a Go channel when the value of a given key changes is nice to have for a few use cases, but in most cases it's not required.
    • Note: In the future we might add another interface, so that there's one for the basic operations and one for advanced uses.

  • Similar projects name the structs that are implementations of the store interface according to the backing store, for example boltdb.BoltDB, but this leads to so called "stuttering" that's discouraged when writing idiomatic Go. That's why gokv uses for example bbolt.Store and syncmap.Store. For easier differentiation between embedded DBs and DBs that have a client and a server component though, the first ones are called Store and the latter ones are called Client, for example redis.Client.
  • All errors are implementation-specific. We could introduce a gokv.StoreError type and define some constants like a SetError or something more specific like a TimeoutError, but non-specific errors don't help the package user, and specific errors would make it very hard to create and especially maintain a gokv.Store implementation. You would need to know exactly in which cases the package (that the implementation uses) returns errors, what the errors mean (to "translate" them) and keep up with changes and additions of errors in the package. So instead, errors are just forwarded. For example, if you use the dynamodb package, the returned errors will be errors from the "github.com/aws/aws-sdk-go package.
  • Keep the terminology of used packages. This might be controversial, because an abstraction / wrapper unifies the interface of the used packages. But:
    1. Naming is hard. If one used package for an embedded database uses Path and another Directory, then how should be name the option for the database directory? Maybe Folder, to add to the confusion? Also, some users might already have used the packages we use directly and they would wonder about the "new" variable name which has the same meaning.
      Using the packages' variable names spares us the need to come up with unified, understandable variable names without alienating users who already used the packages we use directly.
    2. Only few users are going to switch back and forth between gokv.Store implementations, so most user won't even notice the differences in variable names.
  • Each gokv implementation is a Go module. This differs from repositories that contain a single Go module with many subpackages, but has the huge advantage that if you only want to work with the Redis client for example, the go get will only fetch the Redis dependencies and not the huge amount of dependencies that are used across the whole repository.

Related projects

  • libkv
    • Uses []byte as value, no automatic (un-)marshalling of structs
    • No support for Redis, BadgerDB, Go map, MongoDB, AWS DynamoDB, Memcached, MySQL, ...
    • Not actively maintained anymore (3 direct commits + 1 merged PR in the last 10+ months, as of 2018-10-13)
  • valkeyrie
    • Fork of libkv
    • Same disadvantage: Uses []byte as value, no automatic (un-)marshalling of structs
    • No support for BadgerDB, Go map, MongoDB, AWS DynamoDB, Memcached, MySQL, ...
  • gokvstores
    • Only supports Redis and local in-memory cache
    • Not actively maintained anymore (4 direct commits + 1 merged PR in the last 10+ months, as of 2018-10-13)
    • 13 stars (as of 2018-10-13)
  • gokv
    • Requires a json.Marshaler / json.Unmarshaler as parameter, so you always need to explicitly implement their methods for your structs, and also you can't use gob or other formats for (un-)marshaling.
    • No support for Consul, etcd, bbolt / Bolt, BadgerDB, MongoDB, AWS DynamoDB, Memcached, MySQL, ...
    • Separate repo for each implementation, which has advantages and disadvantages
    • No releases (makes it harder to use with package managers like dep)
    • 2-7 stars (depending on the repository, as of 2018-10-13)

Others:

  • gladkikhartem/gokv: No Delete() method, no Redis, embedded DBs etc., no Git tags / releases, no stars (as of 2018-11-28)
  • bradberger/gokv: Not maintained (no commits in the last 22 months), no Redis, Consul etc., no Git tags / releases, 1 star (as of 2018-11-28)
    • This package inspired me to implement something similar to its Codec.
  • ppacher/gokv: Not maintained (no commits in the last 22 months), no Redis, embedded DBs etc., no automatic (un-)marshalling, 1 star (as of 2018-11-28)
    • Nice CLI!
  • kapitan-k/gokvstore: Not actively maintained (no commits in the last 10+ months), RocksDB only, requires cgo, no automatic (un-)marshalling, no Git tags/ releases, 1 star (as of 2018-11-28)
Issues
  • Implement combiner package

    Implement combiner package

    Implements a combiner package that allows you to create a gokv.Store which forwards its call to multiple implementations at the same time. So for example you can use memcached and s3 simultaneously to have 1) super fast access but also 2) durable redundant persistent storage.

    Usage is included in the godoc. At the moment, we are missing unit tests for the new package.

    opened by sug0 13
  • Add license scan report and status

    Add license scan report and status

    Your FOSSA integration was successful! Attached in this PR is a badge and license report to track scan status in your README.

    Below are docs for integrating FOSSA license checks into your CI:

    opened by fossabot 2
  • Add implementation for MySQL

    Add implementation for MySQL

    While PostgreSQL is more popular among Gophers and maybe generally among projects with higher requirements (performance, features), MySQL is still the most popular open source relational database (management system).

    It's SQL, so not a key-value store, but that doesn't keep us from creating a table like Item with a k text column as primary key and v blob column, or something like that.

    It might be of use for people who already run MySQL and want to use gokv for simple key-value storage.

    Also, TiDB is compatible with the MySQL protocol, so as long as there aren't any major differences (some required client-side configuration for example) and it works, this would be a plus (TiDB is a popular "NewSQL" databases).

    enhancement 
    opened by philippgille 2
  • Add expiration support

    Add expiration support

    #86

    Defines two new interfaces:

    type SetterWithExp interface {
    	SetExp(k string, v interface{}, exp time.Duration) error
    }
    

    and

    type Cache interface {
    	Store
    	SetterWithExp
    }
    

    implemented for

    • Redis
    • Memcached
    • Freecache
    • Hazelcast
    • BadgerDB
    • etcd
    opened by tdakkota 1
  • Close stores/clients and delete local files after tests

    Close stores/clients and delete local files after tests

    Closes #40.

    The test doesn't delete anything when the test server runs in Docker, because the containers are ephemeral (--rm) anyway (at least they're started that way on Travis CI and they should be started that way locally as well).

    One future improvement could be to also delete all key-value pairs / buckets / tables from the cloud services, because only testing with the emulators isn't enough, so every now and then the real cloud services are tested with the existing test code. When the key-value pairs aren't deleted in that case, this can lead to storage costs.

    opened by philippgille 1
  • Add gokv.Store implementation for Apache Ignite

    Add gokv.Store implementation for Apache Ignite

    Apache Ignite seems to be one of the most popular multi-model open source databases. It has a key-value store mode, which seems to be meant to be used as cache, but Apache Ignite seems to be doing everything in-memory first, and then use their "durable memory" or "persistence" components to achieve durability.

    The key-value store mode is JCache compliant, see:

    Is Ignite a key-value store?

    Yes. Ignite provides a feature rich key-value API, that is JCache (JSR-107) compliant and supports Java, C++, and .NET.

    And: https://ignite.apache.org/use-cases/database/key-value-store.html

    The latter link includes the following bullet point regarding the JCache specification:

    • Pluggable Persistence

    So this seems to be the optimal way to use Ignite, but on the other hand there don't seem to be any Go packages for JCache. But then again, Ignite supports the Redis protocol (see here), has its own binary protocol (see here) and even a REST API (see here).

    • https://ignite.apache.org/index.html
    • https://apacheignite.readme.io/docs
    • https://apacheignite.readme.io/docs/data-grid
    • https://apacheignite.readme.io/docs/jcache
    • https://apacheignite.readme.io/docs/durable-memory
    • https://apacheignite.readme.io/docs/distributed-persistent-store
    enhancement 
    opened by philippgille 1
  • s3: Add option to bypass CreateBucket

    s3: Add option to bypass CreateBucket

    Multiple simultaneous calls (use case was multiple gokv-backed CLI utilities in a pipeline) to NewClient causes an error:

    A conflicting conditional operation is currently in progress against this resource.
    

    This occurs for S3 CreateBucket. Relying on the error to be awss3.ErrCodeBucketAlreadyOwnedByYou is fine, but the operation will still block other callers. This patch provides a mechanism to bypass bucket creation.

    opened by tomberek 0
  • Make creating the table optional

    Make creating the table optional

    It's pretty bad form to create cloud resources automatically, especially with such a generic default name.

    I would make it default to false but that would change the existing behaviour to much

    opened by nodefortytwo 4
  • Batch operations

    Batch operations

    Hello!

    Thank you for this wonderful library, I really like the simplicity of it.

    Would there be in the future support for batch updates and/or additions? For example BoltDB has support for Batch updates.

    opened by simar7 2
Releases(v0.6.0)
  • v0.6.0(Oct 13, 2019)

    • Added support for Go modules (issue #81)
      • All gokv.Store implementations are now separate Go modules
    • Added gokv.Store implementations:
      • Package hazelcast - A gokv.Store implementation for Hazelcast (issue #75)
    • Fixed: Compile error in badgerdb after a breaking change in BadgerDB 1.6.0
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Jan 12, 2019)

    • Added: Package encoding - An abstraction and wrapper for the core functionality of packages like encoding/json and encoding/gob (issue #47)
    • Added: Package sql - It contains shared code for SQL implementations. mysql and postgres already use it and if you want to create your own SQL implementation you can use it as well. (Useful for issue #57.)
    • Added gokv.Store implementations:

    Breaking changes

    • The MarshalFormat enums were removed from all packages that contained gokv.Store implementations. Instead the shared package encoding was introduced (required for issue #47)
    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Dec 5, 2018)

    • Added: Method Close() error (issue #36)
    • Added gokv.Store implementations:
      • Package mongodb - A gokv.Store implementation for MongoDB (issue #27)
      • Package dynamodb - A gokv.Store implementation for Amazon DynamoDB (issue #28)
      • Package memcached - A gokv.Store implementation for Memcached (issue #31)
      • Package mysql - A gokv.Store implementation for MySQL (issue #32)
    • Added: The factory function redis.NewClient() now checks if the connection to the Redis server works and otherwise returns an error.
    • Added: The test package now has the function func TestConcurrentInteractions(t *testing.T, goroutineCount int, store gokv.Store) that you can use to test your gokv.Store implementation with concurrent interactions.
    • Improved: The etcd.Client timeout implementation was improved.
    • Fixed: The Get() method of the bbolt store ignored errors if they occurred during the retrieval of the value
    • Fixed: Spelling in error message when using the etcd implementation and the etcd server is unreachable

    Breaking changes

    • The added Close() error method (see above) means that previous implementations of gokv.Store are not compatible with the interface anymore.
    • Renamed bolt package to bbolt to reflect the fact that the maintained fork is used. Also changed all other occurrences of "bolt" (e.g. in GoDoc comments etc.).
    • Due to the above mentioned addition to the Redis client factory function, the function signature changed from func NewClient(options Options) Client to func NewClient(options Options) (Client, error).
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Nov 17, 2018)

    • Added: Method Delete(string) error (issue #8)
    • Added: All gokv.Store implementations in this package now also support gob as marshal format as alternative to JSON (issue #22)
      • Part of this addition are a new field in the existing Options structs, called MarshalFormat, as well as the related MarshalFormat enum (custom type + related const values) in each implementation package
    • Added gokv.Store implementations:
      • Package badgerdb - A gokv.Store implementation for BadgerDB (issue #16)
      • Package consul - A gokv.Store implementation for Consul (issue #18)
      • Package etcd - A gokv.Store implementation for etcd (issue #24)

    Breaking changes

    • The added Delete(string) error method (see above) means that previous implementations of gokv.Store are not compatible with the interface anymore.
    • Changed: The NewStore() function in gomap and syncmap now has an Option parameter. Required for issue #22.
    • Changed: Passing an empty string as key to Set(), Get() or Delete() now results in an error
    • Changed: Passing nil as value parameter to Set() or as pointer to Get() now results in an error. This change leads to a consistent behaviour across the different marshal formats (otherwise for example encoding/json marshals nil to null while encoding/gob returns an error).
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Nov 6, 2018)

    • Added gokv.Store implementation:
      • Package gomap - A gokv.Store implementation for a plain Go map with a sync.RWMutex for concurrent access (issue #11)
    • Improved: Every gokv.Store implementation resides in its own package now, so when downloading the package of an implementation, for example with go get github.com/philippgille/gokv/redis, only the actually required dependencies are downloaded and compiled, making the process much faster. This is especially useful for example when creating Docker images, where in many cases (depending on the Dockerfile) the download and compilation are repeated for each build. (Issue #2)
    • Improved: The performance of bolt.Store should be higher, because unnecessary manual locking was removed. (Issue #1)
    • Fixed: The gokv.Store implementation for bbolt / Bolt DB used data from within a Bolt transaction outside of it, without copying the value, which can lead to errors (see here) (issue #13)

    Breaking changes

    • All gokv.Store implementations were moved into their own packages and the structs that implement the interface were renamed to avoid unidiomatic "stuttering".
    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Oct 13, 2018)

Owner
Philipp Gillé
Software engineer, progressive, cosmopolitan, globalist, futurist, technology maximalist - interested in #technology #innovation #blockchain #bitcoin #lightning
Philipp Gillé
Examples and code to assign a name to your MongoDB, MySQL, PostgreSQL, RabbitMQ, and redis connection.

your connection deserves a name ?? When your app interacts with an external system, assign a name to the connection. An external system in this contex

Andy Grunwald 25 Feb 15, 2022
Go-mongodb - Practice Go with MongoDB because why not

Practice Mongo DB with Go Because why not. Dependencies gin-gonic go mongodb dri

Rizky Syawal 0 Jan 5, 2022
Go Memcached client library #golang

About This is a memcache client library for the Go programming language (http://golang.org/). Installing Using go get $ go get github.com/bradfitz/gom

Brad Fitzpatrick 1.5k Jun 26, 2022
expressive DynamoDB library for Go

dynamo is an expressive DynamoDB client for Go, with an easy but powerful API. dynamo integrates with the official AWS SDK.

Greg 1000 Jun 28, 2022
Go driver for PostgreSQL over SSH. This driver can connect to postgres on a server via SSH using the local ssh-agent, password, or private-key.

pqssh Go driver for PostgreSQL over SSH. This driver can connect to postgres on a server via SSH using the local ssh-agent, password, or private-key.

mattn 47 Mar 3, 2022
GoBigdis is a persistent database that implements the Redis server protocol. Any Redis client can interface with it and start to use it right away.

GoBigdis GoBigdis is a persistent database that implements the Redis server protocol. Any Redis client can interface with it and start to use it right

Riccardo 5 Apr 27, 2022
Golang client for redislabs' ReJSON module with support for multilple redis clients (redigo, go-redis)

Go-ReJSON - a golang client for ReJSON (a JSON data type for Redis) Go-ReJSON is a Go client for ReJSON Redis Module. ReJSON is a Redis module that im

Nitish Malhotra 268 Jun 5, 2022
Redis client Mock Provide mock test for redis query

Redis client Mock Provide mock test for redis query, Compatible with github.com/go-redis/redis/v8 Install Confirm that you are using redis.Client the

null 120 Jun 22, 2022
Bxd redis benchmark - Redis benchmark tool for golang

使用 redis benchmark 工具, 测试 10 20 50 100 200 1k 5k 字节 value 大小,redis get set 性能。 r

bingxindan 0 Jan 22, 2022
Mongo Go Models (mgm) is a fast and simple MongoDB ODM for Go (based on official Mongo Go Driver)

Mongo Go Models Important Note: We changed package name from github.com/Kamva/mgm/v3(uppercase Kamva) to github.com/kamva/mgm/v3(lowercase kamva) in v

kamva 517 Jun 30, 2022
Books-rest api - Simple CRUD Rest API architecture using postgresql db with standard Library

books-rest_api Simple CRUD Rest API architecture using postgresql db with standa

Edho Guntur Adhitama 2 Feb 8, 2022
A MongoDB compatible embeddable database and toolkit for Go.

lungo A MongoDB compatible embeddable database and toolkit for Go. Installation Example Motivation Architecture Features License Installation To get s

Joël Gähwiler 387 Jun 19, 2022
The MongoDB driver for Go

The MongoDB driver for Go This fork has had a few improvements by ourselves as well as several PR's merged from the original mgo repo that are current

GlobalSign 1.9k Jun 24, 2022
The Go driver for MongoDB

MongoDB Go Driver The MongoDB supported driver for Go. Requirements Installation Usage Bugs / Feature Reporting Testing / Development Continuous Integ

mongodb 6.8k Jul 1, 2022
Qmgo - The Go driver for MongoDB. It‘s based on official mongo-go-driver but easier to use like Mgo.

Qmgo English | 简体中文 Qmgo is a Go driver for MongoDB . It is based on MongoDB official driver, but easier to use like mgo (such as the chain call). Qmg

Qiniu Cloud 920 Jul 1, 2022
💲 Golang, Go Fiber, RabbitMQ, MongoDB, Docker, Kubernetes, GitHub Actions

Bank Projeto para simular empréstimos financeiros em um banco para clientes Tecnologias Utilizadas Golang MongoDB RabbitMQ Github Actions Docker Hub D

Jailton Junior 4 Nov 16, 2021
Go-odm, a Golang Object Document Mapping for MongoDB.

A project of SENROK Open Source Go ODM Go-odm, a Golang Object Document Mapping for MongoDB. Table of contents Features Installation Get started Docum

SENROK 3 Jan 22, 2022
Golang MongoDB Integration Examples

Get Program Get a copy of the program: git clone https://github.com/hmdhszd/Go

Hamid Hosseinzadeh 1 Feb 1, 2022
Redis powered simple OTS service - contains two endpoints, to create and find a secret

Onetimesecret This is a simple service that stores and finds your secret. Small but powerfull service - does not have any unnesseccery dependencies. H

Dimitar Iliev 0 Nov 20, 2021