自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis之主从复制原理 详解

Redis 主从复制 主要用来实现 redis 数据的可靠性;防止主 redis 所在磁盘损坏,造成数据永久丢失; 主从之间采用异步复制的方式;从数据库只读不能写命令命令: redis-server --replicaof 127.0.0.1 7001在 redis 5.0 以前使用 slaveof ;redis 5.0 之后使用 replicaof ;# redis.confreplicaof 127.0.0.1 7002info replication数据同步全量数据同步增量

2022-02-23 10:26:07 605

原创 Redis之持久化数据

为什么要持久化 redis 的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证 Redis 的数据不会因为故障而丢失,redis 重启的时候可以重新加载持久化文件来恢复数据;Redis 持久化相关的配置在配置文件中配置###### aof ####### redis.cnfappendonly noappendfilename "appendonly.aof"# aof策略选择:# appendfsync alwaysappendfsync everysec #

2022-02-23 09:53:14 1011

原创 Redis之Redis协议与异步方式

Redis 网络层Redis是单线程reactor模型;对于所有连接的数据处理,Redis并发执行;对于单条连接的数据处理,Redis串行执行;一个队列对应一个处理器是串行;多个队列对应一个处理器是并发;多个队列对应多个处理器是并行;如有n个队列和n个处理器,但他们是交换执行的,虽然也是一对一,但因为处理器与队列的关系不断切换,所以也属于是并发(多个并发)Redis 事务MULTI 开启事务,事务执行过程中,单个命令是入队操作,直到调用EXEC才会一起执行MULTI开启事务相当于my

2022-02-22 09:50:15 717

原创 Redis之基本命令介绍

Redis  Redis是Remote Dirctionary Service的简称,即远程字典服务;  Redis是内存数据库(数据都存储在内存中,mysql中主要数据存储在磁盘)、KV数据库(key-value)、数据结构数据库(value提供了丰富的数据结构);  Redis应用非常广泛,如Twitter、暴雪娱乐、Github、Stack Overflow、腾讯、阿里、京东等等,很多中小型公司也在使用;  Redis有16个数据库(字典),并且是单线程的,所以使用时只使用一个数据库。一个ke

2022-02-19 19:34:49 327

原创 数据库之mysql并发读异常与死锁

2022-02-15 19:48:54 509

原创 数据库之mysql事务原理分析与锁机制 详解

1、事务1.2、目的事务将数据库从一种一致性状态转换为另一种一致性状态;1.3、组成事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成;其中单条语句会默认自动添加事务控制语句,而多条SQL语句需要手动添加事务控制语句。1.4、特征在数据库提交事务时,可以确保要么所有修改都已经保存,要么所有修改都不保存;事务是访问并更新数据库各种数据项的一个程序执行单元。在 MySQL innodb 下,每一条语句都是事务;可以通过 set autocommit = 0; 设置当前会话手

2022-02-14 21:53:15 389

原创 数据库之mysql索引原理 详解

1、索引索引分类:主键索引、唯一索引、普通索引、组合索引、以及全文索引(elasticsearch);1.1、主键索引非空唯一索引,一个表只有一个主键索引;在innodb中,主键索引的B+树包含表格信息PRIMARY KEY(key) // 括号中的key为列名1.2、唯一索引不可以出现相同的值,可以有NULL值(NULL值也不能重复)UNIQUE(key) // 括号中的key为列名1.3、普通索引允许出现相同的索引内容INDEX(key)-- ORKEY(key[,...])

2022-02-10 22:02:48 1315

原创 手写死锁检测组件

死锁概念 多个进程或线程互相等待对方的资源,在得到新的资源之前不会释放自己的资源,这样就形成了循环等待,这种现象被称为死锁。四个产生原因(都需要满足): 1、资源互斥:资源只有两种状态,只有可用和不可用两状态,不能同时使用,同一时刻只能被一个进程或线程使用。 2、占有且请求:已经得到资源的进程或线程,继续请求新的资源,并持续占有旧的资源。 3、资源不可剥夺:资源已经分配进程或线程后,不能被其它进程或线程强制性获取,除非资源的占有者主动释放。 4、环路等待:死锁发生时,系统中必定有两个或两个以上.

2022-01-24 20:21:54 243 1

原创 定时器方案(一)之红黑树与最小堆 详解

前言定时器应用为什么不直接用epoll_wait中的timeout来做定时呢? 因为epoll是会调用内核,多少会有一定的延迟,对于实时性要求很高的任务来说,是不可取的。定时发送信号定时器误差大(如上述所说的epoll_wait中设置timeout)该如何处理?利用定时发送信号来处理,即通过绑定和发送信号的方式,可以立刻进行定时器操作。定时器数据结构当有大量定时任务要处理时,需要引入数据结构,用epoll_wait不是最优解。常见的数据结构有红黑树、最小堆和时间轮设计需要提供以下API:

2022-01-20 21:23:20 946

原创 定时器方案(二)之时间轮原理 详解

时间轮类似于时钟,秒针走一圈,分针前进一格单层级的时间轮用于实现时间窗口(如tcp滑动窗口)的限流与熔断假设检测5秒内是否有100次操作限流: 每秒都查看最近五秒是否有100次操作熔断:每过五秒查看这五秒有没有100次操作显而易见的,限流更加准确,但是很耗费时间,熔断没那么准确,但是相对来说没那么耗时间熔断的应用: DDos攻击:  客户端不断发送大量数据给服务器的过程为DDos攻击 解决办法:  在网络底层用DPDK判断  在应用层用熔断机制判断规定时间内客户端发送的数据包是否.

2022-01-20 20:25:09 2024

原创 cpu绑定进程

#include <stdio.h>#include <string.h>#include <stdlib.h>#define __USE_GNU#include <sched.h>#include <unistd.h>#include <pthread.h>#include <sys/syscall.h>void process_affinity(int num) { //gettid...

2022-01-19 20:02:36 421

原创 池式组件之异步请求池

请求池  用于请求第三方服务,如mysql/redis,下图中第三列是第三方服务。当大批量数据去请求第三方服务时(单线程),阻塞等待返回是十分耗时的操作(及时单次阻塞等待时间很短),因此可以引入异步请求池。  基本原理就是业务服务器请求第三方服务后,不阻塞等待,用另外一个线程去等待结果要点1、发送请求是多个io,即业务服务器与第三方服务器之间有多个fd连接,因为单fd的话,一次只能申请一次服务2、在发送请求之后,将fd利用epoll_ctl加入到epoll中,接受结果的线程去判断epoll中数据

2022-01-17 21:05:05 722

原创 池式组件之线程池(c语言实现)

目录线程池的作用线程池的工作原理线程池代码技术参考线程池的作用1、减少线程创建与销毁的开销2、异步解耦的作用,如日志,主线程要求高性能,写日志写多了就耗时,那么将日志任务交给线程池来处理,就能保证主线程高效线程池的工作原理线程池是当做组件在使用的。线程池需要提供的API:1、创建 create2、插入任务 push_task3、销毁 destroy4、获取任务数量 task_count(可选)5、空闲线程数量 free_thread(可选)  可以把线程池理解为银行大堂,处理业务的柜

2022-01-16 19:28:22 275

原创 epoll实现原理

目录数据结构epoll如何确定就绪fdepoll提供的接口做的事情epoll的线程安全ET(边沿)与LT(水平)技术参考数据结构  epoll是由所有fd的集合和就绪fd的集合(可读可写fd)组成  其中,所有fd的集合是key-value的形式,key为fd,value为具体数据,由红黑树实现。对比hash、btree/b++tree、红黑树实现epollhash:  缺点:首先需要创建一个hash表,其中每个hash槽后面都跟一个链表。在创建epoll的时候需要考虑到hash表的大小要定义

2022-01-15 21:20:39 734

原创 TCP的慢启动与滑动窗口

目录TCP头tcp发送慢启动与拥塞避免如何判断数据包数量超出网络负载具体传输滑动窗口技术参考TCP头Source Port:源端口号(bind函数绑定的,若没有调用bind则随便绑定一个)Destination Port:目的端口号(listen函数监听的端口号)Sequence Number:记录字节数(初始值是随机值,溢出之后,从1开始)Acknowledgment Number:ack numheader length:头的长度的header length*4URG:紧急传输标志Ur

2022-01-13 20:31:56 1332

原创 用户态协议栈之TCP/IP设计

协议栈数据组成格式用户层:用户数据传输层:8个字节udp头+用户层网络层:20个字节的ip头 + 传输层链路层:14个字节的以太网头 + 网络层网卡(在链路层和物理层之间):将链路层数据经过DA转换,变成电信号/光信号以太网头#pragma pack(1)#define ETH_ADDR_LENGTH 6// 以太网的头struct ethhdr{ unsigned char h_dst[ETH_ADDR_LENGTH]; unsigned char h_src[E

2022-01-12 21:17:22 984 1

原创 协程设计原理(理论)

网络编程与协程原理为什么有协程,协程用来干什么?原语操作大致思路实现方法协程适用场景技术参考为什么有协程,协程用来干什么?协程有着同步的编程方式,异步的性能。即写代码是同步的方式写的,运行起来是异步的异步:检测io(调度器)与io操作不在一个流程中。如检测io(epoll_wait()判断fd读写状态)与io操作(send(),recv())同步:检测io与io操作在一个流程中//以网络io为例 同步的写法(单线程)有着多线程的性能while(1){ epoll_wait() for(;;

2022-01-10 20:58:42 433

原创 UDP可靠传输(KCP))

在阅读本文之前,可以先阅读一下之前的文章,了解tcp是如何保证可靠传输的本文主要以KCP协议展开讲解,KCP是UDP可靠传输协议分片  链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为

2022-01-09 20:56:29 2426

原创 TCP传输机制

TCP与UDP的区别格式对比ARQ协议  ARQ协议(Automatic Repeat-reQuest),即自动重传请求,是传输层的错误纠正协议之一,它通过使用确认和超时两个机制,在不可靠的网络上实现可靠的信息传输。ARQ协议主要有3种模式:停等式(stop-and-wait)ARQ回退n帧(go-back-n)ARQ,选择性重传(selective repeat)ARQ停等式停等协议的工作原理如下:1、发送方对接收方发送数据包,然后等待接收方回复ACK并且开始计时。2、在等

2022-01-08 20:15:17 897

原创 posix api(TCP)与网络协议栈的联系

linux 下 posix api有哪些服务端1、socket2、bind3、listen4、accept5、recv6、send7、close客户端1、socket2、bind(可有可无)3、connect4、send5、recv6、close设置socket参数setsocketoptgetsocketoptsocket是什么  直译过来是插座,fd(文件描述符)是我们可以操作的,与之对应的有tcb(tcp control block),fd与tcb的生命周期相同

2022-01-06 22:43:03 1126 3

原创 c语言#include *.c

最近再看redis源码,发现了这样一行代码在这几个*.c文件中定义了相同的方法,因此在调用方法的时候会根据宏定义来选择.c文件。#include .c 实际上就是将.c中的代码复制粘贴到这里

2022-01-06 09:08:53 1279

原创 socket编程需要关注的点

网络编程关注的问题连接的建立通过三次握手,分两种情况:1、客户端连接服务器2、服务器连接第三方服务器int client = accept(listenfd, addr, sz);int connectfd = socket(AF_INET, SOCK_STREAM, 0);int ret = connect(connectfd, (struct sockaddr*)&addr, sizeof(addr));// 每一次调用socket相关函数,erron都会有相应的变化errn

2022-01-05 21:42:04 976

原创 redis,memcached

网络io职责检测ioio函数本身可以检测io的状态(通过errno),但是只能检测一个fd对应的状态,io多路复用(select)可以同时检测多个io的状态;这两者的区别是:io函数可以检测具体状态(errno),但io多路复用只能检测出可读,可写,错误,断开等(fd_set)笼统的事件;select返回的错误fd_set可以通过getsockopt()了解具体错误是什么。操作io只能使用io函数来进行操作,操作方式分为阻塞io与非阻塞io阻塞io:如调用read(),就一直在等read()返回

2022-01-05 21:41:55 537

原创 http小记

http粘包现象如:客户端连续3次send 1k数据,并且每次发送间隔没有很明确(可以理解为每次发送间隔很短很短),会让服务器误以为客户端一次发送了3k的数据。因此服务器只会recv一次并且send一次返回给客户端,导致客户端只recv一次,与其send的次数不匹配。解决办法1、解析http数据,用\r\n\r\n进行区分(head中每一行都有/r/n,而head与body之间有一个空行,因此会有两个/r/n)2、在http的head中定义包的长度(content-length)sendfile

2022-01-05 20:25:01 213

原创 websocket

websocket是什么是一个应用层协议,主要用于服务器主动推送数据给浏览器(不仅仅局限于浏览器)。如:浏览器请求登录csdn,csdn的服务器产生一个二维码信息给浏览器,浏览器显示二维码,通过微信扫描二维码,微信的服务器处理信息,然后去告知csdn的服务器哪个二维码被哪个微信扫描了,csdn服务器再主动发送用户相关数据给浏览器(csdn给浏览器发送消息是websocket在起作用),浏览器登录成功。自定义协议由tcp包本身的信息(如包的长度)和协议本身的信息(如版本号)组成协议格式1.建立连接

2022-01-04 21:05:21 680

原创 百万并发服务器by c

  epoll本身就能支持百万并发,本文是基于recator实现百万并发服务器(关于recator可以参考之前发布的博客)接下来解释一下结构体的作用:  ntyevent结构体是用于存储单个fd(clientfd与listenfd)的相关内容,每一个clientfd对应一个客户端的连接,listenfd是监听一个端口的fd  ntyreactor是recator结构体,其中包含epollfd与eventblock,epollfd是用于管理单个epoll的文件描述符(即epoll_create()出来的

2021-12-29 21:31:14 599

转载 分布式一致性hash

链接需要补充一点,设置虚拟节点是为了能够利用hash的强随机分布性,若使用物理节点,服务器数量较少,那么强随机性就不明显,只有数据到达一定的量,才能体现出强随机分布(可以理解为大批量数据才能最接近概率)...

2021-12-15 21:07:44 43

原创 epoll&reactor by C

udp的服务器,如何做多个客户端并发1、在数据上加一层协议来区分客户端。但这个前提是要数据先发先到?,但是udp并不支持。2、模拟tcp,在第一次recvfrom时,创建一个fd与相应的客户端对应。信号在进程中如何工作的:1、进程的信号集合如何保存:进程中专门有一块地方保存信号2、调用signal信号如何保存到进程里面3、信号如何发送,如何捕获...

2021-08-09 20:45:58 134

原创 版本管理神器----Git

为什么要用版本管理  手动合并文件十分的繁琐。分布式与集中式的对比分布式:  每个计算机都有一个仓库,服务器上也有一个仓库集中式(典型的有svn):  只有服务器上有仓库。Git阵营的两大神器  Gitlab和GitHubGit相关命令// 创建仓库git init --bave // 创建裸仓库,裸仓库存储的是差异文件git init // 创建非裸仓库,非裸仓库存储的是具体的文件// 将代码提交到暂存区git add . // 提交所有文件git add xxx // 提

2021-07-28 19:57:22 77

原创 C++ 设计模式(三)工厂方法模式、抽象工厂、代理模式和适配器模式

这里写目录标题工厂方法模式定义背景要点结构图抽象工厂定义背景结构图适配器模式定义背景要点本质结构图代理模式定义背景要点本质结构图工厂方法模式定义定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method 使得一个类的实例化延迟到子类背景实现一个导出数据的接口,让客户选择数据的导出方式要点解决创建过程比较复杂,希望对外隐藏这些细节;比如连接池,线程池;隐藏对象真实类型;对象创建会有很多参数来决定如何创建;创建对象有复杂的依赖关系;结构图抽象工厂定义提供一个

2021-07-27 17:45:57 224

原创 C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式

设计模式单例模式懒汉模式定义代码策略模式定义背景要点本质结构图责任链模式定义背景要点本质结构图装饰器模式定义背景#要点本质单例模式懒汉模式定义  懒汉模式只有在调用是才会生成单例类,没有调用的时候是不会生成的,可以理解为它很懒,所以叫懒汉模式。代码template<typename T>class Singleton {public: static T& GetInstance() { static T instance; // 这⾥要初始化DesignPatt

2021-07-26 16:38:33 201

原创 C++ 设计模式(一)模板方法和观察者模式

设计模式设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。内存模型模式设计原则依赖倒置原则高层模块不应该依赖低层模块,二者都应该依赖抽象抽象不应该依赖具体实现,具体实现应该依赖于抽象开放封闭原则一个类应该对扩展开放,对修改关闭面向接口编程不将变量类型声明为某个特定的具体类,而是声明为某个接口。...

2021-07-21 16:05:24 262

原创 图论算法以及迪杰斯特拉算法(最短路径问题)C++

图论算法背景:1、网络爬虫2、地图应用:最近距离推荐,最短时间推荐3、社交网络分析:好友推荐、垃圾用户分析、社交关系分析4、推荐、精准营销5、舆情控制、信息传播6、防欺诈(网络欺诈和电信欺诈)7、计算生物学:...

2021-07-19 20:48:21 853

原创 布隆过滤器介绍

海量数据去重背景问题1、现在使用word文档时,word如何判断某个单词是否拼写正确?2、网络爬虫程序,怎么让它不去爬相同的URL页面?3、垃圾邮件(短信)过滤算法如何设计?4、公安办案时,如何判断某嫌疑人是否在网逃名单中?5、缓存穿透问题如何解决?解决方案1优化:给key设置一个缓存过期,如60ms,如60ms后释放掉该 键值。set和map底层用的是红黑树,区别在于set不存储val字段;增删改查的时间复杂度是o(logn)优点:存储效率高,访问速度高效;缺点:对于数据量大且查询

2021-07-16 15:57:22 114

转载 Win32 API 三两事(一)

Win32 API(转载)1、APIENTRY,WINAPI,CALLBACK等是什么东西?2、HINSTANCE 、HANDLE 、 HWND 、LPCTSTR是什么?3、CWnd 、 CDC 与 HDC?4、COLORREF 与 RGB 、LPVOID 与 LPCVOID?5、char、wchar_t、TCHAR、WCHAR、std::string、std::wstring、CString、LPCTSTR、DWORD6、SelectObject()和SelectStockObject()有何区别?1、

2021-03-04 10:15:32 459 1

原创 Widget、QWidget傻傻分不清楚?

  最近在学习Qt,发现在创建项目后,有一个Widget类,其中又定义了一个UI::QWidget* 类型的ui指针,一开始也没整明白这是干啥,后面写着写着就知道这俩到底是干啥的。总结一下它俩,希望能够帮助初学Qt的小伙伴们。  首先我们要清楚,Qt是界面编程,其中有各式各样且功能齐全的控件。很明显的,我们编写的Widget类就可以理解为窗口控件,而UI::QWidget*便是一个界面指针,当我们在Widget中定义了UI::QWidget类型的指针就相当于在窗口中创建了一个界面,如果我们在Qt desi

2020-12-03 09:12:15 1186

转载 JPEG压缩算法详解(转载)

JPEG压缩算法原理  最近在阅读turbojpeg源码,所以在网上查找JPEG的压缩原理,发现了一篇写的还不错的文章,故转载。https://thecodeway.com/blog/?p=69/******************************************************************************************************//***************************************************

2020-11-23 09:38:40 1814

原创 VS属性管理器配置

VS属性管理器配置Debug与Release配置打开属性管理器属性说明以前都是用Linux做项目,最近开始使用vs做项目,对于属性管理器一开始有点蒙,因此在这总结一下,以vs2013为例,更高版本的也可以参考。Debug与Release在讲具体的配置前,我们需要知道什么是Debug,什么是Release。Debug顾名思义就是调试,一般面向开发人员的,其中具有调试参数等东西;Release是项目上线后的版本,面向的是用户,相对Debug,它生成的可执行文件会相对小一点。因此他们俩的配置是不同的,一般的

2020-11-21 10:01:36 4262

原创 C语言,select函数的使用方法以及为何使用

I/O复用本文旨在简单介绍select与epoll的优缺点多进程服务器端的缺点和解决方法为了构建并发服务器,只要有客户端连接请求就会创建进程。这的确是实际操作中采用的一种方案,但并非十全十美,因为创建进程时需要付出极大代价,这需要大量的运算和内存空间,由于每个进程都具有独立的内存空间,所以相互间的数据交换也要求采用相对复杂的方法(IPC属于相对复杂的通信方法)。那有何解决方案呢?能否在不创建进程的同时向多个客户端提供服务? 答案是肯定能,I/O复用就是解决方法之一(还可以通过线程池解决,之后会讲解线

2020-09-24 17:52:07 3073 3

原创 线程基础知识 C语言 Linux

竞争与同步同一个进程中的线程能共享进程中的绝大多数资源,当它们随意竞争时可以导致资源会破坏、脏数据、不完整、不一致等问题。通过一些方法让进程在竞争资源时相互协调,避免出现数据不完全、不一致等问题,这就叫线程同步。临界区与临界资源被多个线程同时访问的代码叫临界区,被同时访问的资源叫临界资源。原子操作中间不会打断的操作叫原子操作。互斥量(互斥锁)pthread_mutex_t 是一种数据类型,可以定义变量int pthread_mutex_init(pthread_mutex_t *mute

2020-09-09 20:41:14 127

空空如也

空空如也

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

TA关注的人

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