github.com/hdt3213/godis@v1.2.9/README_CN.md (about)

     1  # Godis
     2  
     3  ![license](https://img.shields.io/github/license/HDT3213/godis)
     4  [![Build Status](https://github.com/hdt3213/godis/actions/workflows/coverall.yml/badge.svg)](https://github.com/HDT3213/godis/actions?query=branch%3Amaster)
     5  [![Coverage Status](https://coveralls.io/repos/github/HDT3213/godis/badge.svg?branch=master)](https://coveralls.io/github/HDT3213/godis?branch=master)
     6  [![Go Report Card](https://goreportcard.com/badge/github.com/HDT3213/godis)](https://goreportcard.com/report/github.com/HDT3213/godis)
     7  <br>
     8  [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge-flat.svg)](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  ![](https://i.loli.net/2021/05/15/oQM1yZ6pWm3AIEj.png)
    39  
    40  godis 默认监听 0.0.0.0:6399,可以使用 redis-cli 或者其它 redis 客户端连接 Godis 服务器。
    41  
    42  ![](https://i.loli.net/2021/05/15/7WquEgonzY62sZI.png)
    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 持久化实现