Redeo构建 TCP 服务的高性能框架

联合创作 · 2023-09-30 04:32

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
}))
}

浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报