mirror of https://github.com/tidwall/tile38.git
122 lines
3.0 KiB
Go
122 lines
3.0 KiB
Go
|
package resp
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"os"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
func ExampleServer() {
|
||
|
// ExampleServer is a Redis clone that implements the SET and GET commands.
|
||
|
// The server runs on port 6380.
|
||
|
// You can interact using the Redis CLI (redis-cli) The http://redis.io/download.
|
||
|
// Or, use the telnet by typing in "telnet localhost 6380" and type in "set key value" and "get key".
|
||
|
// Or, use a client library such as "http://github.com/garyburd/redigo"
|
||
|
// The "QUIT" command will close the connection.
|
||
|
var mu sync.RWMutex
|
||
|
kvs := make(map[string]string)
|
||
|
s := NewServer()
|
||
|
s.HandleFunc("set", func(conn *Conn, args []Value) bool {
|
||
|
if len(args) != 3 {
|
||
|
conn.WriteError(errors.New("ERR wrong number of arguments for 'set' command"))
|
||
|
} else {
|
||
|
mu.Lock()
|
||
|
kvs[args[1].String()] = args[2].String()
|
||
|
mu.Unlock()
|
||
|
conn.WriteSimpleString("OK")
|
||
|
}
|
||
|
return true
|
||
|
})
|
||
|
s.HandleFunc("get", func(conn *Conn, args []Value) bool {
|
||
|
if len(args) != 2 {
|
||
|
conn.WriteError(errors.New("ERR wrong number of arguments for 'get' command"))
|
||
|
} else {
|
||
|
mu.RLock()
|
||
|
s, ok := kvs[args[1].String()]
|
||
|
mu.RUnlock()
|
||
|
if !ok {
|
||
|
conn.WriteNull()
|
||
|
} else {
|
||
|
conn.WriteString(s)
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
})
|
||
|
if err := s.ListenAndServe(":6380"); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func ExampleReader() {
|
||
|
raw := "*3\r\n$3\r\nset\r\n$6\r\nleader\r\n$7\r\nCharlie\r\n"
|
||
|
raw += "*3\r\n$3\r\nset\r\n$8\r\nfollower\r\n$6\r\nSkyler\r\n"
|
||
|
rd := NewReader(bytes.NewBufferString(raw))
|
||
|
for {
|
||
|
v, _, err := rd.ReadValue()
|
||
|
if err == io.EOF {
|
||
|
break
|
||
|
}
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
fmt.Printf("Read %s\n", v.Type())
|
||
|
if v.Type() == Array {
|
||
|
for i, v := range v.Array() {
|
||
|
fmt.Printf(" #%d %s, value: '%s'\n", i, v.Type(), v)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Output:
|
||
|
// Read Array
|
||
|
// #0 BulkString, value: 'set'
|
||
|
// #1 BulkString, value: 'leader'
|
||
|
// #2 BulkString, value: 'Charlie'
|
||
|
// Read Array
|
||
|
// #0 BulkString, value: 'set'
|
||
|
// #1 BulkString, value: 'follower'
|
||
|
// #2 BulkString, value: 'Skyler'
|
||
|
}
|
||
|
|
||
|
func ExampleWriter() {
|
||
|
var buf bytes.Buffer
|
||
|
wr := NewWriter(&buf)
|
||
|
wr.WriteArray([]Value{StringValue("set"), StringValue("leader"), StringValue("Charlie")})
|
||
|
wr.WriteArray([]Value{StringValue("set"), StringValue("follower"), StringValue("Skyler")})
|
||
|
fmt.Printf("%s", strings.Replace(buf.String(), "\r\n", "\\r\\n", -1))
|
||
|
// Output:
|
||
|
// *3\r\n$3\r\nset\r\n$6\r\nleader\r\n$7\r\nCharlie\r\n*3\r\n$3\r\nset\r\n$8\r\nfollower\r\n$6\r\nSkyler\r\n
|
||
|
}
|
||
|
|
||
|
func ExampleAOF() {
|
||
|
os.RemoveAll("appendonly.aof")
|
||
|
|
||
|
// create and fill an appendonly file
|
||
|
aof, err := OpenAOF("appendonly.aof")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
// append a couple values and close the file
|
||
|
aof.Append(MultiBulkValue("set", "leader", "Charlie"))
|
||
|
aof.Append(MultiBulkValue("set", "follower", "Skyler"))
|
||
|
aof.Close()
|
||
|
|
||
|
// reopen and scan all values
|
||
|
aof, err = OpenAOF("appendonly.aof")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer aof.Close()
|
||
|
aof.Scan(func(v Value) {
|
||
|
fmt.Printf("%s\n", v.String())
|
||
|
})
|
||
|
|
||
|
// Output:
|
||
|
// [set leader Charlie]
|
||
|
// [set follower Skyler]
|
||
|
}
|