Redeo构建 TCP 服务的高性能框架
Redeo 是用于构建与 redis 协议兼容的 TCP 服务器/服务的高性能框架。
这个仓库被组织成多个组成部分:
- root 包包含构建 redis 协议兼容的高性能服务器的框架
- resp 实现了用于处理 RESP(REdis 序列化协议)、客户端和服务器端的低级基元。它包含读者和作者读/写请求和响应的基本包装器
- 客户端包含一个极简的池化客户端
有关完整文档和示例,请参阅各个包和官方 API 文档:https : //godoc.org/github.com/bsm/redeo。
例子
带有两个命令的简单服务器示例:
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) }
更复杂的处理程序:
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 })) }
评论