Redeo構(gòu)建 TCP 服務(wù)的高性能框架
Redeo 是用于構(gòu)建與 redis 協(xié)議兼容的 TCP 服務(wù)器/服務(wù)的高性能框架。
這個(gè)倉庫被組織成多個(gè)組成部分:
- root 包包含構(gòu)建 redis 協(xié)議兼容的高性能服務(wù)器的框架
- resp 實(shí)現(xiàn)了用于處理 RESP(REdis 序列化協(xié)議)、客戶端和服務(wù)器端的低級(jí)基元。它包含讀者和作者讀/寫請(qǐng)求和響應(yīng)的基本包裝器
- 客戶端包含一個(gè)極簡(jiǎn)的池化客戶端
有關(guān)完整文檔和示例,請(qǐng)參閱各個(gè)包和官方 API 文檔:https : //godoc.org/github.com/bsm/redeo。
例子
帶有兩個(gè)命令的簡(jiǎn)單服務(wù)器示例:
package main
import (
"net"
"github.com/bsm/redeo"
)
func main() {
srv := redeo.NewServer(nil)
// Define handlers
srv.HandleFunc("ping", func(w resp.ResponseWriter, _ *resp.Command) {
w.AppendInlineString("PONG")
})
srv.HandleFunc("info", func(w resp.ResponseWriter, _ *resp.Command) {
w.AppendBulkString(srv.Info().String())
})
// More handlers; demo usage of redeo.WrapperFunc
srv.Handle("echo", redeo.WrapperFunc(func(c *resp.Command) interface{} {
if c.ArgN() != 1 {
return redeo.ErrWrongNumberOfArgs(c.Name)
}
return c.Arg(0)
}))
// Open a new listener
lis, err := net.Listen("tcp", ":9736")
if err != nil {
panic(err)
}
defer lis.Close()
// Start serving (blocking)
srv.Serve(lis)
}
更復(fù)雜的處理程序:
func main() {
mu := sync.RWMutex{}
data := make(map[string]string)
srv := redeo.NewServer(nil)
srv.HandleFunc("set", func(w resp.ResponseWriter, c *resp.Command) {
if c.ArgN() != 2 {
w.AppendError(redeo.WrongNumberOfArgs(c.Name))
return
}
key := c.Arg(0).String()
val := c.Arg(1).String()
mu.Lock()
data[key] = val
mu.Unlock()
w.AppendInt(1)
})
srv.HandleFunc("get", func(w resp.ResponseWriter, c *resp.Command) {
if c.ArgN() != 1 {
w.AppendError(redeo.WrongNumberOfArgs(c.Name))
return
}
key := c.Arg(0).String()
mu.RLock()
val, ok := data[key]
mu.RUnlock()
if ok {
w.AppendBulkString(val)
return
}
w.AppendNil()
})
}
Redeo 還支持命令包裝器:
func main() {
mu := sync.RWMutex{}
data := make(map[string]string)
srv := redeo.NewServer(nil)
srv.Handle("set", redeo.WrapperFunc(func(c *resp.Command) interface{} {
if c.ArgN() != 2 {
return redeo.ErrWrongNumberOfArgs(c.Name)
}
key := c.Arg(0).String()
val := c.Arg(1).String()
mu.Lock()
data[key] = val
mu.Unlock()
return 1
}))
srv.Handle("get", redeo.WrapperFunc(func(c *resp.Command) interface{} {
if c.ArgN() != 1 {
return redeo.ErrWrongNumberOfArgs(c.Name)
}
key := c.Arg(0).String()
mu.RLock()
val, ok := data[key]
mu.RUnlock()
if ok {
return val
}
return nil
}))
}
評(píng)論
圖片
表情
