使用 Go 标准库编写的快速、简单的键值存储
Package pudge is a fast and simple key/value store written using Go's standard library.
It presents the following:
…
pudge.Set("strings", "Hello", "World")
pudge.Set("numbers", 1, 42)
type User struct {
Id int
Name string
}
u := &User{Id: 1, Name: "name"}
pudge.Set("users", u.Id, u)
Pudge is stateless and safe for use in goroutines. You don't need to create/open files before use. Just write data to pudge, don't worry about state. web server example
Pudge is parallel. Readers don't block readers, but a writer - does, but by the stateless nature of pudge it's safe to use multiples files for storages.
Default store system: like memcache + file storage. Pudge uses in-memory hashmap for keys, and writes values to files (no value data stored in memory). But you may use inmemory mode for values, with custom config:
cfg = pudge.DefaultConfig()
cfg.StoreMode = 2
db, err := pudge.Open(dbPrefix+"/"+group, cfg)
...
db.Counter(key, val)
In that case, all data is stored in memory and will be stored on disk only on Close.
Example server for highload, with http api
// Wait for interrupt signal to gracefully shutdown the server
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt, os.Kill)
7 order by keys asc limit 2 offset 0
pudge.BackupAll("backup")
Some databases very well for writing. Some of the databases very well for reading. But pudge is well balanced for both types of operations. It has small cute api, and don't have hidden graveyards. It's just hashmap where values written in files. And you may use one database for in-memory/persistent storage in a stateless stressfree way
Some tests, MacBook Pro (Retina, 13-inch, Early 2015)
Number of keys: 1000000 Minimum key size: 16, maximum key size: 64 Minimum value size: 128, maximum value size: 512 Concurrency: 2
| pogreb | goleveldb | bolt | badgerdb | pudge | slowpoke | pudge(mem) | |
|---|---|---|---|---|---|---|---|
| 1M (Put+Get), seconds | 187 | 38 | 126 | 34 | 23 | 23 | 2 |
| 1M Put, ops/sec | 5336 | 34743 | 8054 | 33539 | 47298 | 46789 | 439581 |
| 1M Get, ops/sec | 1782423 | 98406 | 499871 | 220597 | 499172 | 445783 | 1652069 |
| FileSize,Mb | 568 | 357 | 552 | 487 | 358 | 358 | 358 |
Number of keys: 10000000 Key size: 8 Value size: 16 Concurrency: 100
| goleveldb | badgerdb | pudge | |
|---|---|---|---|
| 10M (Put+Get), seconds | 165 | 120 | 243 |
| 10M Put, ops/sec | 122933 | 135709 | 43843 |
| 10M Get, ops/sec | 118722 | 214981 | 666067 |
| FileSize,Mb | 312 | 1370 | 381 |
暂无开放 Issues,或尚未同步最近议题。