自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis应用缓存

缓存(cache)是计算机中的一个经典的概念,在很多场景中都会涉及到核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便读取比如我去坐动车,那么我会选择将我的身份证放在口袋里,而不是我的背包中的某个夹层中虽然我的口袋小,但是掏出来很快,并且在坐动车时身份证的使用还是比较频繁的~~此时口袋就是背包的缓存这里的速度快,是一种相对的快的概念~通常情况下,OS对于硬件的访问速度是这样的:CPU寄存器 > 内存 > 硬盘 > 网络那么相对于网络,硬盘反倒是显得很快。

2024-03-12 20:24:28 1143

原创 Redis集群

A2:这里直接翻译Redis原作者的话,大致是如下。节点之间的通讯是通过心跳包机制的,而心跳包是频繁的发送,心跳包又包含了该节点的各种信息包括所持有的槽。当槽的个数是16384的时候,位图的大小为2kb,但如果槽的个数是65535的时候,此时的位图大小将来到恐怖的8kb,虽然这对于内存不算什么,但是在网络中,仍然是一个不晓得开销另一方面,Redis集群一般不会超过1000个分片,所以16k对于最大1000个分片的下的情景是足够使用的,同时对应的槽的体积也不会很大。

2024-03-12 09:47:43 855

原创 Redis事务 和 主从复制

什么是事务?其实Redis的事务和MySQL的事务概念上是一样的,都是把一系列的操作绑成一组,让这一组能够批量执行Redis通过复制功能实现主节点的多个副本主节点用来写,从节点用来读,这样可以降低主节点的访问压力复制支持多种拓扑结构~复制有全量复制(开销大),部分复制(开销小),实时复制主从节点之间通过心跳机制保证主从节点通信正常和数据一致性。

2024-03-12 00:32:58 779

原创 Redis持久化

Redis支持RDB和AOF两种持久化机制,持久化能够有效避免因进程退出而造成的数据丢失问题,说白了就是将内存上的数据保存到硬盘上,等待下次加载时再将内存上的数据读取出来。

2024-03-12 00:11:52 775

原创 Redis常见数据类型下

2.hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时的hashlist的读写小会下降,而hashtable的读写时间复杂度为O(1)特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。

2024-03-12 00:01:17 1033

原创 初识Redis

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

2024-03-11 21:10:42 1169

原创 C++的IO流

使用itoa()函数使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。

2023-08-14 22:17:38 419

原创 C++智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.

2023-07-21 13:49:20 84

原创 C++类型转换

强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。

2023-07-20 13:14:40 91

原创 C++异常

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

2023-07-20 13:01:37 60

原创 C++特殊类设计

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取。文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。final关键字,final修饰类,表示该类不能被继承。

2023-07-19 22:24:32 58

原创 二叉树进阶

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。2. KV模型:每一个关键码key,都有与之对应的值Value,即的键值对。1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。二叉搜索树(BST Binary Search Tree),也称二叉排序树或二叉查找树。插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

2023-07-17 22:38:30 93

原创 start&&queue(模拟实现及底层原理)

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back:尾部删除元素操作。

2023-07-17 13:25:45 671

原创 list(模拟实现)

因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过上面的学习,这些内容已基本掌握,现在我们来模拟实现list。

2023-07-16 22:54:29 311

原创 vector模拟实现

假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问题?例如:resize,reserve,insert,assign,push_back等。迭代器失效有两种情况。

2023-07-16 14:28:08 192

原创 C++内存管理

new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请2. 在申请的空间上执行N次构造函数delete[]的原理。

2023-07-12 22:26:50 135

原创 模板(泛型编程)

模板是不能分离编译的,为什么?模板的T是未知的,是需要实例化的,也就是说,你写一个vector int传过去他才知道你要实例化为int,不然他是不会实例化的,只有实例化后才有地址,所以模板分离在链接的时候,因为没有实例化就会爆出错误,因为没有实例化就没有地址,根本链接不上解决方法1. 将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种。2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用。

2023-07-12 22:22:20 239

原创 MySQL基本查询

凡是在select后面的列名称,如果后续我们进行group by分组,凡是在select中出现的原列名称,都必须在group by中出现 -》group by是一个分组函数,如果当前分组条件相同继续按下一个条件查询。-- 2 row affected: 表中有冲突数据,删除后重新插入。-- 1 row affected: 表中没有冲突数据,数据被插入。-- 主键 或者 唯一键 如果冲突,则删除后再插入。案例:删除表中的的重复复记录,重复的数据只能有一份。指定列的顺序不需要按定义表的顺序来。

2023-07-09 10:36:37 169

原创 MySQL用户管理

如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。MySQL中的用户,都存储在系统数据库mysql的user表中。刚创建的用户没有任何权限。root用户修改指定用户的密码。

2023-07-07 23:19:24 573

原创 MySQL视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。修改了视图,对基表数据有影响。修改了基表,对视图有影响。

2023-07-07 21:29:18 180

原创 MySQL内外连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要。查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来。列出部门名称和这些部门的员工信息,同时列出没有员工的部门。如果联合查询,左侧的表完全显示我们就说是左外连接。如果联合查询,右侧的表完全显示我们就说是右外连接。案例:显示SMITH的名字和部门名称。

2023-07-07 21:25:49 286

原创 MySQL复合查询

多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自。显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询。显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门。显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号。查找每个部门工资最高的人的姓名、工资、部门、最高工资。显示各个员工的姓名,工资,及工资级别。

2023-07-07 21:20:07 349

原创 MySQL内置函数

要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值。注意:length函数返回字符串长度,以字节为单位。比如:字母,数字算作一个字节,中文表示多个字节数。md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串。database()显示当前正在使用的数据库。以首字母小写的方式显示所有员工的姓名。获取emp表的ename列的字符集。

2023-07-07 13:52:06 117

原创 MySQL表的约束

这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。

2023-07-07 13:33:40 267

原创 MySQL数据类型

有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]支持小数最大位数d是30。如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255。如果我们有这样的值,只存放0或1,这时可以定义bit(1)。

2023-07-06 23:21:48 306

原创 MySQL表的操作

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。备注:创建一个engine是innodb的数据库,观察存储目录。在users表添加一个字段,用于保存图片路径。将name列修改为xingming。修改name,将其长度改成60。在users表添加二条记录。修改表名为employee。删除password列。

2023-07-06 16:14:58 613

原创 MySQL库的操作

可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_ general_ ci。这时,可以打开看看 mytest.sql 文件里的内容,其实把我们整个创建数据库,建表,导入数据的语句都装载这个文件中。如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原。创建名为 t1 的数据库。

2023-07-06 16:00:05 440

原创 Linux进程概念

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系,截至目前,我们所认识的计算机,都是有一个个的硬件组件组成。每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。所有运行在系统里的进程都以task_struct链表的形式存在内核里。任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。进程的信息可以通过 /proc 系统文件夹查看。

2023-07-04 17:03:06 109

原创 Linux动静态库

然后我们的静态库和动态库就出来了,我们想要进行编译的话,是需要.o和.h文件的,但是我们有了库之后就不需要.o文件了,因为都到库里了,我们就需要去另一个目录该他们包装一下.3.一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在标文件的整个机器码。1.静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再要静态库。2.动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。第一种方法是拷贝到系统目录下。

2023-06-28 19:33:10 216

原创 Linux高级IO

如果服务端写的代码是阻塞式的read, 并且一次只 read 1k 数据的话(read不能保证一次就把所有的数据都读出来,参考 man 手册的说明, 可能被信号打断), 剩下的9k数据就会待在缓冲区中.例如, 典型的一个需要处理上万个客户端的服务器, 例如各种互联网APP的入口服务器, 这样的服务器就很适合epoll.epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反.信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作。

2023-06-25 09:12:42 132

原创 Linux基础IO

5. Linux认为,一切皆文件,感性的认识:文件而言:曾经理解的文件: read、write,显示器: printf/cout ->一种write,键盘: scanf/cin . ->一种read,站在你写的程序的角度,加载到内存,站在内存的角度,前两种是output,最后一种是input,对于普通文件 -> fopen/fread ->你的进程的内部(内存),是input,你的进程的内部(内存)-> fwrite -〉文件中,是output。2.文件的所有操作,其实就两种,对内容,对属性。

2023-06-20 11:14:12 135

原创 数据库基础

数据库,从这个名字也可以知道它是与数据有关的,它其实就是用来存储数据的,但是存储数据用文件就可以了,为什么还要弄个数据库?文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便为了解决上述问题,专家们设计出更加利于管理数据的东西——数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。MySQL是一套网络服务 ,它是由服务端和客户端的,就像mysql和mysqld。数据库vs文件。

2023-06-15 22:27:24 956

原创 MySql事务

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。

2023-05-27 14:45:24 806 1

原创 MySql索引

如何理解硬盘如何理解柱面,磁道,扇区,磁头InnoDB 主键索引和普通索引(主键索引就是B+树,最后一层是数据,然后普通索引是以普通字段的数据做B+树的指针,然后在最后一行的数据域放主键的值,最后回表查询,也就是两遍查找,不一定每次都要回表,因为如果你只要这个普通字段的话就不需要回表了)MyISAM 主键索引和普通索引(主键索引就是B+树,最后一层是地址,他的数据和索引是分开的,这个在之前说了,他的普通索引和主键索引一样)其他数据结构为何不能作为索引结构,尤其是B+和B。

2023-05-25 14:19:30 664

原创 网络层和数据链路层

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.域名使用 . 连接com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.baidu: 二级域名, 公司名.www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议。

2023-05-23 21:30:22 532

原创 传输层协议

注意:这里我么可以发现,为什么我们在应用层编写代码的时候,每一次写端口号的时候,都喜欢uint16_t--协议用的端口号是16位的,udp如何正确的提取整个完整报文的,固定长度的报头->16位udp长度UDP是具有将报文一个一个正确接要的能力的,UDP是面向数据报的。一般而言,我们认为,只有发的消息收到了回应,才算发的消息可靠,被对方收到一般而言,发送的数据都要有响应,这是保证可靠性的底层策略,(确认应答机制)序号+确认序号保证,为什么要有两套序号机制:答因为TCP是全双工的。

2023-05-22 15:52:25 404 1

原创 Linux网络基础二

为什么需要协议解析以及添加报文:因为tcp是字节流式的,收到的数据可能并不完整,就是并不是一个数据,有可能是半个,也有可能是一个半,因为send/write这类接口是把数据写到缓冲区,其他的事情都归Tcp管,因为TCP是字节流式的,所以发送次数和接收次数,没有关系,不像udp发多少次就接受多少次。5.在命令行中,同时用管道启动多个进程,多个进程是兄弟关系,父进程都是bash -→>可以用匿名管道来进行通信,而同时被创建的多个进程可以成为一个进程组的概念,组长一般是第一个进程。(序列化和反序列化)

2023-04-30 13:29:18 909

原创 Linux网络编程套接字

/ 网络地址IP为_ip,因为我们一般是不bind固定ip的,所以这里如果没有具体IP就使用INADDR_ANY,这个宏表示本地的任意IP地址,因为服务器可能有多个网卡,每个网卡也可能绑定多个IP 地址, 这样设置可以在所有的IP地址上监听,直到与某个客户端建立了连接时才确定下来到底用哪个IP 地址。常见的套接字有三种,分别为,域间socket,原始socket,网络socket,理论上,是三种应用场景,对应的应该是三套接口,但是不想设计太多接口,就将所有的接口进行统一。

2023-04-14 17:05:28 506

原创 Linux网络基础

通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,但是它既复杂又不实用,实际中应用的是TCP/IP四层模型。5.经过封装和分用的过程,对于网络交互的接收和发送两方,每一层所看到的数据都是一样的,注:这里指的是IP层之上,因为IP层下的数据传输可能是在不同的网段传输,协议不同对应的报头数据也就不同。4.对于跨网段的数据传输,由于链路层的不同网段存在不同的协议,为了保证数据传输的通畅,此时就需要路由器将数据包针对不同协议进行协议的替换,即数据报头的更换。在这个例子中, 我们的协议只有两层;

2023-03-02 15:37:47 320

原创 Linux文件系统与inode、软硬链接

虽然磁盘的基本单位是扇区(512字节),但操作系统(文件系统)和磁盘进行IO的基本单位是:4KB(8*512byte),此4KB被称为block大小,所以磁盘被称为块设备。为什么不用512字节为单位作为IO的基本单位呢?1.因为512太小了,有可能会导致多次IO,进而导致效率的降低!2.硬件与软件的IO访问大小不同,可以将硬件和软件(OS)之间的关系解耦合。比如磁盘的规格后序会不断变化,但是不影响系统的IO访问大小。

2023-02-17 17:25:37 99

空空如也

空空如也

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

TA关注的人

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