自学内容网 自学内容网

golang实现简单的redis服务

golang 手搓redis服务器

仓库地址:

仓库: https://github.com/dengjiayue/my-redis.git

实现思路:

● 协议: tcp通信
● 数据包: 长度(4byte)+方法(1byte)+数据json
● 数据处理: 单线程map读写
○ 依次处理待处理队列的请求(chan)数据,处理并返回
■ 队列大小: Max指定
■ 构建请求处理池: 不需要反复创建chan

流程

性能压测:

package src

import (
"fmt"
"testing"
"time"
)



// 压测my redis
func BenchmarkMyRedisWrite(b *testing.B) {
c := NewClient("localhost:8080")
go c.HandleResp()
defer c.Close()
//开始计时
b.StartTimer()
for i := 0; i < b.N; i++ {
c.Set("name", "zhangsan")
}
// BenchmarkMyRedis-8      28090     40598 ns/op     642 B/op      14 allocs/op
}

// 压测my redis
func BenchmarkMyRedisRead(b *testing.B) {
c := NewClient("localhost:8080")
go c.HandleResp()
defer c.Close()
//开始计时
b.StartTimer()
for i := 0; i < b.N; i++ {
c.Get("name")
}
// BenchmarkMyRedisRead-8             27771             44423 ns/op             588
}

// 并发压测(写)
func BenchmarkMyRedisConcurrencyWrite(b *testing.B) {
c := NewClient("localhost:8080")
go c.HandleResp()
defer c.Close()
//开始计时
b.StartTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
c.Set("name", "zhangsan")
}
})
// BenchmarkMyRedisConcurrencyWrite-8      90667     12439 ns/op     612 B/op      14 allocs/op
}

// 并发压测(读)
func BenchmarkMyRedisConcurrencyRead(b *testing.B) {
c := NewClient("localhost:8080")
go c.HandleResp()
defer c.Close()
//开始计时
b.StartTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
c.Get("name")
}
})
// BenchmarkMyRedisConcurrencyRead-8      89955     12198 ns/op     512 B/op      15 allocs/op
}
  • 单tcp连接可以达到9w左右的读写的QPS

原文地址:https://blog.csdn.net/dengjiayue/article/details/144316856

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!