自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL---事务和锁

事务事务其实就是一组DML语句的集合,MySQL数据库InnoDB存储引擎支持事务,MyISAM不支持,而且MySQL的事务默认是自提交模式。事务的特性原子性:事物的原子性是指包含所有的操作,要不然全部都做,要不然全部都不做,他是一个不可以被打断的过程。一致性:一致性是说数据库中的数据在事务操作前和操作后必须满足业务规则的约束。隔离性:这个是我们的重点,隔离性是数据库允许多个并发事务同...

2019-05-25 10:32:42 246

原创 MySQL---数据类型与索引

在前面的学习中我们知道数据库其实就是很多表的一个集合,在创建表的时候,禁止使用中文做字段名,禁止使用字符型作为主键,禁止无主见或是唯一索引的出现,同时我们需要考虑为每一个字段设置合适的数据类型。数据类型整形类型大小范围tinyint1字节(-128,127)smallint2字节(-32768,32767)mediumint3字节(-838860...

2019-05-22 17:29:56 272

原创 MySQL---体系结构与存储引擎

体系结构如果把mysql比喻成一条龙的话,那么体系结构就是龙头部分,mysql的体系结构分为两层,mysql server层与存储引擎层,在mysql层中又分为连接层和sql层。应用程序通过接口(ODBC,JDBC)来连接mysql,最先连接处理的是连接层,连接层包括通信协议,现场处理,用户名密码确认三个部分,通信协议负责检测客户端版本是否兼容mysql服务器,线程处理是每一个连接请求都会分配...

2019-04-18 17:39:01 304

原创 Redis学习笔记(三)

这一篇博客主要是学习redis的复制以及阻塞相关知识,在分布式系统中为了解决单点问题,通常会把数据复制多个副本到其他机器,满足故障恢复以及负载均衡等需求,redis也是如此,复制功能是redis高可用的基础。redis是单线程架构,所有的读写操作都是在主线程中完成,当redis用于高并发时,如果出现阻塞,对于应用都是不好的,所以阻塞是redis是重点知识。复制我们将从redis复制的使用方式...

2019-04-09 14:41:54 142

原创 Redis学习笔记(二)

尽管redis提供的五种数据结构以及足够强大,但是除此之外,redis还提供了许多其他的功能以及优化。本篇博客前期就是通过介绍这些功能来体现redis的强大。附加功能redis除了提供五个基础的数据结构外,我们接下来介绍redis中的慢查询,pipeline,发布订阅等优化功能。慢查询在许多存储系统中提供满查询日志帮助开发运维人员定位系统存在的慢操作,所谓慢查询日志就是说系统在命令执行前后...

2019-04-01 14:49:11 180

原创 Redis学习笔记(一)

什么是redis在最近的面试中由于项目需要所以经常被面试官问到redis,所以在图书馆找了书,接下来几篇博客就是为了具体的学习redis,首先redis是完全开源免费的,高性能的kv数据库。关于redis的特点,做下面几点说明:速度快:redis是用C语言实现的,由于直接操纵底层所以语言层面处理速度较快,并且redis的数据都是存在内存中的,内存的执行速度是各层级中最快的,其次redis使用...

2019-03-31 10:29:24 1236 3

原创 基于BOOST的小型搜索引擎

搞这个项目的初衷是因为在查boost文档的时候很不方便,每一次都要因为没有搜索引擎搞好久,所以这一次就打算自己写一个基于boost库的搜索引擎,期望达到的目标是当用户输入关键字的时候,可以将相关的文档的标题,url以及摘要按照相关度罗列出来。项目一共分为三个模块,分别为数据解析模块,索引模块以及搜索模块。数据解析首先我们需要对存在于主机上的boost文档进行数据解析,很明显我们只需要html...

2019-03-11 19:07:54 598

原创 基于类FTP的自定制协议下的同步云系统

这是一个能够实现在不同主机之间传输文件(上传或者下载)的同步云系统,在这个系统中可以实现客户端中对制定目录下文件的监控以及在自定制协议下往对端传送文件,在服务器中可以接收对端传输文件并且对传输的文件进行备份,并且支持用户登陆系统。FTP功能简介我们这个服务器是基于FTP协议的自定制协议,那么我们很有必要在开始前了解一下FTP的相关知识,什么是FTP,FTP的工作原理等。什么是FTPftp(...

2019-01-27 15:15:30 440

原创 Linux环境编程--线程安全

由于线程共享一份进程空间,所以当一个线程可以修改变量的时候,其他线程也可以读取或者修改,我们需要对这些线程进行同步,确保他们在访问变量的存储内容时不会访问到无效的值,假设在堆上有一份数据,线程A与B同时对他进行修改,那么就会造成竞态条件,因为这两个修改过程都不是原子操作, 都可以被打断,那么我们如何解决这个问题呢,这就引出了线程同步的概念。线程通过同步与互斥机制来保证线程安全。我们这里介绍几种常...

2018-11-29 20:18:42 196

原创 Linux环境编程---线程基础

在前面的章节中我们学习到进程,进程是程序的实例,可是对于进程来说进程间通信相对复杂,需要借助管道,消息队列等的帮助,并且进程相对来说占用资源较大,本章提出了线程的概念,线程是系统调用的最小单位,是进程中的一条执行流,同时我们要理解进程是资源调度的最小单位。在Linux下是用进程来模拟线程的一个进程也就是一个线程组,一个进程中所有的线程都可以访问进程的组成部分,如文件描述符和内存等。线程概念一个...

2018-11-27 16:45:17 168

原创 Linux环境编程---进程调度

这一章我们主要介绍进程的状态,进程的调度算法,内核如何为不同的进程分配资源等,帮助我们加深对于进程相关知识的了解。进程的状态首先我们要知道进程虽然是占有CPU资源的可是就像人不能一直工作一样,进程也不能一直占用CPU资源,同时我们还要考虑并发问题等,具体原因有:进程可能需要等待某种外部条件的满足,在满足条件之气那无法继续执行,在这种情况下占用CPU是对资源的浪费linux是多用户多任务的...

2018-11-21 14:51:02 395

原创 Linux环境编程---系统数据文件

linux系统的正常运行需要使用大量与系统有关的数据文件,例如口令文件/etc/passwd和件/etc/group等,由于历史原因,这些数据文件都是ASCII文本文件,并且使用标准IO库读这些文件,对于较大的系统,顺序扫描这些文件很花费时间,我们需要能够以非ASCII文本格式存放这些文件。口令文件在posix中称为用户数据库,在linux中系统口令文件包含了用户名,加密口令,数值用户ID,数...

2018-11-14 16:09:25 244

原创 Linux环境编程---标准I/O

前面的章节主要介绍linux的系统调用,这一节介绍linux的C库,标准IO库有很多细节,如缓冲区分配,优化块长度执行IO等接下来让我们来看看C库中的标准IO流和FILE对象在上一章中所有IO都是围绕文件描述符进行的,当我们打开一个文件的时候,返回它的文件描述符,而对于标准IO库,它的操作是围绕流进行的。当我们用标准IO库打开一个文件的时候,我们已使一个文件与流相关联。流的定向对于ASCI...

2018-11-12 15:21:45 147

原创 Linux环境编程--文件I/O

这一章的IO是基础IO,不带缓冲的IO,每个read和write都调用内核中的一个系统调用,包含open,read,write,lseek以及close几个函数。只要设计多个进程间的共享资源,原子操作就很重要,这一章通过文件IO与相关函数来讨论,进一步讨论多个进程间如何共享文件,以及说明dup,fcntl,sync等函数文件描述符对于内核而言,所有打开的文件都通过文件描述符来引用,文件描述符...

2018-11-08 16:40:04 231

原创 Linux环境编程--基础知识

所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序,读文件,分配存储区以及获取当前时间等。从严格意义来说我们我们可以将操作系统定义为一个软件,他控制计算机硬件资源,提供程序运行环境,由于较小并且位于环境的核心,我们一称为内核。内核的接口被称作系统调用,公用函数库构建在系统调用之上,应用函数既可以使用公用库函数也可以使用系统调用输入和输出文件描述符通常是一个很小的非负证书,内...

2018-11-05 11:42:11 173

原创 C++强制类型转换

C++强制类型转换在前面C语言的学习中我们知道C语言有隐式类型转换与强制类型转换,比如当我们用一个int类型的值加一个double类型的值的时候编译器会默认将double转换成为int类型,这个就是C语言中的隐式类型转换。同样的一个void类型的指针我们用(int)也可以将他强制转换成int*类型,这个是C语言中强制类型转换。在C++中我们也有一套强制类型转换,他们分别是static_cast...

2018-10-30 16:46:26 2143

原创 C++智能指针

C++智能指针在我们了解完C++中异常处理机制后,其实有一个很大的问题存在,那就是当我们一个地方抛了异常以后它的执行流就跳走了,这样会有很大的问题,导致我们可能发生内存泄漏问题,其实只要我们在异常处理catch那里进行对内存泄漏的处理也是没有问题的,可是问题是我们也不知道什么时候会抛异常,所以我们需要一个机制来托管我们的资源,保证就算执行流乱跳我们也可以最后把资源释放了,不会导致内存泄漏等问题。...

2018-10-23 20:31:42 330

原创 C++异常处理

C++异常处理在我们以前的学习中,总会有很多控制代码出错的地方,类似于段错误等,在我们以前的处理办法中,一般有以下几种处理方式:终止程序(比如段错误)返回错误码返回合法值调用一个预先设置好的函数(回调函数)可是以上几种方法皆有很多弊端,第一种直接终止程序说到底并没有解决问题,我们不会解决问题也不知道问题出在哪里,第二种方法返回错误码我们知道了错误的地方可是依旧没办法解决,第三个事实...

2018-10-23 15:53:22 145

原创 C++全特化与偏特化

C++全特化与偏特化C++中用模板来实现代码的复用,模板分为类模板与函数模板,虽然模板引进到C++中的时间不长,可是却在很多方面有很多的应用,比如标准模板库STL中就有很多应用,然而当我们仔细的学习STL就会发现其中的模板充斥着很多的全特化与偏特化模板,那么什么是特化模板呢?我们前面学习了模板知道了编译的时候编译器可以根据类型的不同实例化出不同的对象,可是如果有一个类型有更好的解决方案那么这个...

2018-10-18 15:02:45 1358

原创 C++模板

探索C++模板在我们学习C++的过程中,经常会遇到一类问题就是很多地方代码相同只是类型不同,我们就需要将同样的逻辑实现两遍,比如当我们实现一个交换函数swap的时候,交换int类型要用到,交换string类型也要用到,而由于类型不同我们就需要将这个函数实现两遍,C++中提供了模板来实现泛型编程,模板可以理解为一个模具,当我们需要int类型的代码时,系统去这个模具实例化一份int代码出来,需要st...

2018-10-17 10:09:57 123

原创 探索C++对象模型

探索C++对象模型前两篇博客主要了解了多态和继承的基础,可是当我们在学习多态和继承的时候,难免会碰到很多关于C++对象模型的问题,例如菱形继承中的数据冗余如何解决,虚基表是如何解决菱形继承中数据冗余问题等,这一篇博客我们以C++中多态与继承为基础,探索C++对象模型。首先我们先来看看虚函数,虚函数就是在函数名前面加virtual的函数,虚函数可以解决继承的很多问题,而对于多态而言,没有虚函数就...

2018-10-05 14:59:01 174

原创 C++ 多态

C++多态C++中的三个特性中封装实现了对于数据的安全以及管理,继承实现了对于逻辑的复用,而我们今天实现的多态就是实现了灵活性,多态故名思意就是多种形态,多态可以简单的概括为“一个接口,多种方法”根据对象的不同来调不同的函数,同时也体现了C++的面型对象特性。多态分为静态多态和动态多态静态多态:静态多态就是重载,在编译的时候决定,所以叫静态多态动态多态:用虚函数实现,在运行的时候决定,被叫...

2018-10-04 10:36:53 155

原创 【每日一题】反转链表

反转链表这道是牛客的题,给了链表然后返回链表的新表头。拿到这道题首先肯定想到的是暴力求解,从表头开始遍历到尾,用尾元素作为新表的表头,然后遍历尾元素的上一个元素,链到新表的最后然后不断重复直到链表的表头链到新表的尾巴这样有一个很大的问题就是复杂度太高了,时间复杂度是o(n*n)这个时候我想到了肯定有简单的办法,利用多指针操控,而且由于次次要断掉其中的链子所以肯定要存起来后面的元素,所以我们...

2018-10-03 16:04:53 193

原创 C++中的继承

C++中的继承在C++中有三个很重要的特性,分别是封装,继承,多态,封装实现了管理,多态实现了灵活性,而继承就实现了代码的复用,在我们日常生产生活中,会发现很多类的关系相近,一个类中包含另一个类中所有成员,类似于车与轮子的关系等,基于这种情况我们提出了继承,一个类可以继承另一个类实现代码的复用。可是我们前面的学习知道, C++有封装特性,有的东西是自己私有的,不希望被类外的访问,并且我们用访问...

2018-10-03 14:55:20 415

原创 C++中的友元函数和友元

C++中的友元函数和友元类在C++中类具有封装的隐蔽性,由于语言特性,只有成员函数才能访问私有成员,非成员函数只能访问类中的公有成员,可是有时候我们需要非成员函数调用私有成员,这个时候要是将私有成员定义为公有的又会破坏C++的封装,为了解决上述问题,我们提出了友元的概念友元分为友元函数和友元类,友元函数就是非成员函数可是当我们声明成友元函数的时候也可以访问类中的私有成员,友元类就是可以访问另一...

2018-09-30 10:31:13 156

原创 Linux下的多线程

linux下多线程首先我们在linux下学习的线程并不是真正的线程,而是用进程模拟的线程,所以一个进程也被叫做线程组,线程是一个进程内部的执行序列,一条执行流。进程是资源竞争的基本单位,线程是程序执行的最小单位,不过线程虽然是进程模拟的,可是线程也有类似于线程id等自己的东西。进程与线程相比安全性更高一点,不过线程由于是轻量级进程所以更加轻便简洁。进程ID与线程ID我们在创建线程的时候,为每...

2018-09-28 14:58:12 139

原创 进程信号

进程信号信号是进程间通信的一种方式,本质是一个软中断,用来告诉进程发生了某些事在进程中我们可以通过发送信号来通知另一个进程,信号的生命周期是:信号的产生->信号的注册->信号的注销->信号的处理。当一个进程接收到信号的时候停止在做的事情处理信号,处理完毕后继续执行之前的事,在linux下我们用kill -l来查看一共有多少信号 我们可以看到很明显一号到三十一号是一类,三...

2018-09-16 09:58:46 167

原创 linux下进程间通信

linux下进程间通信在linux的生产中我们不可能是单个进程完成某项任务,很多时候需要进程间实现交互。其中包括数据传输:⼀一个进程需要将它的数据发送给另⼀一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:⼀一个进程需要向另⼀一个或⼀一组进程发送消息,通知它(它们)发⽣生了某种 事件(如进程 终⽌止时要通知⽗父进程)。 进程控制:有些进程希望完全控制另⼀一个进程的执⾏行(...

2018-09-07 09:04:30 303

原创 linux下的进程

linux下的进程在我们linux的学习中,有一个很重要的概念就是进程, 进程就是程序的一个执行实例,是担当分配资源的实体,是资源竞争的最小单位。简单来说就是正在运行的程序。 我们在学习linux的时候,会发现有一个规律就是管理者先将被管理者进行描述在组织起来。对于进程来说,linux用一种来存放关于一个进程的描述信息,这个结构体就是PCB(process control block) 在...

2018-09-03 16:41:40 209

原创 系统文件I/O接口

系统文件I/O接口文件IO是指对文件进行数据输入与数据输出,我们程序的本质就是对输入的数据进行处理然后输出,可是数据是在文件中的,在linux下一切皆文件,所以程序就是要实现对文件的读写操作 可是我们程序不能直接去操作文件,这个时候就需要系统提供调用接口来供我们使用从而根据系统接口处理读写数据。 我们在C语言中学习的几个库函数fopen,fclose,fseek等底层也是调用系统接口实现,...

2018-08-22 18:31:14 184

原创 linux常用命令大全

linux常用命令大全很多新手在刚接触linux的时候会因为习惯了图形界面的操作系统突然面对linux很不习惯,这一篇博文将通过介绍linux常用命令以及举例练习帮助熟悉linux使用。ls用法:ls 选项 目录或文件【ls -l text】 功能:列出子目录与目录下文件 常用选项: -a 列出目录下所有文件包括以.开头的隐藏文件 -l 列出文件的详细信息 -r 对目录进行...

2018-08-17 17:53:29 209

原创 动态内存管理(C++)

动态内存管理(C++)在C语言中我们为了解决部分问题从而选择在堆上开空间,从而有了动态内存管理,故名思意,动态内存管理就是我们自己向内存申请空间自己释放,在C语言中我们用malloc calloc realloc free这几个函数来向堆上开辟释放空间,但是在C++中由于有类的关系所以与C的申请方式不一样,这一篇博客我们来看一看C++中的动态内存管理。new与delete在C++中我们...

2018-06-26 18:05:25 285

原创 类和对象(二)

类和对象(二)这篇博客主要根据const修饰成员函数,内联,友元函数以及静态成员这四个方向说明。const修饰的成员函数在以前的学习中我们学习了const修饰指针,修饰指针指向的变量,const修饰变量以及const修饰函数返回值等,这一次我们学习const修饰成员函数。 首先const放在函数后面:void fun()const 这样表示const修饰的是this指针所指向的...

2018-06-22 14:34:45 151

原创 类和对象(一)

类和对象(一)面向对象面向对象程序设计 概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。 对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。 C++不是纯面向对象语言,而是基于面向对象的语言 (ps:因为它包含C的部分,C是面向过程)访问限定符C...

2018-06-21 13:49:40 161

原创 引用和指针

引用和指针在C语言中我们习惯在某些场景下用指针操作,可是指针操作虽然灵活也有很多的风险,而且指针操作偏底层,对于面向对象的语言来说不是很方便,C++中我们用引用来替代指针的部分操作。引用的概念引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。 定义的格式为: 类型 &引用变量名 = 已定义过的变量名; 引用的特点: 1. 一个变量可取多个别名 2....

2018-06-14 15:27:16 150

原创 初入C++

初入C++通过这半年的学习,我掌握了C语言的基础知识以及数据结构的基础知识,不过在用C语言写数据结构的时候我发现C语言什么都需要自己造轮子,在某些场景下很不方便,比如当我们需要两个不同类型的链表的时候C语言处理就很麻烦,因为他不支持泛型编程,同时在处理一些练手的小项目的时候很不方便,比如写一个日历,面向过程编程就显得很吃力,这个时候我决定学习C++来解决上述问题以便更好的解决问题。 可是在还...

2018-06-10 21:36:41 178

原创 【每日一题】求二叉树中两个结点的最近公共祖先结点

求二叉树中两个结点的最近公共祖先结点首先我们拿到题目是和二叉树相关,二叉树其中如果是搜索树的话那这个问题很简单,我们直接按照节点的大小比较就可以,如果根节点比两个节点值都大那两个节点的值都在左子树,以此类推。可是更常见的情况是一般二叉树。 对于一般二叉树而言,我们要找到最近的公共祖先节点,我第一个反应是把这两个节点的路径都找到,然后对比路径,然后找到最近的公共祖先节点。 1.找到两个节点路...

2018-05-31 11:44:36 2596 2

原创 C语言动态内存开辟

C语言动态内存开辟在我们日常的编码中,经常使用的开辟内存方式是直接在静态区开辟一个变量,这里我们开辟的空间有两个很大的局限性,我们必须知道我们要开空间的大小,不然我们没办法开,而且比如我们开了一个数组,我们就必须申明数组的大小,不然我们没办法告诉编译器要开多少。可是当我们类似要实现一个顺序表之类的时候,他是要随时插入数据的,这种开辟方式显然不适合我们使用,这里C语言提供了一个动态开辟内存的办法...

2018-05-28 23:06:48 1488

原创 时间复杂度与空间复杂度

时间复杂度与空间复杂度时间复杂度与空间复杂度是我们在学习计算机时很重要的概念,可是很多同学对于时间复杂度与空间复杂度的重要性和概念不是很清晰,这篇博文将剖析时间复杂度与空间复杂度的应用。 首先我们为什么要在敲代码的时候注重时间复杂度与空间复杂度呢,举个例子,我们要处理上亿数量的文件,同样可以达到效果的两种算法一种我们只需要遍历一遍所有文件,有一种我们需要遍历文件数量的平方次,同样的一个功能人...

2018-05-27 22:40:51 711 1

原创 常见排序算法剖析与比较

常见排序算法刨析与比较在这个大数据时代,我们经常需要面对海量数据处理,其中少不了对于排序算法的优化,本篇文章将归纳部分常见排序算法的算法原理,利用图文解析算法,并且通过时间复杂度,空间复杂度以及稳定性等各方面对于常见排序算法进行简单刨析与比较。常见排序算法分类首先常见的排序我们根据排序的方式可以分为三大类交换排序,插入排序,选择排序。 交换排序故名思意就是找到数据将其进行交换,从...

2018-05-26 16:44:13 356

空空如也

空空如也

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

TA关注的人

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