自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

南猿北者博客

热爱编程,热爱生活。

  • 博客(126)
  • 问答 (1)
  • 收藏
  • 关注

原创 redis哨兵

哨兵机制的大致工作原理如下:我们在启动redis主从结构服务过后,我们会再多开几个单独的进程,这些进程就是哨兵进程。这些进程不存储数据,就专门用来监控主从结构中的所有节点,当这些监控进程检测到主节点挂掉过后,那么这些监控进程会从这个主节点中的从节点中挑选出一个从节点晋升为新的主节点,并且会将这个新的主节点的IP和端口号通知给此时连接着的客户端;检测主节点是否挂掉选举新的主节点通知客户端接下来我们将围绕着这三个过程来具体讲一讲,哨兵节点如何检测到主节点挂了?如何选举新节点?如何通知客户端;

2024-05-22 23:45:30 474

原创 redis主从复制

主从复制结构,相比于单点结构来说提高了服务的可用性和可靠性,同时也调高了单点结构的服务上限;redis通过主从复制结构能够实现主节点的多个副本,及时从节点挂了一个也不影响整体的可靠性和数据丢失问题;主节点专门进行写,从节点专门进行读,可以减轻主节点的访问压力,提高整个系统的可用性;复制⽀持多种拓扑结构,可以在适当的场景选择合适的拓扑结构。复制分为全量复制, 部分复制和实时复制。主从节点之间通过⼼跳机制保证主从节点通信正常和数据⼀致性。

2024-05-20 19:34:59 549

原创 redis 事务

答: 当客户端和redis服务器进行连接过后,redis服务器会给每个客户端都维护一个队列,这个队列就用来专门存储客户端未提交的事务的命令,当客户端输入exec事务提交命令过后,redis服务器才会将这个队列里面的命令全部取出来一次性执行,并且在执行的过后中,就算有其它客户端的命令到来了,也无法“插入”到这批命令集合中进行执行,只有当这一批命令执行完毕过后,才会去处理下一个客户端的命令。所谓事务,说白了就是一些命令的组合,这一组命令要么全部执行完毕,要么全部不执行,不会存在执行到一半就结束的状态;

2024-05-19 13:58:54 528

原创 redis 持久化

无论触发多少次RDB持久化,在硬盘上RDB文件都始终只有一份;RDB文件使用二进制的形式来进行存储的,并且在存储的时候redis默认采用LZF算法对生成的RDB文件进行压缩处理,压缩后的文件远远小于内存大小,虽然这很消耗cpu,但是降低了硬盘空间的占用率,同时在redis重启的时候,加载RDB文件恢复数据远远快于AOF文件;对于形成的RDB文件不要乱改,不然可能造成RDB文件出错,导致redis服务器起不来;redis官方给我们提供了redis-check-rdb 这个命令来检查rdb文件的完整性。

2024-05-18 16:57:08 943

原创 常用控件 (二)

Qt框架内部管理着QWidget对象表示咱们的窗口。此处这种用法实际上叫“事件”,是另一种表示用户操作的用法,在之前我们就已经学习了使用信号来表示用户的操作,但是现在同样可以使用“事件”来表示用户的操作;此处把QLabel中的文本设置为“快捷键&A”这样的形式,其中&符号后面跟着的字符,就是快捷键,可以通过alt+A的方式来触发该快捷键;因为上面的设置是在widget构造函数里面设置的,是一次性的,当程序跑起来过后,坤坤会铺满初始屏幕,但是之后窗口大小在发生改变的话,那么坤坤还是会保持原样不回变化;

2024-05-11 00:06:41 908

原创 常用控件(一)

设计思路:在界面上主要有5个按钮控件,其中四个按钮控件为方向键,一个按钮控件为target目标控件,当我们使用鼠标点击或者快捷键操作这四个控件的时候,那么这个target目标控件将会跟随着被点击的控件所指的方向所移动;clicked(bool): 点击,即鼠标左键按下+松开会触发该信号,在触发该信号时,会将该控件是否被选中的状态也一并发送出去,对于QPushButton按钮来说没用,对于QRadioButton来说有用;pressed(): 按下,即鼠标左键按下,就会触发该信号;

2024-05-10 20:07:50 545

原创 初识redis

Redis是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满⾜很多的应⽤场景,⽽且因为Redis会将所有数据都存放再内存中,所以它的读写性能⾮常惊⼈。

2024-04-26 20:36:36 686

原创 QWidget核心属性(二)

嗯,不错的,运行结果是符合预期的,但是有一点小瑕疵就是,白天模式和原始模式是不匹配的,按理来说,原始模式应该就是白天模式,白天模式就是原始模式,但是白天模式更白,原始模式似乎偏黄一点,这是为什么?使用图形化创建有一个好处就是,可以随时预览我们设计的结果,但是缺点也很明显就是,只能静态预览,如果我想们想要做到字体随着代码的运行而改变,那么通过代码创建就不失为一个很好的选择;通过实验,我们发现,将文本框1的FocusPolicy设置为NoFocus过后,就无法在使用鼠标或者Tab键来切换文本框1了;

2024-04-24 17:55:44 981

原创 QWidget核心属性(一)

Widget 是QT中的核心概念,英文原意是“小部件”,我们此处也把它翻译成“控件”;控件是构成一个图形化界面的重要因素!向上诉例子中的:按钮、多行输入框、树形视图、下拉框等等,都可以称为控件;QT作为一个成熟的GUI开发框架,内置了大量的的常用控件。这一点可以在QT Designer中看出端倪:并且QT也提供了“自定义控件”的能力,可以让程序员在现有控件不能满足需求的情况下,对现有控件进行扩展或者手搓出新的控件;学习QT,其中一个很重要的过程就是熟悉并掌握QT内置的常用控件;

2024-04-18 19:56:35 753

原创 信号与槽机制

信号”这个词在我们的日常生活中随处可见,比如:信号灯变绿,我们行人进行通行、鸡叫表示天亮了、下课铃响了代表着下课了、王者连跪表示我们该充钱了等等信号这个概念,在我们的生活中随处可见。从以上的例子中我们仔细观察的话其实是会发现,每一个信号后面都对应着我们的一个动作,比如:绿灯了,我们要通过人行道、鸡叫了我们要起床了、下课了我们要去干饭、王者连跪了我们要打开微信充钱…这些信号后面伴随的动作是怎么来到?或者说我们怎么知道接收到这些信号后该做什么?当然是生活经验、和老师学校教的反正不可能是临时起意嘛!

2024-04-15 23:21:45 825

原创 初识 QT

Qt 是⼀个跨平台的C++图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤C++语⾔进⾏⾼级开发。指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分。Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤Qt框架进⾏应⽤程序开发⽽设计。

2024-04-12 00:15:11 933

原创 ProtoBuf的学习和使用(C++)

在单个.proto文件中可以定义多个message,同时proto3语法也支持嵌套1定义message,并且不限制嵌套深度;单个.proto文件中可以定义多个message支持嵌套定义message;只要保证同级字段之间不同名不同编号即可;导入其它.proto文件,语法引入的文件声明了package,使用其类型时需要用[命名空间消息类型]的格式;xxx();//获取字段(const 对象)set_xxx();//设置字段//清除字段。

2023-11-13 13:34:52 2011 7

原创 git笔记

git clone 命令会将远程仓库的标签信息和分支信息都拷贝下来,但是只会拷贝远程仓库默认分支的历史版本,而一般情况下远程仓库的默认分支就是master分支,因此git clone实际上就只会将master分支上的历史版本拷贝下来,不会讲其它分支的历史版本拷贝下来。本地local_dev分支与远程仓库的dev分支建了联系,因此当我们是用git push和git pull的时候实际上是从远程dev分支上拉取数据到本地的local_dev分支。//本地分支与远端分支建立联系。//本地分支与远端分支建立联系。

2023-11-06 22:45:18 474

原创 MySQL事务管理

事务就是一堆DML语句组合在一起的集合,这些语句在逻辑上存在一定的相关性,这一组DML在执行过后只会得到两种结果:1、这一组DML语句全部执行成功过后的结果;2、这一组DML完全没有执行而得到的结果;不会存在执行到一半,然后出错了得到的结果,即使是执行到一半然后出错了,MySQL也会将已经执行的结果恢复到初始状态;因此对于上层用户来说,用户执行一个事务过后就只会得到最终结果和初始结果这两种结果,不会得到处于中间状态的结果;同时,事务还规定了不同的客户端看到的数据是不一样的!

2023-09-22 20:24:58 263

原创 MySQL使用C语言链接

对于MySQL的各种接口,官方也给我们提供了文档来查看,我们可以去官网进行查询;

2023-09-19 22:38:23 579

原创 MySQL用户管理

我们知道,我们使用create user语句创建出来的用户是没有任何权限的,没有任何权限也就意味着该用户干不了任何事情,这肯定不是我们想要的,为此我们需要给用户一定的权限,在MySQL中于权限相关的语句叫做DCL语句;一般情况下,我们的MySQL服务是不会暴露在公网上的,因为不安全,有可能遭受黑客攻击,因此我们的MySQL中的用户一般只允许本地登录,如果实在要进行远程登录,那么也必须限制为特定ip登录;通过对比我们可以发现,cxk用户在没有任何权限的情况下,看到的数据库是极其有限的!

2023-09-18 17:38:17 230

原创 MySQL视图

那如果我要筛选KING、FORD、MILLER等的部门号呢?我们是不是每次都要重新写上面的SQL语句,这样效率是不是太慢了?因为每次查询都要做笛卡尔积,太慢了,同时SQL语句也比较长,难的写;视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一些列带有名称的列和行数据。视图的变化会影响到基表,同理基表的变化也会影响到视图;其中:像emp、dept这样提供原始数据的表叫做。修改了视图,对基表数据有影响;

2023-09-17 22:43:36 289

原创 MySQL索引

而如果我们使用page来与磁盘进行交互的话,那么当我们第一次查询id=1的数据的时候,OS会将id=1附近的page大小数据全部加载进内存,这些page个大小数据中自然也就包括id=2、3、4、5的数据,那么此时再查询id=2的数据的时候直接在内存中查询即可,不用在从磁盘中加载数据了,同理在查询id=5的数据的时候也不用在进行加载5次数据了,直接在内存中就能进行查询,在本次查询中我们只需要一次IO!但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。

2023-09-12 13:35:23 208

原创 MySQL内外连接

在以前我们直接利用from子句对多个表做笛卡尔积的时候,MySQL会无脑的将一张表中的每一条数据与另一张表中的所有数据进行连接,然后形成一张新表,然后再由我们自己利用where子句筛选出有意义的数据,这实际上是内连接的一种,而实际上我们可以在连接的时候让MySQL不要无脑连接,可以让MySQL将满足条件的数据连接起来,这样的话我们就得到了一张有意义的表,我们就不用自己在where子句中进行筛选了,这也是内连接的一种,这里是利用了前面学习的多表查询的方式,这也是内连接的一种;

2023-09-09 00:06:52 719

原创 MySQL复合查询

首先员工姓名这些信息在emp表中,而工资级别在salgrade表中,因此我们本次查询需要进行多表查询,因此首先emp表与salgrade表进行笛卡尔积,如果想要筛选出有意义的数据我们就得首先将有意义的数据筛选出来,就比如:张三工资800¥,它的工资等级就不可能是2、3、4、5级别,只能是1等级,为此有意义的数据的筛选条件是:sal betweent losal and hisal;当然这里除了上面的作法,我们还有第二种作法,第二种作法就是,我们不是要求工资高于30号部门的所有员工的工资的员工数据吗?

2023-09-08 18:26:27 346

原创 MySQL内置函数

1、如果没有显示说明的话,那么日期就代表:年月日,时间就代表:时分秒;如果不是这个格式会报错;

2023-09-07 12:41:51 159

原创 MySQL基本查询

聚合函数:就是MySQL专门针对一组数据进行统计的内置函数;

2023-09-04 22:50:38 265

原创 项目---日志系统

本项目实现的是一个多日志器的日志系统,说白了也就是多种类型的日志器,程序员可以通过使用我们的日志器来将指定日志消息按照指定格式和输出等级写入到指定位置!程序员再使用我们日志器的时候只需要初始化好日志器的格式化方式、日志输出等级、日志的实际落地方向、以及日志器的类型(同步写日志/异步写日志)就可以了,之后就可以使用我们的日志器输出日志消息了;以上是几个大模块,当然不排除在实际开发过程中需要我们在细分几个小模块出来!以下是几个模块交互的简图:注意我们所实现的日志系统是能在Linux和Windows平台下都

2023-08-27 03:24:44 1575

原创 MySQL表的约束

于是他就去学校的班级表数据库里面哐呲哐呲删除了班级号为20的班级的所有信息,可是某一天新老师在维护学生表数据库的是否发现李四同学属于我们学校的20班,可是这个新老师会认为我们学校没有20班啊,是不是录学生信息的时候把学生信息录错了,于是它哐呲哐呲的就将李四同学的基本信息从学生表中删除了,这就导致李四同学一下成为的学校黑户!这个错误就是在告诉我们当前值不允许插入空值,这也就要求我们要插入一个合法的数据,不能插入null,这也就保证了MySQL数据库里面的插入的数据一定是可预期的、合法的!

2023-08-21 17:42:18 977 2

原创 MySQL数据类型

我们可以将flag的bit位数改大一点,比如改成8位,然后插入一个flag=65的数据,按照我们之前的理论,那么最后显示的时候就应该以65的阿斯克吗字符显示,而65的阿斯克吗字符是’A‘,也就是说如果我们插入一组数据flag=65过后,在输出表结果,如果能看到’A‘那么就说明MySQL在显示bit类型的字段的时候确实是以阿斯克吗字符的形式来展示的;我们可以看到我们本次插入的长度已经超过了当如我们设定的name(10)的限制,因为当前是使用的utf8编码,在utf8中一个汉字的大小是3字节!

2023-08-20 16:00:07 194

原创 MySQL表的操作

在日常操作中尽量不要删除、修改一列数据或者删除或修改整个表结构,因为上层的代码是依赖于你这个数据库的,如果你在底层乱改数据库的话,那么上层也是需要跟着改动的,如果上层代码量不大还好,一旦大起来后果不堪设想!记住是删除表结构的某一个字段,还是对表结构进行修改,而不是删除整个表!注意区别两者之间的差别,修改表结构,用的是DDL语句,修改表数据内容用的是DML语句;删除表结构是删除整个表,而不是删除表中的内容,改删除语句属于DDL语句;增加表结构属性,无非就是增加给表结构多增加一列属性嘛;

2023-08-18 19:15:10 3906

原创 MySQL数据库的操作

从两个备份文件中,我们可以看见,带-B的备份文件在备份的时候会将创建数据库的语句也备份下来,而不带-B的备份文件不会将创建数据库的语句备份下来,因此当我们对d1.sql执行还原操作的时候mysql客户端会根据d1.sql的第一句还原语句还原出数据库,而还原d3.sql的时候则不会,而是直接进行还原表的操作,因此这也就是为什么当我们还原不带-B的数据库备份文件时需要先创建一个数据库的原因了!我们可以发现,我们的确完成了一次数据库的创建,可是前面我们说了数据库也是一个文件啊,那么这些数据库文件存储在哪里呢?

2023-08-17 23:15:30 1277

原创 数据库基础

数据库本质上也是一个文件,它是按照特定结构组织在一起的数据的集合!是存储数据、管理数据、组织数据的一套解决方案!主要是因为,如果采用文件来存储数据的话,对于文件的维护需要我们程序员自己来进行,比如当我们想要在文件中查早一个数据时,我们得自己手动编写一个查找逻辑,查找完毕过后,我们还需要自己手动完成文件的关闭工作,我们程序员的维护成不就比较高;

2023-08-17 20:16:03 201

原创 socket套接字

2、给套接字绑定ip地址和端口号(一般情况下,客户端的ip地址和端口号不需要由我们开发人员来绑定,因为有可能我们绑定的端口号和该主机下的其它客户端的端口号发生冲突了,要是其它客户端先运行起来,那么我们的客户端就无法启动,一启动就挂掉,对于用户来说体验非常不好,因此客户但的ip地址和端口号的bind工作一般都是交给OS来自主分配和绑定!首先在网络传输中,我们给对方发送了消息,对方在接收到消息过后可能也想给我们发送消息,因此在向对方发送消息的时候,我们会将自己的IP地址和Max地址也发过去这无可厚非!

2023-07-25 18:04:51 205 1

原创 C++特殊类设计

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理.

2023-07-14 23:06:30 232 5

原创 C++智能指针

什么是智能指针?

2023-07-13 21:24:27 528 3

原创 C++异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。

2023-07-05 00:15:39 191 8

原创 C++11

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2023-06-05 13:50:41 612 6

原创 位图和布隆过滤器

可是要是我们借用一下哈希函数的思想,利用一个哈希函数将我们的自定义类型转换成整数,然后再根据哈希函数转换出来的整数来与位图建立间接映射呢?是不是自定义类型就能使用位图结构了?理论上是可以的,但是既然我们都用哈希函数了,那么必然会存在哈希冲突啊,也就是说一定会有多个自定义类型对应同一个哈希地址,我们该如何减哈希冲突?1、设计一个极其强悍的哈希函数,使其产生哈希冲突的概率极小;但是这往往都需要数学造诣颇高的大佬;2、给一个自定义类型用多组哈希函数进行映射,那么一个自定义类型就会得到多组哈希地址!

2023-05-28 22:00:50 1000 6

原创 手撕哈希表

如果我们真的这样做的话,效率极低不说,我们原本的元素本来就在自己合法的位置,可是经过我们这么一挪动,Key值与哈希地址的关系就全被破坏掉了,比如上面的98,当我们想要查找98时,根据哈希函数计算出来的哈希地址就是8,那么我们从该哈希地址处开始查找,可是都找到空了我们都没有找到98,这次查找就会失败,但是实际上98是存在于哈希表中的!可是我们真的需要进行尾差吗?因为,我们解决哈希冲突的手段就是不断的去抢别人的位置,可是当正主来了的时候,发现自己的位置被别人占着,它有会去占别人的位置,如此恶性循环……

2023-05-18 13:13:37 725 8

原创 手撕红黑树

节点有了,我们再来把红黑树这个结构也定义一下吧:insert为了表述方便,我们就用parent表示父节点;cur表示插入节点;grandfather:表示爷爷节点;uncle:表示叔叔节点;综上所述,也就这三种大情况,同时通过上面的讨论为我们可以知道,对于uncle不存在/uncle存在且为黑这两种情况来说处理方法是完全一样的,我们可以合并为一起处理,这样的话,最终的情况也就变为了2种,下面是代码实现,可能有点略有不同(博主主要是跟着STL的新式保持一致,看不懂的地方可以去查手册,但是大体逻

2023-05-12 15:29:25 1226 14

原创 Linux进程信号

进程在没有接收到信号的时候,就已经知道了如果接收到了这些信号,应该怎么处理,因为程序员在设计进程的时候,就已经设计了进程该如何识别信号。信号的产生对于进程来说是异步的,也就是说进程也不知道它自己会在什么时候收到信号,信号的发送和进程的执行是两个独立的操作;进程在接收到信号的时候,并不会立即去执行该信号,因为有可能在进程接收到该信号的时候,正在做一些优先级更高的事情。在未来的一段合适时间内,进程会去处理收到的信号;

2023-05-10 00:34:50 1208 7

原创 手撕AVL树

在插入节点过后parent节点的_bf变为了-2或2,那么说明在插入节点之前,parent节点的平衡因子一定是-1或1(证明方法与前面无异),那是不是说明,在插入节点前后,parent这课树右子树-左子树的高度由-1或1变成了-2或2,我们在深入挖掘一下,这个插入的节点是不是一定是插在左右子树中高的一颗子树中的!因此,现在我们向一颗AVL树中插入节点,那么势必会导致AVL树中的某些节点的平衡因子发生改变,为了保证插入节点过后,这课树依旧是一颗AVL树,我们需要对相关节点的平衡因子,进行调整;

2023-05-01 20:36:19 817 45

原创 Linux下进程间通信

管道是Unix最古老的进程间通信的手段;我们把从一个进程连接到另一个进程的一个数据流称为一个管道;1、如果我们要创建的有名管道文件已经存在时,我们的mkfifo函数会创建失败:2、匿名管道的4种场景,同样适用于有名管道3、有名管道,不仅可以作用与“血缘进程”之间,也可用用于非血缘进程之间;4、匿名管道,再利用pipe创建的时候就已经帮助我们打开了,不需后续的手动打开;但是对于有名管道来说,我们在利用mkfifo创建有名管道过后,还需要利用open系统调用手动打开;

2023-04-30 15:19:08 1004 11

原创 Linux基础IO(下)

在Linux中,文件的inode属性中并不存在文件名!文件名是给用户看的!Linux是通过inode编号来识别不同的文件的;

2023-04-09 22:06:51 435 9

空空如也

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

TA关注的人

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