当前位置: 首页 > news >正文

golang实现简单的redis服务

    • golang 手搓redis服务器
      • 仓库地址:
      • 实现思路:

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

相关文章:

golang实现简单的redis服务

golang 手搓redis服务器仓库地址:实现思路: golang 手搓redis服务器 仓库地址: 仓库: https://github.com/dengjiayue/my-redis.git 实现思路: ● 协议: tcp通信 ● 数据包: 长度(4byte)方法(1byte)数据json ● 数据处理: 单线程map读写 ○ 依次处理待处理队列的请求(chan)…...

QT QTableWidget::setModel”: 无法访问 private成员

//严重性代码说明项目文件行禁止显示状态 //错误C2248 “QTableWidget::setModel”: 无法访问 private 成员(在“QTableWidget”类中声明) QSqlQueryModel* sql_model; ui.tableView_database->setModel(sql_model); //ok ui.tableWidget_database->setModel(sql_model)…...

STM32:Bootloader(AB备份,自动回滚)

目录 1.STM32的升级方式2.IAP升级3.代码逻辑展示3.1 划分存储区域3.2 IAP的状态4.源码分析4.1 记录IAP的状态4.2 APP代码异常判断4.3 IAP状态的切换以及异常的处理逻辑4.4 完整的逻辑代码1.STM32的升级方式 1、ICP:In Circuit Programing,简单说就是在单片机开发时使用烧录器…...

数独小游戏(Matlab)

基于Matlab制作的数独小游戏 &#xff08;完整源码和介绍&#xff09; 感兴趣可以随时联系博主噢~常在线能秒回&#xff01; “Matlab数独小游戏”程序设计的关键技术流程和核心算法如下&#xff1a; 1.图形用户界面(GUI):使用MATLAB的GUIDE工具创建和管理用户界面&#xff0…...

使用docker让项目持续开发和部署

大多人选择开发时在本地&#xff0c;部署时文件都在容器里&#xff0c;如果没有容器&#xff0c;那就本地开发&#xff0c;没有映射文件&#xff0c;如果部署环境到容器了&#xff0c;容器内部启动时设置执行命令&#xff0c;再将映射的文件进行编译&#xff0c;这就直接能实现…...

电子应用设计方案-45:智能火锅系统方案设计

智能火锅系统方案设计 一、引言 随着人们生活水平的提高和对饮食体验的追求&#xff0c;智能火锅系统应运而生。本方案旨在设计一款集智能化控制、高效加热、安全保障和个性化体验于一体的智能火锅系统。 二、系统概述 1. 系统目标 - 实现精准的温度控制&#xff0c;满足不同…...

windows在conda下安装nlpia库

最近在学习《自然语言处理实战》这本书&#xff0c;书中用了其自己的库nlpia&#xff0c;我一直装不上&#xff0c;网上也找不到教程遂放弃&#xff0c;看到现在第四章没办法了&#xff0c;需要用到库里的一些文本语料&#xff0c;又折腾了一天&#xff0c;终于装好了&#xff…...

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了&#xff0c;也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是…...

apache部署若依前后端分离项目(开启SSL)

网站部署之后,大多数需要配置https,所以本章教程,介绍使用apache部署若依前后端项目的时候,如何开启SSL,以及如何配置SSL证书。 一、安装ssl模块 默认情况下,ssl模块是没有安装的。需要手动安装,否则直接配置SSL模块的时候,会报错。 sudo yum install mod_ssl二、查询s…...

Elasticsearch scroll 之滚动查询

Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制&#xff0c;特别是在需要从索引中检索大量数据时。通常情况下&#xff0c;Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…...

MySQL 内存使用率常用分析语句

最近连续遇到MySQL内存占用过高导致服务器内存不足的问题&#xff0c;整理下收集到的常用分析语句 一、 OS层 首先需要确认是否是MySQL占用的内存 top -p $(pidof mysqld) -n 1 或者 cat /proc/$(pidof mysqld)/status 二、 DB层 1. 全局情况 各种buffer pool大小&#xf…...

L20.【LeetCode笔记】用栈实现队列(方法2)(★详解★)

目录 1.实现方法 过程详解 1.执行push 1->push 2->push 3->push 4 2.执行第一个pop 3.执行第二个pop 4.执行push 5->push 6 ​编辑 5.执行pop->pop->pop 代码实现 队列创建函数myQueueCreate 入队函数myQueuePush 出队函数myQueuePop 返回队列开头…...

PR蒙太奇

简介 蒙太奇是将不同的镜头鬓角在一起&#xff0c;已不同的时间、地点来表现人物、环境、情节等&#xff0c;有时会产生意想不到的想过。广义上来说&#xff0c;这种剪接做法就是蒙太奇&#xff0c;是由镜头组合构成的隐式语言。 含义 镜头组接技巧 叙事蒙太奇&#xff1a;…...

高中数学:计数原理-排列组合

文章目录 一、排列排列数例题 二、组合组合数例题 三、使用方法总结 一、排列 排列数 例题 二、组合 组合数 例题 三、使用方法总结 组合&#xff1a;从n个元素中抽取m个元素&#xff0c;不排序&#xff0c;则用组合计算 排列&#xff1a;从n个元素中抽取m个元素&#xff0c;再…...

pytorch中有哪些归一化的方式?

在 PyTorch 中&#xff0c;归一化是一种重要的操作&#xff0c;用于调整数据分布或模型参数&#xff0c;以提高模型的训练效率和性能。以下是常见的归一化方式及其应用场景&#xff1a; 1. 数据归一化 &#xff08;1&#xff09;torch.nn.functional.normalize 对输入张量沿…...

Next.js系统性教学:增量静态再生成 (ISR) 完全解析

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 什么是增量静态再生成 (ISR)? 1.1 传统的静态生成与挑战 1.2 增量静态再生成&#xff08;ISR&#xff09;的出现 2. 如何使用增量静态再生成&#xff08;ISR&…...

视频编辑技术的发展:AI技术在小咖视频混剪中的应用

随着数字技术的飞速发展&#xff0c;视频编辑领域也迎来了革命性的变化。AI技术的引入&#xff0c;使得视频编辑变得更加智能和高效。本文将探讨AI技术在视频混剪领域的应用&#xff0c;并介绍一些实用的工具&#xff0c;帮助用户提升视频编辑的效率和质量。 视频演示 AI技术在…...

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么&#xff1f; JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…...

Python并发编程全解析

一、前言 在现代开发中,并发编程是提高性能、响应速度的关键技术之一。Python提供了多种实现并发的方式,如多线程、多进程和异步IO。本篇文章将逐一解析这些技术,探讨其适用场景,并通过代码示例帮助理解。 二、并发编程的核心概念 1. 并发与并行 并发:任务在时间片上交替…...

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...