136 lines
3.8 KiB
Markdown
136 lines
3.8 KiB
Markdown
|
goredis
|
||
|
=======
|
||
|
|
||
|
[![GoDoc](https://godoc.org/github.com/xuyu/goredis?status.png)](https://godoc.org/github.com/xuyu/goredis)
|
||
|
|
||
|
redis client in golang
|
||
|
|
||
|
[Go or Golang](http://golang.org) is an open source programming language that makes it easy to build simple, reliable, and efficient software.
|
||
|
|
||
|
[Redis](http://redis.io) is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.
|
||
|
|
||
|
- Pure golang, and doesn't depend on any 3rd party libraries;
|
||
|
- Hight test coverage and will continue to improve;
|
||
|
- Tested under Go 1.2 and Redis 2.8.3;
|
||
|
- Tested under Go 1.2.1 and Redis 2.8.4;
|
||
|
|
||
|
|
||
|
Features
|
||
|
--------
|
||
|
|
||
|
* Python Redis Client Like API
|
||
|
* Support [Pipeling](http://godoc.org/github.com/xuyu/goredis#Pipelined)
|
||
|
* Support [Transaction](http://godoc.org/github.com/xuyu/goredis#Transaction)
|
||
|
* Support [Publish Subscribe](http://godoc.org/github.com/xuyu/goredis#PubSub)
|
||
|
* Support [Lua Eval](http://godoc.org/github.com/xuyu/goredis#Redis.Eval)
|
||
|
* Support [Connection Pool](http://godoc.org/github.com/xuyu/goredis#ConnPool)
|
||
|
* Support [Dial URL-Like](http://godoc.org/github.com/xuyu/goredis#DialURL)
|
||
|
* Support [monitor](http://godoc.org/github.com/xuyu/goredis#MonitorCommand), [sort](http://godoc.org/github.com/xuyu/goredis#SortCommand), [scan](http://godoc.org/github.com/xuyu/goredis#Redis.Scan), [slowlog](http://godoc.org/github.com/xuyu/goredis#SlowLog) .etc
|
||
|
|
||
|
|
||
|
Document
|
||
|
--------
|
||
|
|
||
|
- [Redis Commands](http://redis.io/commands)
|
||
|
- [Redis Protocol](http://redis.io/topics/protocol)
|
||
|
- [GoDoc](http://godoc.org/github.com/xuyu/goredis)
|
||
|
|
||
|
|
||
|
Simple Example
|
||
|
--------------
|
||
|
|
||
|
Connect:
|
||
|
|
||
|
client, err := Dial()
|
||
|
client, err := Dial(&DialConfig{Address: "127.0.0.1:6379"})
|
||
|
client, err := DialURL("tcp://auth:password@127.0.0.1:6379/0?timeout=10s&maxidle=1")
|
||
|
|
||
|
Try a redis command is simple too, let's do GET/SET:
|
||
|
|
||
|
err := client.Set("key", "value", 0, 0, false, false)
|
||
|
value, err := client.Get("key")
|
||
|
|
||
|
Or you can execute a custom command with Redis.ExecuteCommand method:
|
||
|
|
||
|
reply, err := client.ExecuteCommand("SET", "key", "value")
|
||
|
err := reply.OKValue()
|
||
|
|
||
|
And then a Reply struct which represent the redis response data is defined:
|
||
|
|
||
|
type Reply struct {
|
||
|
Type int
|
||
|
Error string
|
||
|
Status string
|
||
|
Integer int64 // Support Redis 64bit integer
|
||
|
Bulk []byte // Support Redis Null Bulk Reply
|
||
|
Multi []*Reply
|
||
|
}
|
||
|
|
||
|
Reply.Type is defined as:
|
||
|
|
||
|
const (
|
||
|
ErrorReply = iota
|
||
|
StatusReply
|
||
|
IntegerReply
|
||
|
BulkReply
|
||
|
MultiReply
|
||
|
)
|
||
|
|
||
|
Reply struct has many useful methods:
|
||
|
|
||
|
func (rp *Reply) IntegerValue() (int64, error)
|
||
|
func (rp *Reply) BoolValue() (bool, error)
|
||
|
func (rp *Reply) StatusValue() (string, error)
|
||
|
func (rp *Reply) OKValue() error
|
||
|
func (rp *Reply) BytesValue() ([]byte, error)
|
||
|
func (rp *Reply) StringValue() (string, error)
|
||
|
func (rp *Reply) MultiValue() ([]*Reply, error)
|
||
|
func (rp *Reply) HashValue() (map[string]string, error)
|
||
|
func (rp *Reply) ListValue() ([]string, error)
|
||
|
func (rp *Reply) BytesArrayValue() ([][]byte, error)
|
||
|
func (rp *Reply) BoolArrayValue() ([]bool, error)
|
||
|
|
||
|
You can find more examples in test files.
|
||
|
|
||
|
|
||
|
Run Test
|
||
|
--------
|
||
|
|
||
|
normal test:
|
||
|
|
||
|
go test
|
||
|
|
||
|
coverage test:
|
||
|
|
||
|
go test -cover
|
||
|
|
||
|
coverage test with html result:
|
||
|
|
||
|
go test -coverprofile=cover.out
|
||
|
go tool cover -html=cover.out
|
||
|
|
||
|
Welcome to report issues :)
|
||
|
|
||
|
|
||
|
Run Benchmark
|
||
|
-------------
|
||
|
|
||
|
go test -test.run=none -test.bench="Benchmark.*"
|
||
|
|
||
|
At my virtualbox Ubuntu 13.04 with single CPU: Intel(R) Core(TM) i5-3450 CPU @ 3.10GHz, get result:
|
||
|
|
||
|
BenchmarkPing 50000 40100 ns/op
|
||
|
BenchmarkLPush 50000 34939 ns/op
|
||
|
BenchmarkLRange 50000 41420 ns/op
|
||
|
BenchmarkGet 50000 37948 ns/op
|
||
|
BenchmarkIncr 50000 44460 ns/op
|
||
|
BenchmarkSet 50000 41300 ns/op
|
||
|
|
||
|
Welcome to show your benchmark result :)
|
||
|
|
||
|
|
||
|
License
|
||
|
-------
|
||
|
|
||
|
[The MIT License (MIT) Copyright (c) 2013 xuyu](http://opensource.org/licenses/MIT)
|