mirror of
				https://github.com/HDT3213/godis.git
				synced 2025-10-30 03:31:54 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			182 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Godis
 | |
| 
 | |
| [中文版](https://github.com/HDT3213/godis/blob/master/README_CN.md)
 | |
| 
 | |
| `Godis` is a simple implementation of Redis Server, which intents to provide an example of writing a high concurrent middleware using golang.
 | |
| 
 | |
| Please be advised, NEVER think about using this in production environment.
 | |
| 
 | |
| This repository implemented most features of redis, including 5 data structures, ttl, publish/subscribe, AOF persistence and server side cluster mode.
 | |
| 
 | |
| If you could read Chinese, you can find more details in [My Blog](https://www.cnblogs.com/Finley/category/1598973.html).
 | |
| 
 | |
| ## Running
 | |
| 
 | |
| You can get runnable program in the releases of this repository, which supports Linux and Darwin system.
 | |
| 
 | |
| ```bash
 | |
| ./godis-darwin
 | |
| ```
 | |
| 
 | |
| You could use redis-cli or other redis client to connect godis server, which listens on 127.0.0.1:6379 on default mode.
 | |
| 
 | |
| The program will try to read config file path from environment variable `CONFIG`.
 | |
| 
 | |
| If environment variable is not set, then the program  try to read `redis.conf` in the working directory. 
 | |
| 
 | |
| If there is no such file, then the program will run with default config.
 | |
| 
 | |
| ### cluster mode
 | |
| 
 | |
| Godis can work in cluster mode, please append following lines to redis.conf file
 | |
| 
 | |
| ```ini
 | |
| peers localhost:7379,localhost:7389 // other node in cluster
 | |
| self  localhost:6399 // self address
 | |
| ```
 | |
| 
 | |
| We provide node1.conf and node2.conf for demonstration. 
 | |
| use following command line to start a two-node-cluster:
 | |
| 
 | |
| ```bash
 | |
| CONFIG=node1.conf ./godis-darwin &
 | |
| CONFIG=node2.conf ./godis-darwin &
 | |
| ``` 
 | |
| 
 | |
| The cluster is transparent to client. You can connect to any node in the cluster to access all data in the cluster:
 | |
| 
 | |
| ```cmd
 | |
| redis-cli -p 6399
 | |
| ```
 | |
| 
 | |
| ## Commands
 | |
| 
 | |
| Supported Commands:
 | |
| 
 | |
| - Keys
 | |
|     - del
 | |
|     - expire
 | |
|     - expireat
 | |
|     - pexpire
 | |
|     - pexpireat
 | |
|     - ttl
 | |
|     - pttl
 | |
|     - persist
 | |
|     - exists
 | |
|     - type
 | |
|     - rename
 | |
|     - renamenx
 | |
| - Server
 | |
|     - flushdb
 | |
|     - flushall
 | |
|     - keys
 | |
|     - bgrewriteaof
 | |
| - String
 | |
|     - set
 | |
|     - setnx
 | |
|     - setex
 | |
|     - psetex
 | |
|     - mset
 | |
|     - mget
 | |
|     - msetnx
 | |
|     - get
 | |
|     - getset
 | |
|     - incr
 | |
|     - incrby
 | |
|     - incrbyfloat
 | |
|     - decr
 | |
|     - decrby
 | |
| - List
 | |
|     - lpush
 | |
|     - lpushx
 | |
|     - rpush
 | |
|     - rpushx
 | |
|     - lpop
 | |
|     - rpop
 | |
|     - rpoplpush
 | |
|     - lrem
 | |
|     - llen
 | |
|     - lindex
 | |
|     - lset
 | |
|     - lrange
 | |
| - Hash
 | |
|     - hset
 | |
|     - hsetnx
 | |
|     - hget
 | |
|     - hexists
 | |
|     - hdel
 | |
|     - hlen
 | |
|     - hmget
 | |
|     - hmset
 | |
|     - hkeys
 | |
|     - hvals
 | |
|     - hgetall
 | |
|     - hincrby
 | |
|     - hincrbyfloat
 | |
| - Set
 | |
|     - sadd
 | |
|     - sismember
 | |
|     - srem
 | |
|     - scard
 | |
|     - smembers
 | |
|     - sinter
 | |
|     - sinterstore
 | |
|     - sunion
 | |
|     - sunionstore
 | |
|     - sdiff
 | |
|     - sdiffstore
 | |
|     - srandmember
 | |
| - SortedSet
 | |
|     - zadd
 | |
|     - zscore
 | |
|     - zincrby
 | |
|     - zrank
 | |
|     - zcount
 | |
|     - zrevrank
 | |
|     - zcard
 | |
|     - zrange
 | |
|     - zrevrange
 | |
|     - zrangebyscore
 | |
|     - zrevrangebyscore
 | |
|     - zrem
 | |
|     - zremrangebyscore
 | |
|     - zremrangebyrank
 | |
| - Pub / Sub
 | |
|     - publish
 | |
|     - subscribe
 | |
|     - unsubscribe
 | |
| 
 | |
| # Read My Code
 | |
| 
 | |
| If you want to read my code in this repository, here is a simple guidance.
 | |
| 
 | |
| - cmd: only the entry point
 | |
| - config: config parser 
 | |
| - interface: some interface definitions
 | |
| - lib: some utils, such as logger, sync utils and wildcard
 | |
| 
 | |
| I suggest focusing on the following directories:
 | |
| 
 | |
| - tcp: the tcp server
 | |
| - redis: the redis protocol parser
 | |
| - datastruct: the implements of data structures
 | |
|     - dict: a concurrent hash map
 | |
|     - list: a linked list
 | |
|     - lock: it is used to lock keys to ensure thread safety
 | |
|     - set: a hash set based on map
 | |
|     - sortedset: a sorted set implements based on skiplist
 | |
| - db: the implements of the redis db
 | |
|     - db.go: the basement of database
 | |
|     - router.go: it find handler for commands 
 | |
|     - keys.go: handlers for keys commands
 | |
|     - string.go: handlers for string commands
 | |
|     - list.go: handlers for list commands
 | |
|     - hash.go: handlers for hash commands
 | |
|     - set.go: handlers for set commands
 | |
|     - sortedset.go: handlers for sorted set commands
 | |
|     - pubsub.go: implements of publish / subscribe
 | |
|     - aof.go: implements of AOF persistence and rewrite
 | |
|  
 | |
| # License
 | |
| 
 | |
| This project is licensed under the [GPL license](https://github.com/HDT3213/godis/blob/master/LICENSE). | 
