- 博客(91)
- 资源 (3)
- 收藏
- 关注
原创 Linux项目排查命令经验总结
网络排查命令项目部署后得不到预期结果,往往是由于网络故障原因,下面介绍一些网络故障排查命令ping命令网络排查第一步,查看对方主机是否存在,毕竟也有可能把ip输错或者把私有地址当成公网ip地址的情况,ping命令用于查看主机网络用法如下:ping ip地址例如ping 120.25.xxx.xxxPING 120.25.xxx.xxx (120.25.xxx.xxx) 56(84) bytes of data.//如果只有这一行没有下面的那就是主机网络有问题64 bytes from 1
2021-11-07 20:28:30 1349
原创 Mysql哈希索引
哈希索引原理哈希索引原理其实就是hash表,搜索时间效率O(1),搜索效率好,也意味着磁盘IO花费少,mysql底层使用的是链式哈希表,结构如下,每一个bucket就是一个个哈希桶,也就是哈希链表的头结点。哈希结构天然的需要耗费空间资源,是一种用空间换时间的做法哈希要点:解决哈希冲突的几种方式再哈希的参数碰撞因子或者说负载因子说白了就是用的拉链法去解决的哈希冲突,也正是这个结构造成了哈希索引的一些特性哈希表没有顺序可言,只能进行等值查询,不支持范围搜索哈希表不稳定,效率最差可能变为O(
2021-12-30 15:52:51 6057 1
原创 聚集索引和非聚集索引
MyISAM主键索引MyISAM主键索引采用的是B+树,叶子结点data域存放的是数据记录的地址,原理图如下由上图可见,MyISAM的数据跟索引是分开存放的,事实也是这样,在mysql下可以看到这是在两个文件分开存放的辅助索引在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复,如果给其它字段创建辅助索引,结构图如下:根据上面两张图,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其d
2021-12-30 09:53:29 1044
原创 Mysql索引B树跟B+树
索引底层实现原理数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越矮胖,磁盘IO次数就少MySQL支持两种索引,一种的B-树索引,一种是哈希索引,大家知道,B-树和哈希表在数据查询时的效率是非常高的。这里我们主要讨论一下MySQL InnoDB存储引擎,基于B-树(但实际上MySQL采用的是B+树结构)的索引结构。B树B-树是一种m阶平衡树,m一般是300-500(经验值),叶子节点都在同一层,由于每一个节点存储的
2021-12-29 10:40:50 2108
原创 MySQL索引基础
MySQL索引当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要!索引分类索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种结果。索引的核心是提高查询的速度!索引的优点: 提高查询效率索引的缺
2021-12-26 16:47:12 979
原创 Mysql核心SQL
结构化查询SQLSQL是结构化查询语言(Structure Query Language),它是关系型数据库的通用语言。SQL主要可以划分为以下 3 个类别:DDL(Data Defifinition Languages)语句数据定义语言,这些语句定义了不同的数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。DML(Data Manipulation Language)语句数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用
2021-12-26 05:55:18 213
原创 Mysql完整性约束与设计
Mysql的完整性约束CREAT TABLE user(id INT unsigned PRIMARY KEY AUTO_INCREMENT COMMENT'用户的主键', nickname varchar(50) UNIQUE NOT NULL COMMENT'用户昵称', age TINYINT UNSIGNED NOT NULL DEFAULT 18, sex ENUM('male','female');)主键约束如上sql,创建表将id作为主键,令他自增,主键必须
2021-12-24 18:54:22 288
原创 Mysql数据类型和运算符
MySql数据类型MySQL数据类型定义了数据的大小范围,因此使用时选择合适的类型,不仅会降低表占用的磁盘空间,间接减少了磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关数值类型浮点类型推荐使用decimal类型(保存为字符串格式)字符串类型日期跟时间类型日期类型也是做项目过程中,经常使用的类型信息,尤其是TIMESTAMP和DATETIME两个类型,但是注意TIMESTAMP会自动更新时间,非常适合那些需要记录最新更新时间的场景,而DATETIME需要手动更新
2021-12-24 10:41:49 201
原创 聊天集群服务服务器
项目数据库设计数据库设计上有5个表,分别是uer表、friend表、allgroup表、groupuser表、offlinemessage表,下面分别介绍其作用与设计的字段user表user表是用来存储用户注册信息的,字段包含有id,采用定长字符串,也是表的主键,是用户注册的唯一标识name用户名,允许修改password用户密码,从安全考虑,存储为md5值state表示当前用户是在线online还是离线offline,有且只有两种状态friend表friend表是用来关联用户还有信息
2021-12-24 10:11:31 814
原创 常见底层网络模型源码实现
常见网络模型多线程模型简单多线程模型,每次accept返回IO代表建立一个链接该链接分配一个线程,由该线程去执行业务逻辑,由此实现高并发此模型下逻辑简单,但不适合大量的数据,因为内存有限,很难突破C10K#include <errno.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sy
2021-12-04 16:15:30 651
原创 http服务器的实现
对于HTTP的简单理解http服务器简介HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP 是一个基于TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)http工作原理http协议工作于客户端-服务端架构上,浏览器作为http客户端通过URL向http服务器即web服务器发送所有请求,web服务器根据接收到的请求向客户端发送
2021-11-21 16:38:05 2388
原创 fastDFS学习相关
FastDFS架构fastDFS由三大部分组成,负责调度的跟踪服务器、存储服务器和客户端,存储服务器跟追踪服务器都可以拥有不止一台存储服务器存储服务器(Storage Server)也称之为数据服务器或者数据结点,用于存储数据的。不但保存了文件的也保存了文件的元数据,具体实现是通过Linux操作系统的文件管理方式实现的。程序默认启动23000端口监听等待客户端的请求,同时会创建专门的线程周期性地向跟踪服务器上报一些重要信息,例如文件上传总数、成功上传文件数、删除文件总数、成功删除文件总数、下载文件总
2021-11-19 22:59:25 1226
原创 go语言数组
go语言数组声明数组声明语法如下:var 数组变量名 [元素数量]Type语法说明如下:数组变量名:数组声明及使用时的变量名元素数量:数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小的数值Type:可以是任意基本类型,包括数组本身,类型为数组本身时,可以实现多维数组数组的每个元素都可以通过索引下标来访问,索引下标的范围是从 0 开始到数组长度减 1 的位置,内置函数 len() 可以返回数组中元素的个数var a [3]i
2021-11-06 18:47:38 154
原创 go语言字符串与数值类型之间的转换
string与int类型之间的转换字符串和整型之间的转换是我们平时编程中使用的最多的,下面就来介绍一下具体的操作Itoa():整型转字符串Itoa() 函数用于将 int 类型数据转换为对应的字符串类型,函数签名如下func Itoa(i int) string代码示例如下:func main() { num := 100 str := strconv.Itoa(num) fmt.Printf("type:%T value:%#v\n", str, str)}运行
2021-11-06 12:59:13 1345
原创 go语言类型别名
关键字版本浅谈 类型别名是 Go 1.9 版本添加的新功能,主要用于解决代码升级、迁移中存在的类型兼容性问题。在 C/C++ 语言中,代码重构升级可以使用宏快速定义一段新的代码,Go语言中没有选择加入宏,而是解决了重构中最麻烦的类型名变更问题在 Go 1.9 版本之前定义内建类型的代码是这样写的:type byte uint8type rune int32而在 Go 1.9 版本之后变为:type byte = uint8type rune = int32这个修改就是配合类型别名而进
2021-11-06 10:21:48 463
原创 go语言常量
go语言常量基础go语言中的常量使用关键字const定义,用于存储不会改变的数据常量是在编译期间被创建的只能是布尔、整数、浮点、复数和字符串常量表达式必须能够被编译器求值的常量表达式常量的定义格式和变量的声明语法类似:const name [type] = value,例如:const pi = 3.14159 // 相当于 math.Pi 的近似值在Go语言中,你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型显式类型定义: const b string =
2021-11-05 15:15:54 633
原创 go语言变量的生命周期
变量的生命周期变量的生命周期指的是在程序运行期间变量有效存在的时间间隔全局变量:跟整个程序的运行周期是一样的局部变量:生命周期是动态的,从创建到不再被使用形式参数和函数返回值:属于局部变量,在函数调用结束后被销毁for t := 0.0; t < cycles*2*math.Pi; t += res { x := math.Sin(t) y := math.Sin(t*freq + phase) img.SetColorIndex( size+in
2021-11-05 14:42:23 392
原创 go语言字符类型
Go语言的字符字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。Go语言的字符有以下两种:一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。byte 类型是 uint8 的别名,对于只占用 1 个字节的传统 ASCII 编码的字符来说,完全没有问题,例如 var ch byt
2021-11-05 11:00:15 174
原创 go语言变量逃逸分析
什么是栈栈的概念栈是一种特殊规则的线性表的数据结构特点是先进后出往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入的元素总是位于栈的顶部,最先放入的元素总是位于栈的底部从栈中取出元素时,只能从栈顶部取出。取出元素后,栈的元素数量会变少。最先放入的元素总是最后被取出,最后放入的元素总是最先被取出。不允许从栈底获取数据,也不允许对栈成员(除了栈顶部的成员)进行任何查看和修改操作栈跟变量的关系栈可用于内存分配,栈的分配和回收速度非常快下面的代码展示了栈在内存分配上的作用fun
2021-11-05 10:57:18 404
原创 go语言的指针
各大语言指针浅谈跟其他支持指针的语言不同,go语言的指针不支持指针运算Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这对于构建运行良好的系统是非常重要的。指针对于性能的影响不言而喻,如果你想要做系统编程、操作系统或者网络应用,指针更是不可或缺的一部分C/C++中的指针C/C++ 语言拥有极高性能的根本所在,在操作大块数据和做偏移时即方便又便捷。因此,操作系统依然使用C语言及指针的特性进行编写C/C++ 中指针饱受诟病的根本原因是指针的运算和内存释放,C/C++ 语言中的裸
2021-11-05 10:56:23 170
原创 哈希相关总结
散列表根据key计算key在表中的位置的数据结构,是key和所在存储地址的映射关系hash函数映射函数Hash(key)=addrhash函数可能会把两个或两个以上的不同 key 映射到同一地址,这种情况称之为冲突(或者hash碰撞选择hash计算速度快强随机分布冲突处理链表法,引用链表来处理哈希冲突,也就是将冲突元素用链表链接起来,这也是常用的处理冲突的⽅式,但是可能出现一种极端情况,冲突元素比较多,该冲突链表过长,这个时候可以将这个链表转换为红黑树,由原来链表时间复度转
2021-10-17 16:30:07 205
原创 二叉树遍历
二叉树后序遍历用栈方法class Solution {public: vector<int> postorderTraversal(TreeNode *root) { vector<int> result; stack<TreeNode*> stackTree; TreeNode* node = root; TreeNode* pre = nullptr; do { while (node != nullptr) {
2021-07-31 14:24:51 70
原创 LRU算法
哈希表保存每个节点的地址双向链表的结点保存数据越靠近头结点,表示距离上次访问时间越短,尾部表示访问少访问节点时候,如果结点存在,结点交换到链表头部,同时hash中更新该节点地址插入节点时候,如果达到上限,删除尾部结点,同时在hash中删除对应的项,新节点插入链表头部class LRUCache{public: LRUCache(int capacity) { this->capacity = capacity; } int get(int key) { if (c.
2021-07-31 14:24:20 64
原创 分布式文件系统项目
分布文件服务系统概述本项目源码GitHub链接本项目主要实现文件的分布式存储功能,主要采用的是http协议,提供文件的上传、下载和文件分享,采用C/S模型,服务端跟客户端进行交互,在服务端Nginx作为反向代理服务器,进行请求转发,由fastCGI进程处理对应请求,fastDFS实现文件的分布式存储。架构图见github也有Nginx转发请求和fastCGI处理程序转发用户注册请求给对应的fastCGI程序转发用户登录请求给对应的fastCGI程序转发文件上传请求给对应的fastCGI程序
2021-07-31 00:28:28 595
原创 设计模式之模板方法模式
模板方法模式定义一个操作中的算法骨架,将一些步骤延迟到子类中子类不可以改变算法的结构,但可以重定义算法的某些具体特定步骤提供了一个代码复用平台,让不变的行为避免在子类中重复出现让不变的行为搬到子类中,让子类重定义特定的步骤class AbsstractClass{public: virtual void PrimitiveOperation1()=0; virtual void PrimitiveOperation2()=0; void TemplateMethod() { P
2021-07-05 23:11:08 52
原创 设计模式之工厂模式
简单工厂模式对象不是由用户直接实例,而是交给一个工程类去实例化要增加新的功能需要修改源代码,不符合开闭原则类的职责过重,类发生问题,会影响使用这个类的其他功能//水果基类class fruit{public: virtual void showName()=0;};//香蕉类class banana : public fruit{public: virtual void showName() { cout << "我是香蕉" << endl;
2021-07-05 23:10:33 66
原创 设计模式之单例模式
##单例模式基本概念系统中只允许有一个这种类的实例对象编写单例模式步骤构造函数私有化增加静态私有的当前类的指针变量提供静态对外接口,让用户获得单例对象单例模式一般不考虑释放懒汉模式//懒汉模式class Singleton_lazy{private: Singleton_lazy() { cout << "我是懒汉模式" << endl; };public: static Singleton_lazy* getInstance() {
2021-07-05 23:10:04 56
原创 设计模式之代理模式
代理模式为其他对象提供一种代理以控制这个对象的访问在某些条件下一个对象不适合直接引用另外一个对象代理模式对象可以做一个中介作用//提供一种代理为控制其他对象的访问class AbstractCommonInterface{public: virtual void run() = 0;};//已经写好的系统class MySystem:public AbstractCommonInterface{public: virtual void run() { cout <
2021-07-05 23:09:04 74
原创 设计模式之策略模式
策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换让算法变化起来,不会影响到使用算法的用户//抽象武器策略class WeaponStrategy{public: virtual void UseWeapon() = 0;};class Knife :public WeaponStrategy{public: virtual void UseWeapon() { cout << "使用匕首" << endl; }};class A
2021-07-05 23:08:29 82
原创 epoll函数
epoll模型交给内核监控文件描述符原理是红黑树结构创建树int epoll_create(int size);/**函数说明,创建一棵树*size:必须传一个大于0的数字,表示树的长度*返回个文件描述符,这个文件描述符表示树的根节点*/上树int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);typedef union epoll_data{ void *ptr; int fd;
2021-04-08 23:31:10 94
原创 poll函数
poll跟select类似,也是委托内核监控文件描述符,可读可写、异常事件函数原型int poll(struct pollfd *fds,nfds_t nfds,int timeout);fds:传入传出参数,是一个结构体数组fds.fd:要监控的文件描述符fds.events:输入参数,要监控的事件POLLIN:读事件POLLOUT:写事件POLLERR:异常事件fds.revents:输出参数,返回事件nfds:数组实际有效内容的个数,监控范围,具体是数组下标的
2021-04-08 23:30:23 152
原创 select
select函数多路IO技术,一个select,同时监听多个文件描述符,将监控的文件交给内核去处理委托内核监控可读、可写、异常事件函数原型int select(int nfds,fd_set* readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);nfds:告诉内核要监控文件描述符的范围,一般取值最大文件描述符+1readfds输入参数:告诉内核监控哪些文件描述符输出参数:内核告诉程序,哪些文件描述符
2021-04-08 23:29:49 71
原创 文件存储
Inode本质为结构体,存储文件的属性信息,例如权限、类型、大小、时间等等也称为文件属性管理结构,大多数inode都存储在磁盘上少量、近期使用的inode会被缓存到内存中dentrydentry是一个内存实体,其中的d_inode成员指向对应的inodedentry里面也存有文件名、硬链接名也称目录项stat函数用于获取文件属性,从inode结构体中获取lstat函数与stat函数没什么区别,但lstat不会穿透链接,stat会函数原型int stat(const
2021-02-28 08:50:36 118
原创 线程
线程线程概念线程有独立的PCB,但没有独立的地址空间进程有独立的地址空间,有独立的PCB两者区别在于是否共享地址空间线程本质还是进程线程可以看做是寄存器和栈的集合线程共享资源文件描述符每种信号的处理方式当前工作目录用户id和组id内存地址空间线程非共享资源线程id处理器现场(寄存器的值)和栈指针独立的栈空间errno变量,本质是个全局变量信号屏蔽字调度优先级线程优缺点优点提高程序的并发性开销小数据通信、共享数据方便缺点库函数不稳定调
2021-02-28 08:50:03 97
原创 锁
线程同步线程同步其实就是一个等待机制,叫做等待队列多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用防止数据混乱,产生于时间相关的错误互斥量mutex建议锁,没有强制使用一个线程持有锁会导致其他所有需要此锁的线程挂起在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能问题一般步骤创建锁pthread_mutex_t lock初始化锁
2021-02-28 08:49:28 77
原创 实现信号捕捉
信号捕捉signal函数注册一个捕捉函数,捕捉实际由内核进行一般不用这个函数,用sigactiontypedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);//signum是设置的捕捉信号//handler是具体捕捉后函数操作sigaction进程正常运行时,默认PCB中有一个信号屏蔽字,假定为*,它决定了进程自动屏蔽了哪些信号,当注册了某一个信号捕捉函数,捕捉到该
2021-02-28 08:48:25 144
原创 信号集操作函数
信号集操作函数自定义函数集sigset_t set;清空信号集sigemptyset(sugset_t *set);全部置一sigfillset(sigset_t *set);将一个信号添加到信号集中sigaddset(sigset_t *set, int signum);将一个信号从集合中移除sigdelset(sigset_t *set,int signum);判断一个信号是否在集合中sigismember(sigset_t *set, int
2021-02-28 08:46:24 129
原创 类与对象
###知识点面向对象的基本思想类和对象的基本概念C++中的类及其定义关于类和对象面向对象基本思想面向对象程序设计(OOP)最重要的核心特性之一是将整个程序分为若干个小的实体,称为对象,他们具体明确定义的交互作用,优点是显著减小了整体的复杂性封装:代码的分而治之,数据与代码分而治之把数据和相关操作装到一个“黑匣子”——对象向外界隐藏了内部的数据结构,表达式和过程对外展示,非具体操作抽象:只呈现数据的行为,而隐藏数据的细节C++语言的类结构支持数据抽象和数据封装###C+
2021-02-27 10:27:17 84
原创 set容器
二叉树概念二叉树就是任何结点最多只允许有两个字节点,分别是左子结点和右子节点二插搜索树,指二叉树的结点按照一定规则进行排序,使得队二叉树中元素访问更加高效二插搜索树规则,任何结点的元素值一定大于其左子树的每一个结点的元素值,并且小于其右子树的值,因而从根结点一直往左走,走到最小值,一直往右走,走到最大值set容器关联容器,根据规则插入元素所有元素会根据元素的值自动进行排序,set容器是以红黑树为底层机制,查找效率好,不允许出现重复元素不能通过迭代器改变元素的值,因为et元素是根据元素值进
2021-02-27 10:26:01 94
原创 线性表
线性表基本概念线性表是零个或者多个数据元素的有限序列数据元素之间是有顺序的数据元素个数是有限的数据元素的类型必须相同线性表性质a0为线性表的第一个元素,只有一个后继,没有前驱an为线性表最后一个元素,只有一个前驱,没有后继除了a0和an外的其他元素ai,既有前驱,也有后继线性表能够逐项访问和顺序存取线性表操作创建线性表销毁线性表清空线性表将元素插入线性表将元素从线性表中删除获取线性表中某个位置的元素获取线性表的长度线性表的顺序存储用一段地址连续的存储单元依
2021-02-27 10:25:11 82
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人