{"id":13412387,"url":"https://github.com/bsm/redeo","last_synced_at":"2025-04-04T19:11:50.214Z","repository":{"id":14750303,"uuid":"17471482","full_name":"bsm/redeo","owner":"bsm","description":"High-performance framework for building redis-protocol compatible TCP servers/services","archived":false,"fork":false,"pushed_at":"2023-01-20T16:34:05.000Z","size":168,"stargazers_count":442,"open_issues_count":2,"forks_count":39,"subscribers_count":28,"default_branch":"main","last_synced_at":"2024-12-17T03:03:03.933Z","etag":null,"topics":["go","low-latency","redis","rpc","service"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bsm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-03-06T08:46:18.000Z","updated_at":"2024-11-26T03:22:17.000Z","dependencies_parsed_at":"2023-02-12T03:30:31.573Z","dependency_job_id":null,"html_url":"https://github.com/bsm/redeo","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsm%2Fredeo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsm%2Fredeo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsm%2Fredeo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bsm%2Fredeo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bsm","download_url":"https://codeload.github.com/bsm/redeo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247234922,"owners_count":20905854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","low-latency","redis","rpc","service"],"created_at":"2024-07-30T20:01:24.100Z","updated_at":"2025-04-04T19:11:50.188Z","avatar_url":"https://github.com/bsm.png","language":"Go","funding_links":[],"categories":["Database Drivers","\u003cspan id=\"数据库驱动-database-drivers\"\u003e数据库驱动 Database Drivers\u003c/span\u003e","Generators","数据库驱动程序","数据库驱动`连接和操作数据库工具`","数据库驱动","數據庫驅動","NoSQL Databases","Data Integration Frameworks","Go"],"sub_categories":["Advanced Console UIs","\u003cspan id=\"高级控制台用户界面-advanced-console-uis\"\u003e高级控制台用户界面 Advanced Console UIs\u003c/span\u003e","NoSQL Database Drivers","NoSQL数据库驱动程序","SQL 查询语句构建库","高級控制台界面","高级控制台界面"],"readme":"# Redeo\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/bsm/redeo/v2)](https://pkg.go.dev/github.com/bsm/redeo/v2)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\nThe high-performance Swiss Army Knife for building redis-protocol compatible servers/services.\n\n## Parts\n\nThis repository is organised into multiple components:\n\n* [root](./) package contains the framework for building redis-protocol compatible,\n  high-performance servers.\n* [resp](./resp/) implements low-level primitives for dealing with\n  RESP (REdis Serialization Protocol), client and server-side. It\n  contains basic wrappers for readers and writers to read/write requests and\n  responses.\n* [client](./client/) contains a minimalist pooled client.\n\nFor full documentation and examples, please see the individual packages and the\nofficial API documentation: https://godoc.org/github.com/bsm/redeo.\n\n## Examples\n\nA simple server example with two commands:\n\n```go\npackage main\n\nimport (\n  \"net\"\n\n  \"github.com/bsm/redeo/v2\"\n)\n\nfunc main() {\n\tsrv := redeo.NewServer(nil)\n\n\t// Define handlers\n\tsrv.HandleFunc(\"ping\", func(w resp.ResponseWriter, _ *resp.Command) {\n\t\tw.AppendInlineString(\"PONG\")\n\t})\n\tsrv.HandleFunc(\"info\", func(w resp.ResponseWriter, _ *resp.Command) {\n\t\tw.AppendBulkString(srv.Info().String())\n\t})\n\n\t// More handlers; demo usage of redeo.WrapperFunc\n\tsrv.Handle(\"echo\", redeo.WrapperFunc(func(c *resp.Command) interface{} {\n\t\tif c.ArgN() != 1 {\n\t\t\treturn redeo.ErrWrongNumberOfArgs(c.Name)\n\t\t}\n\t\treturn c.Arg(0)\n\t}))\n\n\t// Open a new listener\n\tlis, err := net.Listen(\"tcp\", \":9736\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer lis.Close()\n\n\t// Start serving (blocking)\n\tsrv.Serve(lis)\n}\n```\n\nMore complex handlers:\n\n```go\nfunc main() {\n\tmu := sync.RWMutex{}\n\tdata := make(map[string]string)\n\tsrv := redeo.NewServer(nil)\n\n\tsrv.HandleFunc(\"set\", func(w resp.ResponseWriter, c *resp.Command) {\n\t\tif c.ArgN() != 2 {\n\t\t\tw.AppendError(redeo.WrongNumberOfArgs(c.Name))\n\t\t\treturn\n\t\t}\n\n\t\tkey := c.Arg(0).String()\n\t\tval := c.Arg(1).String()\n\n\t\tmu.Lock()\n\t\tdata[key] = val\n\t\tmu.Unlock()\n\n\t\tw.AppendInt(1)\n\t})\n\n\tsrv.HandleFunc(\"get\", func(w resp.ResponseWriter, c *resp.Command) {\n\t\tif c.ArgN() != 1 {\n\t\t\tw.AppendError(redeo.WrongNumberOfArgs(c.Name))\n\t\t\treturn\n\t\t}\n\n\t\tkey := c.Arg(0).String()\n\t\tmu.RLock()\n\t\tval, ok := data[key]\n\t\tmu.RUnlock()\n\n\t\tif ok {\n\t\t\tw.AppendBulkString(val)\n\t\t\treturn\n\t\t}\n\t\tw.AppendNil()\n\t})\n}\n```\n\nRedeo also supports command wrappers:\n\n```go\nfunc main() {\n\tmu := sync.RWMutex{}\n\tdata := make(map[string]string)\n\tsrv := redeo.NewServer(nil)\n\n\tsrv.Handle(\"set\", redeo.WrapperFunc(func(c *resp.Command) interface{} {\n\t\tif c.ArgN() != 2 {\n\t\t\treturn redeo.ErrWrongNumberOfArgs(c.Name)\n\t\t}\n\n\t\tkey := c.Arg(0).String()\n\t\tval := c.Arg(1).String()\n\n\t\tmu.Lock()\n\t\tdata[key] = val\n\t\tmu.Unlock()\n\n\t\treturn 1\n\t}))\n\n\tsrv.Handle(\"get\", redeo.WrapperFunc(func(c *resp.Command) interface{} {\n\t\tif c.ArgN() != 1 {\n\t\t\treturn redeo.ErrWrongNumberOfArgs(c.Name)\n\t\t}\n\n\t\tkey := c.Arg(0).String()\n\t\tmu.RLock()\n\t\tval, ok := data[key]\n\t\tmu.RUnlock()\n\n\t\tif ok {\n\t\t\treturn val\n\t\t}\n\t\treturn nil\n\t}))\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsm%2Fredeo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbsm%2Fredeo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbsm%2Fredeo/lists"}