自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Go通过CRUD实现学生管理系统

熟悉go的语法和go开发项目的一般流程

2024-05-07 13:04:44 238

原创 记录锁,间隙锁,临键锁还在傻傻分不清楚?一招教你直达行级锁本质

是为了解决幻读问题,也就是防止一个事务A在查询的时候,另一个事务B在它查询的区间内插入,删除,修改数据,导致事务A前后查询到的行数不一致(比如之前查到的是5行,现在查到了7行数据)。你要防止24这条记录以前的记录被修改成24,也要防止32这条记录被修改成24,也要其他事务先在(24,32)区间内插入一条数据,再将这条数据的age改成24,由于age是非唯一索引,所以可以出现多行的age都是24,显然你只需要锁住id=1这一行记录即可,因为id这一列是主键索引,这样其它行的id是无法修改成id=1的,

2023-10-27 17:34:50 226

原创 mysql索引覆盖

如果已经在二级索引B+树上查到了我们想要的数据(比如你想要获取的就是这个主键id,或者联合索引index(a,b,c),你查询select b from table where a=1,也是不用回表的,二级索引b+树的索引字段直接就可以返回b的值),不用回表,这就是索引覆盖,二级索引B+树就可以覆盖到我们所需要的值了。正常查找流程是,我们先在二级索引B+树上查找,然后找到数据所在行的主键id,根据这个主键id去主键索引B+树上查找,获得完整数据(去主键索引B+树中查找数据就是回表)

2023-09-04 14:10:13 275

原创 mysql三大日志 undolog,redolog,undolog

②undo log是逻辑日志(针对的是每一行的记录),存储的是数据修改的逆操作(如果执行了一条 UPDATE 语句将某个字段的值从 10 修改为 15,那么 Undo Log 中就会记录一个相应的逆操作,将这个字段的值从 15 修改回 10。(2)bin log是逻辑日志,redo log是物理日志,记录的是哪个数据页的哪个数据被改成什么了,在不同的机器上数据的位置是不一样的,可能在这个机器上是在这个数据页上,在另一台机器,就是在另一个数据页上。(2)undo log和redo log。

2023-09-04 14:09:30 453

原创 Mysql底层数据结构为什么选择B+树

(2)如果采用红黑树,虽然插入新元素的过程中会自我平衡,调整位置,但是红叉树终究还是二叉树,树的高度还是太高了,I/O操作太多,多路树B树和B+树具有更低的层高。2.B树的非叶子节点和叶子节点都既存储索引key,又存储数据data,B+树的非叶子节点只存储索引,不存储数据,叶子节点才是既存储索引,又存储数据。3.B树的叶子节点不会存储相邻节点在磁盘中的位置,B+树的叶子节点会存储相邻节点在磁盘中的位置,所以B+树支持范围查询。4.B树不用查到叶子节点就可能查到数据,B+树必须一路查到叶子节点才能查到数据。

2023-09-04 14:08:45 1274

原创 leetcode12 整数转罗马数字

再和1000比,比1000小,于是去和900比,比900大,于是添加CM,994变成94......1994 先是和1000比,比1000大,于是添加一个M,然后1994变成994。tags:字符串 模拟题。

2023-07-21 15:43:09 72

原创 leetcode13 罗马数字转整数

对于每个字符,都要去查找它右方的字符,如果右方字符比当前字符大,那就要变成负数了(比如100变成-100)一般来说,都是数字大的放左边,数字小的放右边,比如 XXVII 27 依次是10 10 5 1 1。但也有一些特例:: 4的话,不是||||,而是IV。tags:HashMap 字符串。9的话,不是V||||,而是|V。

2023-07-21 12:11:23 63

原创 leetcode 6 N字形变换

先new一个List出来,List中有nums个StringBuilder,然后对于字符串s中的每一个字符判断一下这个字符应该放到哪个StringBuilder里去。tags:字符串 模拟题。

2023-07-21 10:53:52 74

原创 C++使用迭代器iterator遍历list

此时iter 是一个指针,*iter可以取出指针所指向的元素。

2023-06-26 11:26:30 919

原创 @Async注解

方法在一个单独的线程中异步执行,调用异步方法后,开启单独线程执行这个异步方法里的内容。在主应用程序类上添加@EnableAsync注解,开启异步支持。

2023-06-16 22:19:43 69

原创 Cpp是支持多继承的,多继承场景下如何避免歧义(通过作用域作用符)

【代码】Cpp是支持多继承的,多继承场景下如何避免歧义(通过作用域作用符)

2023-06-12 16:32:13 94

原创 头文件header file和源文件 source file

最主要的作用就是将函数的声明和实现分开,如果想将类和函数交给别人使用,但是又不想让别人知道类和函数的源代码,直接将这个类或者函数的头文件给对方。在这个文件中声明了这个类的构造函数,析构函数,以及一个叫做MyMethod的普通函数。头文件 header file,后缀是.h,头文件负责类的定义,函数声明,常量的定义。一般一个类配一个头文件.h进行声明,一个.cpp源文件进行实现。源文件source file,后缀是.cpp, 函数的实现。下图中就有两个类,每个类一个头文件声明,一个源文件实现。

2023-06-12 14:12:03 1497

原创 C++编译链接模型

编译:将源代码翻译成目标代码。

2023-06-12 13:23:07 459

原创 QT中信号和槽的概念

第二个参数是发送的信号,信号的种类有:(1)clicked点击,按下然后再松开 (2)pressed 摁下 (3)released 释放 (4)toggled 切换(按一下切换一个状态)connect(信号的发送者,发送的具体信号,信号的接受者,信号的处理)老师对象调用hungry方法,学生对象就会调用treat方法请老师吃饭。第四个是处理的槽函数(1)close() 关闭窗口 (2)现在你点击这个按钮就会关闭窗口了。第三个参数是信号的接受者。第一个参数就是按钮指针。

2023-06-12 10:43:27 378

原创 将按钮显示在窗口中

【代码】将按钮显示在窗口中。

2023-06-09 17:27:33 102

原创 创建第一个QT程序

【代码】创建第一个QT程序。

2023-06-09 16:42:46 59

原创 C++中 类的成员函数在类中声明,类外实现

上面的代码在类中声明了两个成员函数,现在需要在类外实现。

2023-06-09 15:17:00 361

原创 C++容器之string

string类中封装了很多成员方法:find 查找拷贝copy删除delete替换replace插入insert。

2023-06-05 23:37:07 52

原创 C++ Vector

创建vector,向vector中添加数据,遍历输出vector中的数据。

2023-06-05 23:04:04 183

原创 C++类模板

Person person("孙悟空",99);

2023-06-05 21:56:08 65

原创 C++函数模板

/也可以swap(a,b);template//声明一个模板。两个函数除了传入参数的类型不一样,其他代码一模一样。swap(a,b);

2023-06-05 17:16:33 51

原创 c++创建一个类

2023-06-05 13:58:25 75

原创 c++引用

引用作为函数的参数:(和按地址传递的效果一样,引用的语法更清楚简单)

2023-06-05 12:41:44 45

原创 结构体变量作为函数参数

void function2(struct student *s) //地址传递。void function1(struct student s) //值传递。struct student s={"张三",18,89};s->name="李四";

2023-06-05 00:20:24 291

原创 指针与函数:使用指针进行地址传递而不是值传递

int main()int a=10;int b=20;*p1=*p2;*p2=temp;

2023-06-04 21:44:40 48

原创 Const修饰指针

以后*p一定等于=10,不能改变,但是p可以指向a,也可以指向b,也可以指向c,但是这些变量的值都必须是10,如果不是10,不能指向这些变量。这个指针就只能指向变量a了,变量a的值可以改成任何值。指针的指向和指针指向的值都不可以修改。

2023-06-04 21:14:28 45

原创 设计模式之工厂模式

Computer computer=shopAssistant.suggest("打游戏");//new 一个外星人电脑的实例。工厂模式就是简单工厂模式,引入工厂类,客户端只需要new 一个工厂对象即可。

2023-05-31 17:24:51 54

原创 前后端分离

后端程序从数据库中获取到数据后,将数据填入到模板文件里面(jsp文件或者freemarker文件,里面有一些数据占位符,把数据替换掉这些数据占位符即可)这就是渲染,得到html页面返回给前端。RestController返回的是一个json格式的数据(返回的是json数据而不是html页面)后端只返回数据,渲染成html页面交给前端做。1.纯后端渲染页面架构。

2023-05-30 10:52:02 54

原创 CAP原则

AP:保证可用性和分区容错性,创建订单后,不等待库存减少(异步去减库存)就返回处理结果了,保证了用户的可用性,牺牲了数据的一致性(但是会通过其他方法比如人工进行补录,校验程序等保证最终一致性)CP:保证一致性和分区容错性,创建订单后,等到库存减少之后才返回创建订单成功的消息,保证强一致性,但是用户体验很差,需要等待较长时间。有两个系统,订单系统和库存系统,订单系统负责创建订单,库存系统负责去减少库存,两个系统都有自己各自的数据库。三者不可能同时满足,只能CA或者CP,或者AP,不可能CAP。

2023-05-30 10:12:51 68

原创 如何跑通一个java项目

要想看懂代码:主要是看Controller,Service,Repository(或者叫Dao),Model(这里存储的是对象)先读Readme(这里会介绍项目结构和技术选型),这里还会告诉你们怎么跑起来这个项目,比如让你先安装数据库,然后.....注意:从 GitHub 上下载项目时,默认情况下会将项目下载到当前工作目录中,你也可以指定先下载路径。Halo项目:最好的博客项目(基于gradle而不是基于maven进行管理的)查找项目代码的途径:github,码云,掘金网。

2023-05-29 17:19:07 1418

原创 一致性哈希算法

假设现在要缓存a.jpg这张图片,hash(a.jpg)%2的32次方,也就是说现在图片和服务器都被映射到了哈希环上了,沿着图片开始,顺时针查找,第一个服务器结点就是这张图片要被缓存的服务器。但是这种算法有个缺点:当服务器数量增加的时候,比如3台服务器变成4台,这个时候可能就不能正常读取到图片了,于是造成缓存失效,大量缓存数据都失效的话,会造成缓存雪崩、有三台服务器:服务器编号分别是S0,S1,S2,现在有3万张图片需要缓存,这些图片最好能够均匀的缓存到三台服务器上。三台服务器的编号分别是A,B,C。

2023-05-27 23:41:03 670

原创 代理模式 静态代理 JDK动态代理 Cglib动态代理

该方法返回一个代理对象,该对象实现了指定接口列表中的所有接口,你要执行被代理类C的function1()方法,只需要执行代理对象的function1()方法即可。下面这张图也写得挺好的:很直观的表明了代理类就是被代理类的增强和扩展。而Cglib动态代理允许代理类和被代理类都不实现接口。动态代理要求被代理类实现接口,代理类可以不实现接口。代理类不需要实现接口,被代理类还是要实现接口。被代理的类C和代理类B都要实现同一个接口。静态代理要求代理类和被代理类都实现接口。代理类B中调用代理类C中相同的方法。

2023-05-24 23:41:17 503

原创 清晰易懂IoC

改进:这样服务端(Service层)的代码不用改动,你客户端传进来Dao1类的对象,那就调用Dao1,那就调用Dao1类的方法。value=”Spring“ 表示给str这个属性赋值Spring(注意这里如果是ref=”XXX“,表示给这个属性赋值一个对象,这个对象已经在Spring容器里面创建好了)这段代码的问题在于,如果想要调用不同的dao层,就需要在服务端的代码Service层中进行改动。现在,服务端被动的接收对象,控制权在用户手上,服务端的代码是写死的,不需要改变。3.依赖注入的三种方式。

2023-05-24 16:23:34 637

原创 CountDownLatch

这是通过一个计数器来实现的,计数器初始化的值为线程的数量,每当一个线程完成了自己的任务之后,计数器的值就减去1,当计数器的值减为0的时候,表示所有线程都完成了任务,此时在CountDownLatch上等待的线程就可以执行了。这一行的时候会检查计数器的值,只要值不为0,当前线程(也就是主线程会进入阻塞态)(2) await()方法,当前线程进入到同步队列中进行等待,直到计数器的值减到0。(4)countDown() 方法,使计数器的值减1。每个线程执行完,计数器的值就减1,最后减为0。

2023-05-23 21:59:50 431

原创 Dubbo

选择Zookeeper作为注册中心(还有Nacos注册中心,Redis注册中心等),服务提供者将服务注册到注册中心去,服务调用者去注册中心中取出服务调用。dubbo-admin是一个图形化的管理页面,可以看哪些服务在注册中心注册了,有哪些生产者,有哪些消费者。#扫描provider-service这个应用下的这个service包,把里面的服务注册到注册中心去。(1)第一个应用程序叫provider-server(提供服务者,被调用服务的)把非核心的服务关掉,释放资源,保证核心服务能够正常运行。

2023-05-23 19:28:18 412

原创 Raft算法

假如领导结点宕机了,需要选一个新的结点成为领导结点,此超时时间间隔最小的A结点会成为候选者,通过rpc请求向其他结点发送投票请求(请求为自己投上一票),并且先给自己投上一票,而且此时任期编号term加1,由0变成1。的(设置成随机的就是为了防止多个结点同时发起投票),比如这里A结点等待领导者结点心跳信息的超时时间间隔是150ms,B结点时200ms,C结点时300ms。(1)追随者Follower:接收来自领导者的消息,当领导心跳信息超时的时候,就自己主动站出来推荐自己当候选人。领导者发送心跳消息机制。

2023-05-23 18:21:22 935

原创 Redis+Lua脚本防止超卖

redis虽然I/O模块是多线程,但是执行执行命令的时候是单线程的,而且支持多行模式,也就是一个lua脚本里的多行代码认为是一个单个任务,单个命令,前面的任务(命令)不执行完,后面的任务无法执行。超卖就是因为查询库存和扣减库存两个操作不是原子性操作,通过rua脚本执行这两个操作可以保证这两个操作原子性。判断库存量是不是大于等于1,如果大于等于1对库存减1,否则就不去减库存。为什么使用lua脚本可以实现原子性,不会产生并发问题呢?

2023-05-21 12:10:20 756

原创 Bitmap

现在使用Bitmap实现统计一个用户一个月签到情况,用31bit来存储,1表示这一天签到了,0表示这一天没有签到。将每一个bit对应一天,1表示签到,0表示这一天没有签到。GetBit:获取offset这个位置的值(0或者1)BitCount:统计BitMap中值为1的bit数量。SetBit:向offset这个位置存入1个0或者1。此时bitmap中存储的就是10101101。返回(integer)1 表示这天签到了。布隆过滤器的底层就是Bitmap。下面表示第一天签到了。

2023-05-11 22:05:00 358

原创 AtomicInteger类

(5)compareAndSet(expect,update)//如果count的值等于预期值(第一个参数),那么就将count的值设置为update,如果不等于预期值,那就什么也不做。(2)getAndIncrement()先获取count的值,再将count的值+1。incrementAndGet()先将count的值+1,然后再获取count的值。decrementAndGet()先将count的值-1,然后再获取count的值。(1)get()方法获取值,set()方法获取值。

2023-04-28 17:14:29 156

原创 线程的生命周期以及sleep()方法和wait()方法

共享对象调用wait方法:obj.wait(),当前线程释A放锁,进入waiting阻塞状态,除非其他线程调用共享对象obj.notify()方法唤醒这个线程,线程A就会去竞争试图重新获得锁,如果获得锁就进入运行态,如果没有获得锁就进入blocked阻塞状态。线程休眠指定时间,不会释放锁,也就是线程即使休眠也是一直保持锁的所有权的,等休眠时间一过,马上进入运行态,不用再去和其他处于blocked状态的线程一起竞争锁。sleep方法和wait()方法的区别。t1我被唤醒了,我又重新开始运行了。

2023-04-26 17:42:38 894

空空如也

空空如也

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

TA关注的人

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