Documentation ¶
Overview ¶
Package simpledb is a Golang package which provides CRUD and search operations on records stored in Redis. It's based on Redigo.
Index ¶
- Constants
- Variables
- func GetRedisConn(redisAddr, redisPassword string) (c redis.Conn, err error)
- func GetRedisHashMaxZiplistEntries(c redis.Conn) (redisHashMaxZiplistEntries uint64, err error)
- type DB
- func (db *DB) BatchCreate(dataArr []string) (ids []string, err error)
- func (db *DB) BatchDelete(ids []string) (err error)
- func (db *DB) BatchGet(ids []string) (records []Record, err error)
- func (db *DB) BatchUpdate(records []Record) (err error)
- func (db *DB) Close()
- func (db *DB) Count() (count uint64, err error)
- func (db *DB) Create(data string) (id string, err error)
- func (db *DB) Delete(id string) (err error)
- func (db *DB) Exists(data string) (exists bool, err error)
- func (db *DB) Get(id string) (r Record, err error)
- func (db *DB) GetMaxBucketID() (maxBucketID uint64, err error)
- func (db *DB) GetMaxID() (maxID uint64, err error)
- func (db *DB) IDExists(id string) (exists bool, err error)
- func (db *DB) Info() (infoMap map[string]string, err error)
- func (db *DB) RegexpSearch(patterns []string) (ids [][]string, err error)
- func (db *DB) Search(pattern string) (ids []string, err error)
- func (db *DB) Update(record Record) error
- type Record
Examples ¶
Constants ¶
const ( // EstimatedMaxRecordNum is estimated max record number. EstimatedMaxRecordNum uint64 = 1000000 )
Variables ¶
var ( // DEBUG represents debug mode. It'll output debug messages if it's true. DEBUG = true )
Functions ¶
func GetRedisConn ¶
GetRedisConn gets the Redis connection.
Example ¶
package main import ( "log" "github.com/gomodule/redigo/redis" "github.com/northbright/simpledb" ) func main() { var err error var c redis.Conn log.Printf("\n") log.Printf("--------- GetRedisConn() Test Begin --------\n") if c, err = simpledb.GetRedisConn(":6379", ""); err != nil { goto end } defer c.Close() log.Printf("OK.\n") end: if err != nil { log.Printf("error: %v\n", err) } log.Printf("--------- GetRedisConn() Test End --------\n") }
Output:
func GetRedisHashMaxZiplistEntries ¶
GetRedisHashMaxZiplistEntries gets the Redis "hash-max-ziplist-entries" config value.
Example ¶
package main import ( "log" "github.com/gomodule/redigo/redis" "github.com/northbright/simpledb" ) func main() { var err error var c redis.Conn var redisHashMaxZiplistEntries uint64 = 0 log.Printf("\n") log.Printf("--------- GetRedisHashMaxZiplistEntries() Test Begin --------\n") if c, err = redis.Dial("tcp", ":6379"); err != nil { goto end } defer c.Close() if redisHashMaxZiplistEntries, err = simpledb.GetRedisHashMaxZiplistEntries(c); err != nil { goto end } log.Printf("Redis hash-max-ziplist-entries: %v\n", redisHashMaxZiplistEntries) end: if err != nil { log.Printf("error: %v\n", err) } log.Printf("--------- GetRedisHashMaxZiplistEntries() Test End --------\n") }
Output:
Types ¶
type DB ¶
type DB struct {
// contains filtered or unexported fields
}
DB represents a record collection stored in Redis server.
func (*DB) BatchCreate ¶
BatchCreate creates records in database.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} data := []string{ `{"name":"Frank Xu","tel":"13700137000"}`, `{"name":"Frank Wang","tel":"13600136000"}`, `{"name":"张三","tel":"13800138001"}`, `{"name":"李四","tel":"13800138002"}`, `{"name":"王大宝","tel":"13800138003"}`, `{"name":"王小宝","tel":"13800138003"}`, `{"name":"王宝多","tel":"13700137077"}`, } records := []simpledb.Record{} log.Printf("\n") log.Printf("--------- BatchCreate() Test Begin --------\n") db, _ = simpledb.Open(":6379", "", "student") defer db.Close() if ids, err = db.BatchCreate(data); err != nil { goto end } log.Printf("Result:\n") if records, err = db.BatchGet(ids); err != nil { goto end } for _, r := range records { log.Printf("id: %v, data: %v\n", r.ID, r.Data) } end: log.Printf("--------- BatchCreate() Test End --------\n") }
Output:
func (*DB) BatchDelete ¶
BatchDelete deletes multiple records in database by given ids.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} pattern := `*"name":"*"*` records := []simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- BatchDelete() Test Begin --------\n") // Get all records. if ids, err = db.Search(pattern); err != nil { goto end } if records, err = db.BatchGet(ids); err != nil { goto end } log.Printf("Search pattern: %v, Result:\n", pattern) for _, r := range records { log.Printf("id: %v, data: %v\n", r.ID, r.Data) } // Delete all record. if err = db.BatchDelete(ids); err != nil { goto end } // Search again after record deleted. if ids, err = db.Search(pattern); err != nil { goto end } log.Printf("Search again after record deleted. Result:\n") log.Printf("ids: %v\n", ids) end: log.Printf("--------- BatchDelete() Test End --------\n") }
Output:
func (*DB) BatchGet ¶
BatchGet returns multiple record data by given record ids.
Params ids: record id array. Return: records: record array.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} pattern := `*"name":"王*"*` records := []simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- BatchGet() Test Begin --------\n") if ids, err = db.Search(pattern); err != nil { goto end } if records, err = db.BatchGet(ids); err != nil { goto end } log.Printf("Search pattern: %v, Result:\n", pattern) for _, record := range records { log.Printf("id: %v, data: %v\n", record.ID, record.Data) } end: log.Printf("--------- BatchGet() Test End --------\n") }
Output:
func (*DB) BatchUpdate ¶
BatchUpdate updates multiple records by given ids and new data.
Params: records: record array to be updated.
Example ¶
package main import ( "log" "strings" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} pattern := `*"tel":"138*"*` oldRecords := []simpledb.Record{} newRecords := []simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- BatchUpdate() Test Begin --------\n") log.Printf("Search pattern: %v, Result:\n", pattern) if ids, err = db.Search(pattern); err != nil { goto end } if oldRecords, err = db.BatchGet(ids); err != nil { goto end } log.Printf("Result:\n") for _, r := range oldRecords { log.Printf("id: %v, data: %v\n", r.ID, r.Data) newRecords = append(newRecords, simpledb.Record{ID: r.ID, Data: strings.Replace(r.Data, "138", "186", -1)}) } if err = db.BatchUpdate(newRecords); err != nil { goto end } if newRecords, err = db.BatchGet(ids); err != nil { goto end } log.Printf("Batch update phone number from 138xxx to 186xxx.") for _, r := range newRecords { log.Printf("id: %v, data: %v\n", r.ID, r.Data) } end: log.Printf("--------- BatchUpdate() Test End --------\n") }
Output:
func (*DB) Count ¶
Count returns record count stored in Redis.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB var count uint64 db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- Count() Test Begin --------\n") if count, err = db.Count(); err != nil { goto end } log.Printf("Record count: %v\n", count) end: log.Printf("--------- Count() Test End --------\n") }
Output:
func (*DB) Create ¶
Create creates a new record in database.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB var record = simpledb.Record{} id := "" data := `{"name":"Bob Smith","tel":"13500135000"}` log.Printf("\n") log.Printf("--------- Create() Test Begin --------\n") db, _ = simpledb.Open(":6379", "", "student") defer db.Close() if id, err = db.Create(data); err != nil { goto end } if record, err = db.Get(id); err != nil { goto end } log.Printf("Result: id: %v, data: %v\n", record.ID, record.Data) end: log.Printf("--------- Create() Test End --------\n") }
Output:
func (*DB) Delete ¶
Delete deletes the record in database by given id.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} pattern := `*"name":"Frank Wang"*` record := simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- Delete() Test Begin --------\n") if ids, err = db.Search(pattern); err != nil { goto end } if len(ids) != 1 { goto end } if record, err = db.Get(ids[0]); err != nil { goto end } log.Printf("Search pattern: %v, Result:\n", pattern) log.Printf("id: %v, data: %v\n", record.ID, record.Data) // Delete if err = db.Delete(ids[0]); err != nil { goto end } // Search again after record deleted. if ids, err = db.Search(pattern); err != nil { goto end } log.Printf("Search again after record deleted. Result:\n") log.Printf("ids: %v\n", ids) end: log.Printf("--------- Delete() Test End --------\n") }
Output:
func (*DB) Get ¶
Get returns record data by given record id.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} pattern := `*"name":"Bob*"*` record := simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- Get() Test Begin --------\n") if ids, err = db.Search(pattern); err != nil { goto end } if len(ids) != 1 { goto end } if record, err = db.Get(ids[0]); err != nil { goto end } log.Printf("Search pattern: %v, Result:\n", pattern) log.Printf("id: %v, data: %v\n", record.ID, record.Data) end: log.Printf("--------- Get() Test End --------\n") }
Output:
func (*DB) GetMaxBucketID ¶
GetMaxBucketID gets the max record bucket id.
func (*DB) IDExists ¶
IDExists checks if record with given record id exists in database.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB exists := false id := "1" log.Printf("\n") log.Printf("--------- IDExists() Test Begin --------\n") db, _ = simpledb.Open(":6379", "", "student") defer db.Close() if exists, err = db.IDExists(id); err != nil { goto end } log.Printf("IdExsits(%v): %v\n", id, exists) end: log.Printf("--------- IDExists() Test End --------\n") }
Output:
func (*DB) Info ¶
Info returns the information of current DB.
Returns: infoMap: key: section, value: information.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB infoMap := make(map[string]string) db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- Info() Test Begin --------\n") if infoMap, err = db.Info(); err != nil { goto end } log.Printf("Info():\n") for k, v := range infoMap { log.Printf("%v: %v\n", k, v) } end: log.Printf("--------- Info() Test End --------\n") }
Output:
func (*DB) RegexpSearch ¶
RegexpSearch scans all indexes(record data) in database and use regexp patterns to find records which match the patterns.
Params: patterns: regexp pattern array. Ex: {`{"name":"Frank.+"}`,`{"tel":"136\d{8}"}`} Returns: ids: matched record ids arrays. Each array contains result IDs match the pattern.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := [][]string{} patterns := []string{ // Search UTF8 string. //`"name":"王.*宝"`, `王.+宝`, // Search name matches Frank* and tel matches 13700137000. `"Frank.*".*"tel":"13700137000"`, } records := []simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- RegexpSearch() Test Begin --------\n") if ids, err = db.RegexpSearch(patterns); err != nil { goto end } for i, p := range patterns { log.Printf("Regexp pattern: %v\n", p) if records, err = db.BatchGet(ids[i]); err != nil { goto end } log.Printf("Result:\n") for _, r := range records { log.Printf("id: %v, data: %v\n", r.ID, r.Data) } } end: log.Printf("--------- RegexpSearch() Test End --------\n") }
Output:
func (*DB) Search ¶
Search scans all indexes(record data) in database and use the pattern of Redis "SCAN" command to find records which match the pattern.
Params: pattern: pattern of Redis "SCAN" command. It'll return all record ID if pattern is empty. Ex: `{"name":"Frank*"}*` Returns: ids: matched record ids.
Example ¶
package main import ( "log" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} patterns := []string{ // Search UTF8 string. `*"name":"王*宝"*`, // Search name matches Frank* and tel matches 13700137000. `*"name":"Frank*"*"tel":"13700137000"*`, // Empty pattern: return all record ID. ``, } records := []simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- Search() Test Begin --------\n") for _, p := range patterns { log.Printf("Search pattern: %v\n", p) if ids, err = db.Search(p); err != nil { goto end } if records, err = db.BatchGet(ids); err != nil { goto end } log.Printf("Result:\n") for _, r := range records { log.Printf("id: %v, data: %v\n", r.ID, r.Data) } log.Printf("\n") } end: log.Printf("--------- Search() Test End --------\n") }
Output:
func (*DB) Update ¶
Update updates the record by given id and new data.
Example ¶
package main import ( "log" "strings" "github.com/northbright/simpledb" ) func main() { var err error var db *simpledb.DB ids := []string{} pattern := `*"name":"Bob*"*` record := simpledb.Record{} db, _ = simpledb.Open(":6379", "", "student") defer db.Close() log.Printf("\n") log.Printf("--------- Update() Test Begin --------\n") if ids, err = db.Search(pattern); err != nil { goto end } if len(ids) != 1 { goto end } if record, err = db.Get(ids[0]); err != nil { goto end } log.Printf("Search pattern: %v, Result:\n", pattern) log.Printf("id: %v, data: %v\n", record.ID, record.Data) // Change phone number from 135xxx to 138xxx. record.Data = strings.Replace(record.Data, "135", "158", -1) if err = db.Update(record); err != nil { goto end } log.Printf("Change phone number from 135xxx to 158xxx.") if record, err = db.Get(ids[0]); err != nil { goto end } log.Printf("Updated. id: %v, data: %v\n", record.ID, record.Data) end: log.Printf("--------- Update() Test End --------\n") }
Output: