golang高性能Redis服务器与集群实现插件库godis的使用

Golang高性能Redis服务器与集群实现插件库Godis的使用

Godis简介

Godis是一个用Golang实现的Redis服务器,旨在提供一个使用Golang编写高并发中间件的示例。

license

主要特性

  • 支持字符串、列表、哈希、集合、有序集合、位图
  • 并发核心以获得更好的性能
  • TTL过期机制
  • 发布/订阅功能
  • GEO地理位置功能
  • AOF持久化和AOF重写
  • RDB读写
  • 多数据库和SELECT命令
  • 事务具有原子性和隔离性,执行过程中遇到任何错误都会回滚已执行的命令
  • 复制功能
  • 服务端集群实现,对客户端透明,可以连接到集群中的任何节点访问所有数据

快速开始

启动服务

你可以从这个仓库的发布页面获取可执行程序,支持Linux和Darwin系统。

# Mac系统
./godis-darwin

# Linux系统
./godis-linux

Godis启动界面

你可以使用redis-cli或其他Redis客户端连接Godis服务器,默认监听在0.0.0.0:6399。

Redis客户端连接

集群模式

我们提供了node1.conf和node2.conf作为演示配置。使用以下命令启动一个两节点集群:

CONFIG=node1.conf ./godis-darwin &
CONFIG=node2.conf ./godis-darwin &

连接到集群中的任意节点访问所有数据:

redis-cli -p 6399

示例代码

基本使用示例

package main

import (
	"github.com/hdt3213/godis/client"
	"log"
)

func main() {
	// 连接到Godis服务器
	conn, err := client.MakeClient("127.0.0.1:6399")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	// 设置键值
	err = conn.Send("SET", "mykey", "Hello Godis")
	if err != nil {
		log.Fatal(err)
	}

	// 获取键值
	reply, err := conn.Receive()
	if err != nil {
		log.Fatal(err)
	}
	log.Println("SET reply:", reply)

	// 获取键值
	err = conn.Send("GET", "mykey")
	if err != nil {
		log.Fatal(err)
	}

	reply, err = conn.Receive()
	if err != nil {
		log.Fatal(err)
	}
	log.Println("GET reply:", reply)
}

集群模式示例

package main

import (
	"github.com/hdt3213/godis/client"
	"log"
)

func main() {
	// 连接到集群中的任意节点
	conn, err := client.MakeClusterClient("127.0.0.1:6399")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	// 在集群中设置多个键值
	err = conn.Send("MSET", "key1", "value1", "key2", "value2", "key3", "value3")
	if err != nil {
		log.Fatal(err)
	}

	reply, err := conn.Receive()
	if err != nil {
		log.Fatal(err)
	}
	log.Println("MSET reply:", reply)

	// 获取集群中的键值
	err = conn.Send("MGET", "key1", "key2", "key3")
	if err != nil {
		log.Fatal(err)
	}

	reply, err = conn.Receive()
	if err != nil {
		log.Fatal(err)
	}
	log.Println("MGET reply:", reply)
}

性能测试

测试环境:

  • Go版本:1.23
  • 系统:MacOS Monterey 12.5 M2 Air

Redis-benchmark测试结果:

PING_INLINE: 179211.45 requests per second, p50=1.031 msec                    
PING_MBULK: 173611.12 requests per second, p50=1.071 msec                    
SET: 158478.61 requests per second, p50=1.535 msec                    
GET: 156985.86 requests per second, p50=1.127 msec                    
INCR: 164473.69 requests per second, p50=1.063 msec                    
LPUSH: 151285.92 requests per second, p50=1.079 msec                    
RPUSH: 176678.45 requests per second, p50=1.023 msec                    
LPOP: 177619.89 requests per second, p50=1.039 msec                    
RPOP: 172413.80 requests per second, p50=1.039 msec                    
SADD: 159489.64 requests per second, p50=1.047 msec                    
HSET: 175131.36 requests per second, p50=1.031 msec                    
SPOP: 170648.45 requests per second, p50=1.031 msec                    
ZADD: 165289.25 requests per second, p50=1.039 msec                    
ZPOPMIN: 185528.77 requests per second, p50=0.999 msec                    
LPUSH (needed to benchmark LRANGE): 172117.05 requests per second, p50=1.055 msec                    
LRANGE_100 (first 100 elements): 46511.62 requests per second, p50=4.063 msec                   
LRANGE_300 (first 300 elements): 21217.91 requests per second, p50=9.311 msec                     
LRANGE_500 (first 500 elements): 13331.56 requests per second, p50=14.407 msec                    
LRANGE_600 (first 600 elements): 11153.25 requests per second, p50=17.007 msec                    
MSET (10 keys): 88417.33 requests per second, p50=3.687 msec  

代码结构

如果你想要阅读这个仓库的代码,这里有一个简单的指南:

  • 项目根目录:仅包含入口点
  • config:配置解析器
  • interface:一些接口定义
  • lib:一些工具,如日志记录器、同步工具和通配符

建议重点关注以下目录:

  • tcp:TCP服务器实现
  • redis:Redis协议解析器
  • datastruct:数据结构的实现
  • database:存储引擎的核心
  • cluster:集群实现
  • aof:AOF持久化实现

许可证

本项目采用GPL许可证。


更多关于golang高性能Redis服务器与集群实现插件库godis的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能Redis服务器与集群实现插件库godis的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Godis - 高性能Go语言Redis服务器与集群实现

godis是一个用Go语言实现的高性能Redis服务器和集群解决方案,它兼容Redis协议,可以作为Redis的替代品使用。下面我将详细介绍godis的使用方法。

1. 安装godis

go get github.com/hdt3213/godis

2. 基本使用

2.1 启动单机版Redis服务器

package main

import (
	"github.com/hdt3213/godis/config"
	"github.com/hdt3213/godis/tcp"
)

func main() {
	cfg := config.Config{
		Bind: "0.0.0.0",
		Port: 6379,
	}
	
	server, err := tcp.ListenAndServeWithSignal(&cfg, tcp.MakeHandler())
	if err != nil {
		panic(err)
	}
	
	server.Close()
}

2.2 客户端连接示例

package main

import (
	"fmt"
	"github.com/go-redis/redis/v8"
	"context"
)

func main() {
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // 无密码
		DB:       0,  // 默认DB
	})

	ctx := context.Background()
	
	// 设置键值
	err := client.Set(ctx, "key", "value", 0).Err()
	if err != nil {
		panic(err)
	}
	
	// 获取值
	val, err := client.Get(ctx, "key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("key:", val)
}

3. 集群模式

godis支持Redis集群模式,下面是集群配置示例:

3.1 集群配置

package main

import (
	"github.com/hdt3213/godis/cluster"
	"github.com/hdt3213/godis/config"
)

func main() {
	cfg := config.Config{
		Bind:           "0.0.0.0",
		Port:           6379,
		ClusterEnabled: true,
		Peers:          []string{"127.0.0.1:6379", "127.0.0.1:6380", "127.0.0.1:6381"},
		Self:           "127.0.0.1:6379",
	}
	
	server, err := cluster.ListenAndServeWithSignal(&cfg, cluster.MakeHandler())
	if err != nil {
		panic(err)
	}
	
	server.Close()
}

3.2 集群客户端连接

package main

import (
	"fmt"
	"github.com/go-redis/redis/v8"
	"context"
)

func main() {
	client := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: []string{"127.0.0.1:6379", "127.0.0.1:6380", "127.0.0.1:6381"},
	})
	
	ctx := context.Background()
	
	// 集群模式下设置键值
	err := client.Set(ctx, "cluster_key", "cluster_value", 0).Err()
	if err != nil {
		panic(err)
	}
	
	// 获取值
	val, err := client.Get(ctx, "cluster_key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("cluster_key:", val)
}

4. 高级特性

4.1 持久化配置

godis支持AOF和RDB持久化:

cfg := config.Config{
	AppendOnly:      true,       // 开启AOF
	AppendFilename:  "appendonly.aof",
	RDBFilename:     "dump.rdb", // RDB文件名
	Save:            "900 1 300 10 60 10000", // 保存策略
}

4.2 性能调优

cfg := config.Config{
	MaxClients:      10000,      // 最大客户端连接数
	Timeout:         300,        // 超时时间(秒)
	Databases:       16,         // 数据库数量
	MaxMemory:       "1GB",      // 最大内存限制
	MaxMemoryPolicy: "volatile-lru", // 内存淘汰策略
}

5. 监控与管理

godis提供了监控接口:

package main

import (
	"fmt"
	"github.com/hdt3213/godis/redis"
)

func main() {
	// 获取服务器信息
	info, err := redis.Info()
	if err != nil {
		panic(err)
	}
	fmt.Println(info)
	
	// 获取内存信息
	memInfo, err := redis.MemoryInfo()
	if err != nil {
		panic(err)
	}
	fmt.Println(memInfo)
}

6. 性能对比

godis在性能上做了大量优化:

  1. 使用高效的内存管理
  2. 优化的事件循环模型
  3. 零拷贝技术减少内存分配
  4. 协程池处理连接

根据基准测试,godis在大多数场景下性能接近原生Redis,某些场景下甚至优于Redis。

7. 注意事项

  1. godis兼容大部分Redis命令,但不支持所有Redis特性
  2. 生产环境使用前请充分测试
  3. 集群模式下需要确保节点间网络通畅
  4. 大键值对会影响性能

godis是一个优秀的Redis替代方案,特别适合Go技术栈的项目。它提供了与Redis兼容的API,同时利用了Go语言的高并发特性,是构建高性能缓存和数据存储系统的理想选择。

如需了解更多细节,请参考godis的官方文档和GitHub仓库。

回到顶部