github.com/hdt3213/godis@v1.2.9/README_CN.md (about) 1 # Godis 2 3  4 [](https://github.com/HDT3213/godis/actions?query=branch%3Amaster) 5 [](https://coveralls.io/github/HDT3213/godis?branch=master) 6 [](https://goreportcard.com/report/github.com/HDT3213/godis) 7 <br> 8 [](https://github.com/avelino/awesome-go) 9 10 Godis 是一个用 Go 语言实现的 Redis 服务器。本项目旨在为尝试使用 Go 语言开发高并发中间件的朋友提供一些参考。 11 12 关键功能: 13 - 支持 string, list, hash, set, sorted set, bitmap 数据结构 14 - 自动过期功能(TTL) 15 - 发布订阅 16 - 地理位置 17 - AOF 持久化及 AOF 重写 18 - 加载和导出 RDB 文件 19 - 主从复制 (测试中) 20 - Multi 命令开启的事务具有`原子性`和`隔离性`. 若在执行过程中遇到错误, godis 会回滚已执行的命令 21 - 内置集群模式. 集群对客户端是透明的, 您可以像使用单机版 redis 一样使用 godis 集群 22 - `MSET`, `MSETNX`, `DEL`, `Rename`, `RenameNX` 命令在集群模式下原子性执行, 允许 key 在集群的不同节点上 23 - 在集群模式下支持在同一个 slot 内执行事务 24 - 并行引擎, 无需担心您的操作会阻塞整个服务器. 25 26 可以在[我的博客](https://www.cnblogs.com/Finley/category/1598973.html)了解更多关于 27 Godis 的信息。 28 29 # 运行 Godis 30 31 在 GitHub 的 release 页下载 Darwin(MacOS) 和 Linux 版可执行文件。使用命令行启动 Godis 服务器 32 33 ```bash 34 ./godis-darwin 35 ./godis-linux 36 ``` 37 38  39 40 godis 默认监听 0.0.0.0:6399,可以使用 redis-cli 或者其它 redis 客户端连接 Godis 服务器。 41 42  43 44 godis 首先会从CONFIG环境变量中读取配置文件路径。若环境变量中未设置配置文件路径,则会尝试读取工作目录中的 redis.conf 文件。 若 redis.conf 文件不存在则会使用自带的默认配置。 45 46 ## 集群模式 47 48 godis 支持以集群模式运行,请在 redis.conf 文件中添加下列配置: 49 50 ```ini 51 peers localhost:7379,localhost:7389 // 集群中其它节点的地址 52 self localhost:6399 // 自身地址 53 ``` 54 55 可以使用 node1.conf 和 node2.conf 配置文件,在本地启动一个双节点集群: 56 57 ```bash 58 CONFIG=node1.conf ./godis-darwin & 59 CONFIG=node2.conf ./godis-darwin & 60 ``` 61 62 集群模式对客户端是透明的,只要连接上集群中任意一个节点就可以访问集群中所有数据: 63 64 ```bash 65 redis-cli -p 6399 66 ``` 67 68 ## 支持的命令 69 70 请参考 [commands.md](https://github.com/HDT3213/godis/blob/master/commands.md) 71 72 ## 性能测试 73 74 环境: 75 76 Go version:1.17 77 78 System: macOS Catalina 10.15.7 79 80 CPU: 2.6GHz 6-Core Intel Core i7 81 82 Memory: 16 GB 2667 MHz DDR4 83 84 redis-benchmark 测试结果: 85 86 ``` 87 PING_INLINE: 87260.03 requests per second 88 PING_BULK: 89206.06 requests per second 89 SET: 85034.02 requests per second 90 GET: 87565.68 requests per second 91 INCR: 91157.70 requests per second 92 LPUSH: 90334.23 requests per second 93 RPUSH: 90334.23 requests per second 94 LPOP: 90334.23 requests per second 95 RPOP: 90415.91 requests per second 96 SADD: 90909.09 requests per second 97 HSET: 84104.29 requests per second 98 SPOP: 82918.74 requests per second 99 LPUSH (needed to benchmark LRANGE): 78247.26 requests per second 100 LRANGE_100 (first 100 elements): 26406.13 requests per second 101 LRANGE_300 (first 300 elements): 11307.10 requests per second 102 LRANGE_500 (first 450 elements): 7968.13 requests per second 103 LRANGE_600 (first 600 elements): 6092.73 requests per second 104 MSET (10 keys): 65487.89 requests per second 105 ``` 106 107 ## 开发计划 108 109 + [x] `Multi` 命令 110 + [x] `Watch` 命令和 CAS 支持 111 + [ ] Stream 队列 112 + [ ] 加载 RDB 文件 113 + [ ] 主从模式 114 + [ ] 哨兵 115 116 ## 如何阅读源码 117 118 本项目的目录结构: 119 120 - 根目录: main 函数,执行入口 121 - config: 配置文件解析 122 - interface: 一些模块间的接口定义 123 - lib: 各种工具,比如logger、同步和通配符 124 125 建议按照下列顺序阅读各包: 126 127 - tcp: tcp 服务器实现 128 - redis: redis 协议解析器 129 - datastruct: redis 的各类数据结构实现 130 - dict: hash 表 131 - list: 链表 132 - lock: 用于锁定 key 的锁组件 133 - set: 基于hash表的集合 134 - sortedset: 基于跳表实现的有序集合 135 - database: 存储引擎核心 136 - server.go: redis 服务实例, 支持多数据库, 持久化, 主从复制等能力 137 - database.go: 单个 database 的数据结构和功能 138 - router.go: 将命令路由给响应的处理函数 139 - keys.go: del、ttl、expire 等通用命令实现 140 - string.go: get、set 等字符串命令实现 141 - list.go: lpush、lindex 等列表命令实现 142 - hash.go: hget、hset 等哈希表命令实现 143 - set.go: sadd 等集合命令实现 144 - sortedset.go: zadd 等有序集合命令实现 145 - pubsub.go: 发布订阅命令实现 146 - geo.go: GEO 相关命令实现 147 - sys.go: Auth 等系统功能实现 148 - transaction.go: 单机事务实现 149 - cluster: 集群 150 - cluster.go: 集群入口 151 - com.go: 节点间通信 152 - del.go: delete 命令原子性实现 153 - keys.go: key 相关命令集群中实现 154 - mset.go: mset 命令原子性实现 155 - multi.go: 集群内事务实现 156 - pubsub.go: 发布订阅实现 157 - rename.go: rename 命令集群实现 158 - tcc.go: tcc 分布式事务底层实现 159 - aof: AOF 持久化实现