Go重写Redis中间件 - GO实现TCP服务器

GO实现TCP服务器

首先新建一个项目go-redis,将config和lib包放到项目中,config.go用来解析配置,比如端口、功能、DB数;lib包有两个文件夹,分别是logger和sync,其中logger.go是一个日志框架,sync包中的bool.go包装了atomic操作,因为atomic原生没有bool类型,所以将uint32类型改造成bool型的atomic,wait.go包装了WaitGroup等待组,多做的工作是将等待组增加一个超时功能,redis.conf配置文件写明我们redis要写在的端口和监听地址

正式开始

  • 新建一个接口文件夹,放一些全局用到的接口,首先是TCP层的handler.go,这个接口的目的是让handler.go代表一个抽象的业务逻辑,让TCP服务器只处理TCP层的连接,具体的业务扔给handler去做
type Handler interface {Handle(ctx context.Context, conn net.Conn)Close() error
}

TCP服务器开发

server.go

net.listen服务器监听端口地址,如果监听成功就调用Accept阻塞等待客户端连接,但这里我们将listener传给ListenAndServe方法,该方法传入三个参数,分别是listener,处理客户端业务的handler和传递关闭信号的channel,在其中for循环阻塞等待客户端连接,新的客户端过来后一个协程一个连接,将上下文ctx和conn句柄传入handler.Handle方法,然后我们只需在main函数里调用ListenAndServeWithSignal方法即可,但此时连接关闭和用户关闭窗口统一关闭所有客户端连接功能我们还没有处理

接下来我们就要着手改进,第一点就是我们这个for循环在不断阻塞接收新的连接,如果接收新连接出现错误后直接break,但此时我们已经有一些连接正在服务,所以我们需要等待已经连接的客户端退出,这里我们就要用到WaitGroup等待组,具体用法就是在每接收一个新的客户端连接后WaitGroup.Add(1),在接收新连接出错也就是break跳出fo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

前言 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利。 如…

短视频矩阵系统源码开发流程​

一、视频矩阵系统源码开发流程分为以下几个步骤: 四、技术开发说明: 产品原型PRD需求文档产品交互流程图部署方式说明完整源代码源码编译方式说明三方框架和SDK使用情况说明和代码位置平台操作文档程序架构文档 一、抖音SEO矩阵系统源码开发流程分为以…

【Linux】进程通信 — 共享内存

文章目录 📖 前言1. 共享内存2. 创建共享内存2.1 ftok()创建key值:2.2 shmget()创建共享内存:2.3 ipcs指令:2.4 shmctl()接口:2.5 shmat()/shmdt()接口:2.6 共享内存没有访问控制:2.7 通过管道对共享内存进…

Node.js写接口连接MySQL数据库

1.新建app.js粘贴以下代码 2.npm init 初始化 3.npm i 安装依赖 4.npm i mysql 5.npm i express 6. node app.js 启动接口 const express require(express) const mysql require(mysql) const bodyParser require(body-parser) const app express() const port 3006 const…

SpringSecurity的编写流程

目录 主要流程: 具体实现: 主要流程: (特殊)1、如果你需要返回json格式字符串,那么你首先需要编写相应的处理器,如果不需要则可直接写配置类 2、编写配置类 3、编写认证授权相关的mapper…

Python进行数据分析(详细教程)

1.为什么选择Python进行数据分析? Python是一门动态的、面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言。Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读一篇外语文章。Pyth…

保护 TDengine 查询性能——3.0 如何大幅降低乱序数据干扰?

在时序数据库(Time Series Database)场景下,乱序数据的定义为:“时间戳(timestamp)不按照递增顺序到达数据库的数据。”虽然它的定义很简单,但时序数据库需要有相应的处理逻辑来保证数据存储时的…

JavaScript进阶

一、函数 1.函数 greetWorld(); // Output: Hello, World!function greetWorld() {console.log(Hello, World!); } Another way to define a function is to use a function expression. To define a function inside an expression, we can use the function keyword. In a…

Jenkins搭建最简教程

纠结了一小会儿,到底要不要写这个,最终还是决定简单记录一下,因为Jenkins搭建实在是太简单了,虽然也有坑,但是坑主要在找稳定的版本上。 先学一个简称,LTS (Long Term Support) 属实是长见识了&#xff0c…

docker 搭建jenkins

1、拉取镜像 docker pull jenkins/jenkins:2.4162、创建文件夹 mkdir -p /home/jenkins_mount chmod 777 /home/jenkins_mount3、运行并构建容器 docker run --restartalways -d -p 10240:8080 -p 10241:50000 -v /home/jenkins_mount:/var/jenkins_home -v /etc/localtime:…

如何选择台式还是便携式多参数水质检测仪呢

选择台式还是便携式多参数水质检测仪主要取决于具体的使用需求和场景。 1.便携式多参数水质检测仪适用于需要在不同地点进行水质检测的情况,例如户外采样、实地调查等。它具有小巧轻便的特点,方便携带和操作,适合需要频繁移动或需要灵活使用的…

【LeetCode】152.乘积最大子数组

题目 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 子数组 是数组的连续子序列。 示例 1: 输入: nums […

前端框架学习-基础前后端分离

前端知识栈 前端三要素:HTML、CSS、JS HTML 是前端的一个结构层,HTML相当于一个房子的框架,可类比于毛坯房只有一个结构。CSS 是前端的一个样式层,有了CSS的装饰,相当于房子有了装修。JS 是前端的一个行为层&#xff…

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑:提升性能和延长使用寿命 😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦&…

AWVS 15.6 使用教程

目录 介绍 版本 AWVS具有以下特点和功能: 功能介绍: Dashboard功能: Targets功能: Scans功能: Vulnerabilities功能: Reports功能: Users功能: Scan Profiles功能&#x…

webpack中文文档

基本安装 首先我们创建一个目录,初始化 npm,然后 在本地安装 webpack,接着安装 webpack-cli(此工具用于在命令行中运行 webpack): mkdir webpack-demo cd webpack-demo npm init -y npm install webpack …

2023 年牛客多校第四场题解

A Bobo String Construction 题意:给定一个 01 01 01 字符串 t t t,构造一个长度为 n n n 的 01 01 01 串 s s s,使得 t t t 在 c o n c a t ( t , s , t ) {\rm concat}(t, s, t) concat(t,s,t) 中仅出现两次。多测, 1 ≤…

【数据结构】实验十二:图 查找

实验十二 图查找 一、实验目的与要求 1)掌握拓扑排序的应用; 2)掌握查找的概念和算法; 3)掌握查找的基本原理以及各种算法的实现; 4)掌握查找的应用。 二、实验内容 1. 用邻接表建立一…

WIZnet W51000S-EVB-PICO 入门教程(一)

概述 W5100S-EVB-Pico是基于树莓派RP2040和全硬件TCP/IP协议栈控制器W5100S的微控制器开发板-基本上与树莓派Pico板相同,但通过W5100S芯片增加了以太网功能。 W5100S-EVB-Pico特点 RP2040规格参数 双核Arm Cortex-M0 133MHz264KB 高速SRAM和2MB板载内存通过…

JAVA基础-多线程入门(详解)

目录 引言 一,线程概念 二,创建线程 2.1,继承Thread类,重写run方法 2.2,实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函 数的target 2.3,通…