golang实现简单的redis服务

ops/2024/12/12 23:03:11/

golang_redis_1">golang 手搓redis服务器

仓库地址:

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

实现思路:

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

流程

性能压测:

package srcimport ("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

http://www.ppmy.cn/ops/141369.html

相关文章

【前端知识】React简单入门

React语法介绍 概述一、产生背景与发展历程二、主要特点三、技术细节四、应用场景与优势五、学习与实践 JSX语法一、JSX的基本概念二、JSX的基本使用三、JSX中的JavaScript表达式四、JSX的条件渲染五、JSX的列表渲染六、JSX的样式处理七、JSX的其他注意事项 基础语法一、基础概…

关于tomcat如何设置自启动的设置

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明 1.1 硬件环境1.2 软件环境 二、Windows 下的设置服务自启 2.1 服务的注册2.2 开启自启 三、MacOS下设置服务自…

【Java基础知识】final和static

一、final final 关键字是 Java 中的一个修饰符&#xff0c;用于表示某个变量、方法或者类不能被修改。 final 可以用于修饰类、方法和变量&#xff08;局部变量&#xff0c;成员变量&#xff09;。 1、数据&#xff1a; 声明数据为常量&#xff0c;可以是编译时常量&#xf…

虚幻引擎的工程目录结构

虚幻引擎的工程目录结构如下&#xff1a; .idea/.vs&#xff1a;用于IDE&#xff08;如IntelliJ IDEA或Visual Studio&#xff09;的项目配置文件&#xff0c;包含工程设置和解决方案文件。 Binaries&#xff1a;存放编译后的可执行文件和相关的动态链接库&#xff08;DLL&…

分布式光伏电站中电能质量如何监测和治理?

1.概述 随着全球对可再生能源需求的增加&#xff0c;分布式光伏电站的建设和发展迅速。然而&#xff0c;分布式光伏电站的运行过程中面临着一系列问题&#xff0c;比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率&#xff0c;还会对…

uniapp中的@tap与@click:点击事件的微妙差异

在uniapp的开发过程中&#xff0c;我们经常会遇到两种点击事件&#xff1a;tap和click。虽然它们都是点击事件&#xff0c;但在实际使用中却存在一些微妙的差异。本文将详细解析这两种事件的区别&#xff0c;帮助开发者更好地理解和应用。 首先&#xff0c;让我们来看看它们的…

【Linux】grep命令

grep 是一个非常强大的文本搜索工具&#xff0c;它允许你搜索文件中的文本行&#xff0c;并输出匹配的行。以下是一些基本的 grep 命令使用案例&#xff0c;以及它们的解释&#xff1a; 1. 基础搜索 命令&#xff1a; grep "search_term" filename 解释&#xff…

CSS系列(5)-- Grid 布局详解

前端技术探索系列&#xff1a;CSS Grid 布局详解 &#x1f4cf; 致读者&#xff1a;掌握终极布局系统 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Grid 布局&#xff0c;这是最强大的 CSS 布局系统。通过本文&#xff0c;你将掌握如何使用 Grid 创建复…