A simple, lightweight Go wrapper for key-value storage, powered by BadgerDB.
- π Simple and intuitive API
- πΎ Persistent embedded storage
- π ACID transactions
- β‘ High performance (backed by BadgerDB)
- π Built-in CRUD operations
- π¦ Easy store management (move, copy, drop)
package main
import (
"fmt"
"log"
"github.com/PLabInitDev/kvstore"
)
func main() {
// Create or open a store
store, err := kvstore.New(kvstore.Options{Name: "my_database"})
if err != nil {
log.Fatal(err)
}
// Create an item
item := store.Item([]byte("username"), []byte("john_doe"))
if err := item.Create(); err != nil {
log.Fatal(err)
}
// Retrieve an item
retrieved, err := store.GetItem([]byte("username"))
if err != nil {
log.Fatal(err)
}
fmt.Println(string(retrieved.GetValue())) // Output: john_doe
// Update an item
if err := retrieved.Update([]byte("jane_doe")); err != nil {
log.Fatal(err)
}
// Delete an item
if err := retrieved.Delete(); err != nil {
log.Fatal(err)
}
}// Basic store (stored in home directory)
store, err := kvstore.New(kvstore.Options{Name: "my_db"})
// Store with custom path
store, err := kvstore.New(kvstore.Options{
Name: "my_db",
Path: "/path/to/storage",
})
// Store with custom BadgerDB options
badgerOpts := badger.DefaultOptions("")
store, err := kvstore.New(kvstore.Options{
Name: "my_db",
BadgerOptions: &badgerOpts,
})Creates a new item. Returns an error if the key already exists.
item := store.Item([]byte("key"), []byte("value"))
err := item.Create()Retrieves an item by key.
item, err := store.GetItem([]byte("key"))
if err != nil {
// Handle error (key not found, etc.)
}
value := item.GetValue()Updates an existing item. Returns an error if the key doesn't exist.
item, _ := store.GetItem([]byte("key"))
err := item.Update([]byte("new_value"))Creates a new item or updates an existing one (no error if key exists).
item := store.Item([]byte("key"), []byte("value"))
err := item.Upsert()// Method 1: Delete via item
item, _ := store.GetItem([]byte("key"))
err := item.Delete()
// Method 2: Delete directly from store
err := store.DeleteItem([]byte("key"))exists, err := store.Exists()Closes and permanently deletes the store from the filesystem.
err := store.Drop()Moves the store to a new path. Blocks pending operations until complete.
err := store.Move("/new/path/to/store")Creates a backup copy at a new location. Doesn't block CRUD operations.
err := store.Copy("/backup/path/to/store")The package provides specific error types for better error handling:
KeyAlreadyExistsError- Key already exists (useUpdate()orUpsert())KeyNotFoundError- Key doesn't exist in the storeTransactionConflictError- Concurrent update conflictEmptyKeyError- Key is empty or nilCopyInProgressError- Copy operation already in progress
item := store.Item([]byte("key"), []byte("value"))
if err := item.Create(); err != nil {
switch err.(type) {
case *kvstore.KeyAlreadyExistsError:
// Handle duplicate key
case *kvstore.EmptyKeyError:
// Handle empty key
default:
// Handle other errors
}
}Run the test suite:
go test ./...Check out the samples directory for complete examples:
- CRUD Sample - Demonstrates basic CRUD operations
type Store interface {
GetItem(key []byte) (Item, error)
DeleteItem(key []byte) error
Item(key []byte, value []byte) Item
Exists() (bool, error)
Drop() error
Move(newPath string) error
Copy(newPath string) error
}type Item interface {
GetValue() []byte
GetKey() []byte
Create() error
Upsert() error
Update(newValue []byte) error
Delete() error
}- Go 1.18 or higher
This project uses BadgerDB as its underlying storage engine. Please refer to BadgerDB's license for details.
Contributions are welcome! Please feel free to submit issues or pull requests.
Built on top of BadgerDB - a fast key-value DB written in Go.