{"id":24838987,"url":"https://github.com/monitor1379/golds","last_synced_at":"2025-03-26T04:32:06.291Z","repository":{"id":118275061,"uuid":"255920674","full_name":"monitor1379/golds","owner":"monitor1379","description":"Golds: Go LevelDB Service","archived":false,"fork":false,"pushed_at":"2020-05-13T12:47:27.000Z","size":18,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-31T06:36:58.541Z","etag":null,"topics":["go","golang","leveldb","leveldb-service","redis-resp-tcp"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/monitor1379.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-15T13:11:26.000Z","updated_at":"2022-08-10T13:17:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"54e383b2-641c-4b79-9d56-02acba0df98d","html_url":"https://github.com/monitor1379/golds","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fgolds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fgolds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fgolds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monitor1379%2Fgolds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/monitor1379","download_url":"https://codeload.github.com/monitor1379/golds/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245589206,"owners_count":20640246,"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","golang","leveldb","leveldb-service","redis-resp-tcp"],"created_at":"2025-01-31T06:36:29.640Z","updated_at":"2025-03-26T04:32:06.286Z","avatar_url":"https://github.com/monitor1379.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Golds: Go LevelDB Service\n\nGolds(GO LevelDb Service)是一个轻量级的LevelDB网络服务器（协议）。该项目旨在提供一个基于磁盘的、简易的、高性能的KV数据库。\n\n# 功能特性\n\n- 性能高效: 底层基于Google高性能磁盘KV数据库LevelDB。\n- 协议简单: 采用类似Redis通信协议RESP的TCP数据传输协议，解析快速，人类可读。\n\n# 源码安装\n\n```bash\n$ go get github.com/monitor1379/golds\n$ cd $GOPATH/src/github.com/monitor1379/golds/cmd/golds-server\n$ go build\n\n$ cd $GOPATH/src/github.com/monitor1379/golds/cmd/golds-client\n$ go build\n```\n\n# 使用\n\n启动server的方式以及其默认参数:\n```bash\n$ golds-server\n$ golds-server --path=./db --port=1379\n```\n\n\n启动client的方式以及其默认参数:\n```bash\n$ golds-client\n$ golds-client --host=localhost --port=1379\n```\n\n\nclient中的命令使用类似redis:\n```bash\n(localhost:1379):SET k1 v1\nOK\n\n(localhost:1379):GET k1\n1): \"v1\"\n\n(localhost:1379):set k2 v2\nOK\n\n(localhost:1379):get k2\n1): \"v2\"\n\n(localhost:1379):KEYS\n0): \"k1\"\n1): \"k2\"\n```\n\n# API\n\n主要接口:\n- `func Dial(address string) (*golds.Client, error)`: 连接服务器\n- `func (*golds.Client) Set(key, value []byte) error`: SET操作\n- `func (*golds.Client) Get(key []byte) ([]byte, error)`: GET操作\n- `func (*golds.Client) Keys() ([][]byte, error)`: KEYS操作\n\n\n示例代码:\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/monitor1379/golds\"\n)\n\nfunc main() {\n\tclient, err := golds.Dial(\"localhost:1379\")\n\tdefer client.Close()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// set k1 v1\n\terr = client.Set([]byte(\"k1\"), []byte(\"v1\"))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// get k1\n\tvalue, err := client.Get([]byte(\"k1\"))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"value of 'k1' = \", string(value))\n\n\t// keys\n\tkeys, err := client.Keys()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor _, key := range keys {\n\t\tfmt.Println(string(key))\n\t}\n\n\t// del k1\n\terr = client.Del([]byte(\"k1\"))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// get k1\n\tvalue, err = client.Get([]byte(\"k1\"))\n\tif value != nil {\n\t\tfmt.Println(\"Error: value should be nil because db does not have key 'k1'\")\n\t\treturn\n\t}\n\n}\n\n```\n\n# 通信协议\n\nGolds的TCP通信协议采取类似Redis RESP协议的设计方式，特点为:\n- 实现简单\n- 快速地被计算机解析\n- 人类可读\n\n\n## 网络层\n\nGolds在(默认)端口1379上监听到来的TCP连接。客户端连接到来时，Golds服务器会创建一个TCP连接。在客户端与服务器端之间传输的每个Golds命令或者数据都以`\\n`结尾。\n\n\n## 请求与响应\n\nGolds接收由不同参数组成的命令。一旦收到命令，将会立刻被处理，并回复给客户端。\n\n## 协议定义\n\nGolds中，一个请求数据包或者一个响应数据包表示为一段字节数组。通过判断第一个字节，来判断该数据包的数据结构类型:\n\n- `+`: 单行字符串\n- `-`: 错误消息\n- `:`: 整型数字\n- `$`: 二进制安全字符串(Bulk String)，也可以理解为字节串\n- `*`: 数组\n\n例如:\n\n- `+OK\\n`: 该字节流会被解析成一个单行字符串数据包\n- `-Error: read db failed\\n`: 会被解析成一个错误消息数据包\n- `:123\\n`: 表示整数`123`\n- `$11\\nhello\\nworld\\n`: 表示一个长度为11的字节串`hello\\nworld`\n- `*2\\n:123\\n$5\\nhello\\n`: `*2`表示接下来的是一个数组，长度为2, 第一个元素为`:123`，整数类型，内容为123。第二个元素为`$5\\nhello`，一个长度为5个字节的字节串，内容为`hello`\n\n通过以上基础数据结构的序列化定义，我们可以设计命令的序列化方式。\n\n例如，`set key1 value1`命令的序列化数据为:\n```\n*3\n$3\nset\n$4\nkey1\n$5\nvalue1\n```\n\n\n`keys`命令的序列化数据为:\n```\n*1\n$4\nkeys\n```\n\n我们也可以通过Linux平台下的nc工具进行测试。例如，启动了server后，我们通过:\n```bash\n$ nc localhost 1379\n```\n来连接服务器。然后输入:\n```\n*1\n$4\nkeys\n```\n如果数据库中只存在两个key，分别为`k1`和`k2`，那么可以看到控制台中会打印:\n```\n*2\n$2\nk1\n$2\nk2\n```\n\n具体的代码可以参考`github.com/monitor1379/golds/goldscore`里的:\n- packet.go: 定义了数据包Packet的格式\n- packet_type.go: 定义了数据包的类型\n- packet_decoder.go: 从二进制数据流中解析出Packet的反序列化方法\n- packet_encoder.go: 将Packet序列化为二进制数据流的序列化方法\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonitor1379%2Fgolds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonitor1379%2Fgolds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonitor1379%2Fgolds/lists"}