- 博客(108)
- 收藏
- 关注
原创 一篇带你了解什么是内网穿透?
我们的电脑(或服务器)在局域网中,使用的 IP 地址通常是10.x.x.x172.16.x.x等内网地址。公网(如阿里云、腾讯云等云服务器)使用的是可被全世界访问的公网 IP。当我们希望让互联网上的用户访问到我们在本地(内网)搭建的服务(例如 Django、Node.js、Spring Boot 等),如果没有公网 IP,直接使用这类内网地址是无法在外网访问到的。私有地址(内网 IP)不会在公网的路由中进行传播。
2025-03-10 18:36:24
923
原创 一文带你彻底吃透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
原创 论坛投票功能实现
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
原创 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
原创 设计模式:单例模式
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
原创 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
原创 进程回收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关注的人