自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 收藏
  • 关注

原创 项目整体流程图及框架展示

2024-07-21 15:46:34 230

原创 一篇带你了解什么是内网穿透?

我们的电脑(或服务器)在局域网中,使用的 IP 地址通常是10.x.x.x172.16.x.x等内网地址。公网(如阿里云、腾讯云等云服务器)使用的是可被全世界访问的公网 IP。当我们希望让互联网上的用户访问到我们在本地(内网)搭建的服务(例如 Django、Node.js、Spring Boot 等),如果没有公网 IP,直接使用这类内网地址是无法在外网访问到的。私有地址(内网 IP)不会在公网的路由中进行传播。

2025-03-10 18:36:24 923

原创 不知道开源Github工作流程,一文带你入门开源世界~

这样,你就完成了 GitHub 开源项目的完整贡献流程!

2025-02-20 12:06:10 468

原创 RPC调用初识

1.call id 的映射2.序列化和反序列化3.网络传输。

2025-01-13 23:43:15 407

原创 一文带你彻底吃透GO的context到底是个啥?

例如,如果用户请求取消某个操作,你可以通过上下文来实现。创建一个基础上下文。这些值可以在后续的函数调用中获取,方便传递一些请求特定的信息。允许在不同的 goroutine 之间传递值,但应谨慎使用,以避免过度依赖上下文中的值。就是帮助程序有效管理时间和资源的工具,让程序在处理多个任务时更有条理,避免资源浪费。,开发者可以高效地处理操作的取消和超时,从而提升程序的可靠性和可维护性。:如果你在做某个事情,比如下载文件,但你突然决定不想等了,你可以用。也可以在程序中传递一些信息,让其他部分的程序知道当前的状态。

2024-10-25 22:26:06 981

原创 事务原理,以及MVCC如何实现RC,RR隔离级别的

实现原子性就是,当我们delete一条数据的时候,undolog会存有对应的一条insert数据,当执行rollback的时候,就可以从undolog中读取相应的内容进行回滚;原来的两个事务其中一个修改了表的数据,然后另一个是读取不到的,因为事务的隔离级别为RR可重复读,然后我们加了个共享锁,或者是一下排他锁就变成了当前读,就可以读到最新的版本数据了。通过这种机制,即使其他事务在当前事务执行期间对数据做了修改,当前事务也只会读取到事务开始时的数据版本,实现了。:执行当前读的时候,读取的是最新的数据版本;

2024-10-02 00:02:37 1251

原创 如何用LRU-K解决预读失效,和缓存污染,只要两个链表足够了!

什么是预读失效,什么是缓存污染?预读失效和缓存污染就是我们添加的缓存,并没有大量被访问,并不是热点数据,也就是说把冷数据放到缓存中来做预读,那么就会失效去db中查,没有提升性能;LRU和LRU-K的区别是什么?

2024-09-26 11:28:09 537

原创 Epoll内核源码解析

epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);

2024-09-03 22:43:59 773

原创 C++语言特性常见问题

循环引用是指两个或多个对象相互持有对方的,导致内存无法释放。解决方案是将其中一个改为,从而打破循环引用,避免内存泄漏。引用计数的引用计数在创建、复制、移动和销毁时发生变化,用于管理对象的生命周期。弱引用计数的弱引用计数在创建、复制、移动和销毁时变化,不影响对象的生命周期,但用于监控对象是否仍然存在。当最后一个被销毁时,引用计数归零,对象会被销毁并释放内存。

2024-08-25 23:00:23 907

原创 HighConcurrencyCommFramework c++通讯服务器框架 :TCP粘包解决

用。

2024-08-23 23:41:06 1070

原创 论坛投票功能实现

controller层:先进行参数校验,获取用户id,然后进入logic层logicdao层:精华就怎么更新分数,因为当前来的请求有三种情况讨论,可以分为两个方向,然后再根据差值计算相乘最后投票功能完毕:

2024-08-16 23:35:39 273

原创 HighConcurrencyCommFramework c++通讯服务器框架 :Epoll:事件驱动技术

在单独的进程或者线程中运行,收集处理事件,没有上下文切换的消耗,高校;写小demo很简单,正经让epoll技术融合到商业环境中,那么难度很大;达到的效果:1.理解工作原理;2.开始写代码;3.认可nginx epoll 源码;并且能复用;四个函数对着源码讲一位网友的手写源码epolleventcallback();学完再看;

2024-08-14 23:35:18 1116

原创 JWT验证,以及限制一个设备登陆

jwt,即,是一种轻量级的认证的令牌,通常用于身份认证和授权。由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部(Header):JWT 的头部包含了两部分信息:令牌类型(typ)和签名算法(alg),用 Base64 编码后的字符串表示。载荷(Payload):JWT 的载荷包含了一些声明(Claims),用来表示一些实体(主题、发行者、过期时间等)和一些元数据。需要注意的是,载荷中的信息是可以被解码的,因此不要在 JWT 中存储敏感信息。

2024-08-13 00:44:46 438

原创 HighConcurrencyCommFramework c++通讯服务器框架 :网路通迅实战

服务器重启时,因先前连接处于TIME_WAIT状态,导致bind()失败的原因是操作系统在维护该端口的状态。使用选项可以解决这个问题,但需要注意可能的旧数据包冲突问题。三次握手: 首先客户端发起连接向服务器端发送SYN=1置位的数据包,此时客户端变成SYNSENT,然后服务器端收到并且回复ACK,SYN=1,此时服务器变为SYNRCVD,然后客户端收到ACK,并且也发送ACK过去自己变成ENSHTABLED,服务器端收到ACK也变成ENSTABLED 此时三次握手成功,连接建立,双向通信。

2024-07-31 08:22:54 786

原创 Postman 工具网站测试工具 (用于发送请求测试处理业务逻辑)

今天在写go web开发的时候,学会了用postman 这个工具很方便的发送了一个post请求,其中body包含 JSON 格式的。web 服务收到请求回复 success 及打印。

2024-07-29 16:05:01 239

原创 Zap 日志库学习打卡

分割日志{"level":"info","ts":1721976360.6491218,"caller":"zap_demo/main.go:120","msg":"/hello","status":200,"method":"GET","path":"/hello","query":"","ip":"::1","user-agent":"Mozilla/5.0 (Windows NT 10.0;

2024-07-26 16:59:15 258

原创 Viper 配置管理,非常实用方便

支持获取嵌套类型的值。

2024-07-26 16:55:40 301

原创 Listen(sockfd,backlog)监听函数的第二个参数到底是什么?深度解释

/当第三次握手完成后,,这个连接就变成了ESTABLISHED,每个已经完成三次握手的客户端,都放在这个队列中作为一项(从未完成连接拿走,不是拷贝,是移动)匿名地址连续向服务器发送syn包,然后,服务器端并没有发送回ack,也没有收到ack,导致未连接的队列会满掉大于backlog之和,进而导致真正的syn包没有收到。收到三次握手的第二次握手包,也就是服务器端返回的 syn ack 包的时候,这时候半连接建立了返回,经过了客户端的一个RTT。同时限制了半连接队列和全连接队列的大小之和。

2024-07-25 23:03:42 1144

原创 GO -操作mysql

fmt.Println("连接数据库mysql") //不能保证连接成功。//sql注入就是,传参的名字不合法如 “xxx”,不要自己拼接;fmt.Println("连接mysql失败")// 事务的相关方法 begin() commit。//批量执行同一条sql语句,考虑预处理提升性能。//做完错误检查之后,确保db不为nil。

2024-07-24 13:43:25 451

原创 HighConcurrencyCommFramework c++通讯服务器框架 :目录,修改标题,配置,日志打印

fsync(int fd)将fd对应的文件的快缓冲区立即写入磁盘,并等待实际写磁盘操作返回,全部都影响,属性和数据;sync(void)将所有修改过的块缓冲区排入写队列,然后返回,并不等待实际写磁盘操作,数据是否写入磁盘没有保证。父子进程共享文件描述符,那么就是子进程写完之后,父进程紧随其后写,因此同时写进一个日志的时候不会混乱;argv:是个数组,每个数组元素都是指向一个字符串的char*,存的是命令行参数。每次写数据,必须要大块大块的写数据,一般都4k 4k的写,节省系统调用的次数;

2024-07-21 17:24:05 416

原创 GO channel 学习

如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也。Go 语言中的通道(channel)是一种特殊的类型。

2024-07-11 23:24:05 292

原创 shared_ptr 线程安全

对象都被销毁或重置时,对象的引用计数才会归零,从而触发对象的析构函数调用,释放对象所占用的资源。的引用计数是线程安全的。对象如果互相指向同一个对象,它们的引用计数永远不会为零,这是因为每个。指向某个对象时,该对象都不会被提前释放,直到所有相关的。对象内部维护一个计数器(引用计数),用于跟踪有多少个。复制构造函数或赋值操作后,引用计数增加到 2。所指向的对象时,需要额外的同步机制来确保线程安全。只有当所有指向该对象的。它们的引用计数在创建时为 1,当。因为shared_ptr。具体来说,如果有两个。

2024-07-07 23:28:54 264

原创 HighConcurrencyCommFramework c++通讯服务器框架 :简介-信号处理

该项目是使用 C++ 实现的高并发服务器脚手架,包含线程池和连接池等技术,支持开发者进行二次开发复用,只需 要添加对应业务逻辑即可完成通信服务器、网络交易,游戏通讯框架等。//-:nginx简介//nginx(2002年开发,2004年10才出现第一个版本0.1.0):web服务器,市场份额,排在第二位,Apache(1995)第一位;//web服务器,反向代理,负载均衡,邮件代理;运行时需要的系统资源比较少,所以经常被称呼为轻重级服务器;

2024-07-04 11:00:00 1979

原创 STL 线程安全

所有的 STL 容器在多线程环境中都需要使用同步机制来确保线程安全。使用进行同步是一个常见的方法。通过仔细设计锁的使用范围和策略,可以在保证线程安全的同时,尽量减少对性能的影响。

2024-07-03 23:14:25 932

原创 back-end developer 后端开发的一些常识

当订单量增加时,你可以增加更多送货员(扩展容器),当某个送货员生病时,你可以立即派其他人顶替(自动恢复)。你有一本笔记本(Redis),记录了每种食物的库存情况(数据存储)。: 假设你在网上购物。浏览器会将你的订单信息(如商品名称、价格、数量)转换成JSON格式(打包成一个轻便的小包裹),然后发送给服务器。服务员(生产者)将订单(消息)放在一个传送带上(消息队列),你(消费者)从传送带上取下订单并制作食物。无论你搬到哪儿(不同的计算环境),只要打开箱子,里面的物品都能立刻使用,不需要重新整理(配置环境)。

2024-07-03 23:13:18 841

原创 IP分片的隐患,以及TCP分片

好的,我们来用一个生活中的例子更详细地解释 MTU、MSS,以及 IP 和 TCP 分片。

2024-06-10 17:02:02 1336

原创 设计模式:单例模式

o文件中包含了代码和数据的符号信息,以及未初始化变量的符号和大小(在.bss段中),已初始化变量的符号和初始值(在.data段中)。程序执行前:.o文件中的符号还没有具体的内存地址,但已经安排到相应的段中等待链接和加载。加载时:操作系统会将.bss段清零,将.data段加载到内存并初始化相应的变量。通过以上描述,你可以更清晰地了解静态成员变量在编译、链接和加载过程中的处理。运行时;

2024-06-10 16:30:18 1126

原创 一个通俗易懂的例子,带你彻底明白 同步异步,阻塞非阻塞

阻塞I/O:程序等待I/O操作完成,不能做其他事情。非阻塞I/O:程序发出I/O请求后,可以继续做其他事情,但需要不断检查I/O是否完成。同步I/O:程序等待I/O操作完成,按顺序执行任务。异步I/O:程序发出I/O请求后,立即继续做其他事情,I/O操作在后台完成,并在完成后通知程序。

2024-05-28 08:36:04 383

原创 C++实现基于http协议的epoll非阻塞模型的web服务器框架(支持访问服务器目录下文件的解析)

服务器的IP地址:端口 应用层协议使用:http,数据需要在浏览器端使用该协议进行包装响应消息的处理也是浏览器完成的 => 程序猿不需要管-客户端通过ur1访问服务器资源。客户端发送给的请求消息是基于http的 -需要能够解析http请求 服务器回复客户端数据,使用http协议封装回复的数据=>http响应。content-length :服务器给客户端的数据快的长度==http协议的第四块的数据块的长度,总字节数;响应的数据,根据客户端请求给客户端回复的数据。第一部分:GET :提交的数据的方式。

2024-05-23 22:54:45 1061

原创 IO 多路复用 来了(最详细版)

函数返回时,返回的结果集合可能会比监视集合小,因为只会返回发生了事件的套接字的文件描述符。不能跨平台,select有1024最大的并发上线,poll是没有的,select和poll都是线性的,而poll是动态数组,内部是链表,效率不高。3.在调用select的时候需要我们通过参数的形式将要检测到文件描述符的集合传递内核中去,内核根据这个集合进行的文件描述符的状态检测。由于是非阻塞,缓存区一直再读,如果没有数据了,非阻塞还是会继续读,然后会报错误read ,recv失败了,返回-1;

2024-05-09 20:21:53 937

原创 TCP通信并发:

上次的程序只能保持,单线程或者进程。

2024-05-05 13:32:53 342 1

原创 汇报进度26届cpp,目前来说之后的规划,暑假打算回家10天就留校沉淀了

一切都好吧,反正挺焦虑的,踏踏实实的学,加油附上我的菜鸡日常。

2024-05-03 00:59:42 295

原创 pthread线程相关

exit(0);return;被杀死的线程,然后回收之后,退出值是-1;pthread cancel0)杀死线程必须要到达“取消点”(保存点),才能生效否则无法杀死线程。应该在被cancel的线程中,调用 pthread testcancel() 函数 来 添加“取消点”(保存点)。。

2024-05-02 22:38:19 791

原创 TCP三次握手,四次挥手

在程序中服务器端和客户端程序都调用了close()函数,四次挥手就完成了。6.窗口大小 :接收端通知发送端 缓存剩余的容量,如果为0,发送端阻塞。//断开链接的过程,四次挥手完成之后,双向连接被双向断开。//断开连接的请求可以由客户端发起,也可以有服务器发起。调用close (通信的文件描述符)函数,连接断开。图中是客户端先断开连接,其实服务器端先断开也可以。序号:客户端或者服务器端生成的随机数。源端口 :当前的进程端口,2字节。//需要用到的标志位:FIN,ACK。目的端口:对方的端口 ,2字节。

2024-05-01 23:26:29 534 1

原创 初见成效!!TCP连接成功(最易懂)

客户端发送连接请求,写到 writebuffer 里面,然后cfd 链接监听的文件描述符 lfd 的readbuffer里面调用发送数据的函数,并没有发送出去,而是到了内核的写缓冲区里面,内核检测到写缓冲有数据,会将数据发送到网络的另外一端如果是通信,就会进入对方的读缓冲区,双方都是通信套接字,然后对方调用一个read函数,就可以取出write();

2024-05-01 00:30:12 1445 1

原创 TCP通信 ,客户端服务端流程

安全的:通信过程会对通信进行校验,判断对方有没有接受到发送的数据,如果没有接受(数据丢失)会对数据进行重传。4.等待并且接受客户端连接(无连接阻塞等待,有连接解除阻塞),得到新的描述符用于通信的文件描述符。6.断开连接,关闭文件描述符(可以关闭监听,也可以关闭通信)5.使用accept返回值对应的通信文件描述符和客户端通信。2.使用得到的通信文件描述符连接服务器,通过ip和端口去找。2.让监听的文件描述符和本地的ip+端口进行绑定。1.创建用于通信的套接字==(文件描述符)连接:三次握手,建立双向链接。

2024-05-01 00:09:01 827 1

原创 linux网络编程启动!(开端)

在B/S模型中,用户通过浏览器与服务器进行通信,而在C/S模型中,用户通过客户端与服务器进行通信,例如QQ和微信等应用程序。HTTP和HTTPS之间的加密层,以及IP地址和端口的重要性。IP协议有IPv4和IPv6两种版本,而端口则用于定位主机上运行的特定进程的地址。了解到如何使用ping命令和ifconfig命令在Linux中查看IP地址,并且了解了常用的通信流程,例如OSI/ISO网络分层模型,其中应用层是最为关键的。此外也学习了协议格式以及打包和解包的流程。

2024-04-28 23:02:24 242

原创 linux进程通信 ipc

直接创建映射区只适合没有血缘关系的进程不适合通信不需要打开文件MAP_ANON 只 在linux系统有效。

2024-04-27 16:12:25 456

原创 进程回收wait

父进程死后,子进程其实是被pid为1,init间接的子进程的user 来接管。fork 后的子进程,其父进程有义务在子进程结束回收。子进程进入睡眠,那么父进程也得阻塞等待子进程终止。杀死不顾正业的父亲,init当他父亲接管。传出参数,回收进程的状态。成功:回收的进程pid。失败:-1 errno。

2024-04-22 21:12:42 361

原创 用优先队列来找出二叉树的众数

此题目来自lc给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回 BST 中的所有(即,出现频率最高的元素)。如果树中有不止一个众数,可以按返回。

2024-04-21 16:45:56 287

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除