• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Redcon: Redcon 是一个采用 Go 开发的兼容 Redis 的 Key/Value 数据库

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

Redcon

开源软件地址:

https://gitee.com/mirrors/Redcon

开源软件介绍:

REDCON
GoDoc

Redis compatible server framework for Go

Features

  • Create a Fast custom Redis compatible server in Go
  • Simple interface. One function ListenAndServe and two types Conn & Command
  • Support for pipelining and telnet commands
  • Works with Redis clients such as redigo, redis-py, node_redis, and jedis
  • TLS Support
  • Compatible pub/sub support
  • Multithreaded

Installing

go get -u github.com/tidwall/redcon

Example

Here's a full example of a Redis clone that accepts:

  • SET key value
  • GET key
  • DEL key
  • PING
  • QUIT
  • PUBLISH channel message
  • SUBSCRIBE channel

You can run this example from a terminal:

go run example/clone.go
package mainimport (	"log"	"strings"	"sync"	"github.com/tidwall/redcon")var addr = ":6380"func main() {	var mu sync.RWMutex	var items = make(map[string][]byte)	var ps redcon.PubSub	go log.Printf("started server at %s", addr)	err := redcon.ListenAndServe(addr,		func(conn redcon.Conn, cmd redcon.Command) {			switch strings.ToLower(string(cmd.Args[0])) {			default:				conn.WriteError("ERR unknown command '" + string(cmd.Args[0]) + "'")			case "ping":				conn.WriteString("PONG")			case "quit":				conn.WriteString("OK")				conn.Close()			case "set":				if len(cmd.Args) != 3 {					conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")					return				}				mu.Lock()				items[string(cmd.Args[1])] = cmd.Args[2]				mu.Unlock()				conn.WriteString("OK")			case "get":				if len(cmd.Args) != 2 {					conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")					return				}				mu.RLock()				val, ok := items[string(cmd.Args[1])]				mu.RUnlock()				if !ok {					conn.WriteNull()				} else {					conn.WriteBulk(val)				}			case "del":				if len(cmd.Args) != 2 {					conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")					return				}				mu.Lock()				_, ok := items[string(cmd.Args[1])]				delete(items, string(cmd.Args[1]))				mu.Unlock()				if !ok {					conn.WriteInt(0)				} else {					conn.WriteInt(1)				}			case "publish":				if len(cmd.Args) != 3 {					conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")					return				}				conn.WriteInt(ps.Publish(string(cmd.Args[1]), string(cmd.Args[2])))			case "subscribe", "psubscribe":				if len(cmd.Args) < 2 {					conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")					return				}				command := strings.ToLower(string(cmd.Args[0]))				for i := 1; i < len(cmd.Args); i++ {					if command == "psubscribe" {						ps.Psubscribe(conn, string(cmd.Args[i]))					} else {						ps.Subscribe(conn, string(cmd.Args[i]))					}				}			}		},		func(conn redcon.Conn) bool {			// Use this function to accept or deny the connection.			// log.Printf("accept: %s", conn.RemoteAddr())			return true		},		func(conn redcon.Conn, err error) {			// This is called when the connection has been closed			// log.Printf("closed: %s, err: %v", conn.RemoteAddr(), err)		},	)	if err != nil {		log.Fatal(err)	}}

TLS Example

Redcon has full TLS support through the ListenAndServeTLS function.

The same example is also provided for serving Redcon over TLS.

go run example/tls/clone.go

Benchmarks

Redis: Single-threaded, no disk persistence.

$ redis-server --port 6379 --appendonly no
redis-benchmark -p 6379 -t set,get -n 10000000 -q -P 512 -c 512SET: 941265.12 requests per secondGET: 1189909.50 requests per second

Redcon: Single-threaded, no disk persistence.

$ GOMAXPROCS=1 go run example/clone.go
redis-benchmark -p 6380 -t set,get -n 10000000 -q -P 512 -c 512SET: 2018570.88 requests per secondGET: 2403846.25 requests per second

Redcon: Multi-threaded, no disk persistence.

$ GOMAXPROCS=0 go run example/clone.go
$ redis-benchmark -p 6380 -t set,get -n 10000000 -q -P 512 -c 512SET: 1944390.38 requests per secondGET: 3993610.25 requests per second

Running on a MacBook Pro 15" 2.8 GHz Intel Core i7 using Go 1.7

Contact

Josh Baker @tidwall

License

Redcon source code is available under the MIT License.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap