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)!