自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 OSI七层网络模型 /TCP/IP五层模型以及封装分用的详细讲解

举个例子,比如说,在创业时,这时候就只需要老板一个人对所有员工进行管理即可,就不需要中层领导,随着公司的规模越来越大,老板管不过来了,这时候就需要有中层领导,当老板想要发布某个任务是,就不需要向底层的员工直接发布,只需要向中层领导发布,然后呢,中层领导就会向下再发布,最后到员工手里,这也就是刚才所说的,上层协议调用下层协议,下层协议给上层协议提供支持,这样在通信过程中,就会很容易的方便管理。数据发出去之后,就会进行一系列的交换机和路由器进行转发,等到目标主机接收到了这些数据后,就会对收到的数据进行。

2024-08-20 22:03:06 1076 1

原创 HTTPS协议和HTTP协议的区别详细图解

举个例子,在刚入大学时,学校就会收集新生的基本信息,例如,姓名,年龄,身份证号,手机号等,来保存到学校的教务系统中,但是,在这么多的学生信息中,学校是如何查询某个学生的具体信息呢,所以,学校就给每个学生都搞了一个学号,使得学号和学生的个人信息对应起来,在疫情那几年呢,学生进学校都需要刷学生证,通过刷学生证,在学校的教务系统中检查出来我是否是本校的学生,包括在学校内,我就可以拿着学生证去任何一个地方。但是,这下就有麻烦了,**将自己的密钥通过网络通信传输给服务器,**如果密钥被黑客截获了,这不就凉了么。

2024-08-20 21:51:52 882

原创 HTTP协议详细图解(请求报文格式,响应报文格式,get和post的区别,状态码详解)

Http协议是“超文本传输协议”(不仅可以传输文本,也可以传输图片,音频,视频等),属于应用层协议,并且它是一种无状态协议,这就表示,服务器不会保存任何关于客户端状态信息,也就是说服务器处理的每个请求都是独立的。其次它默认使用的是80端口进行通信,而且,HTTP协议定义了客户端和服务器之间请求和响应的格式,支持多种请求方法,和响应状态码。

2024-08-20 21:46:40 1916

原创 Spring:DI思想的详细图解

DI 就是依赖注入,,简单来讲,其实就是,把 IoC 容器中的 bean 对象取出来直接放到某个类的属性中,不再需要我们自己手的的new对象。例如下面代码,

2024-08-20 21:20:17 1135

原创 Cookie和Session的区别(详细讲解)

举个例子,在刚入大学时,学校就会收集新生的基本信息,例如,姓名,年龄,身份证号,手机号等,来保存到学校的教务系统中,但是,在这么多的学生信息中,学校是如何查询某个学生的具体信息呢,所以,学校就给每个学生都搞了一个学号,使得学号和学生的个人信息对应起来,在疫情那几年呢,学生进学校都需要刷学生证,通过刷学生证,在学校的教务系统中检查出来我是否是本校的学生,包括在学校内,我就可以拿着学生证去任何一个地方。所以,针对这种情况就是用cookie和session来保存用户的信息。

2024-08-13 21:34:10 386

原创 HashMap中 put()方法的流程、扩容的思路(源码分析~)

2 的幂次方的容量可以使得存储位置分布更加均匀,因为,在哈希函数中,它是将hashcode的低16异或上了高16位,这种方式就使得哈希码的高位信息也能参与到数组索引计算中,从而提高哈希码的均匀性,而在计算存储位置时,是按照 hash & (length-1),length-1的,length是2次幂,这样所得到的数值的二进制就是全1,比如,初始化容量是16,减1后15,15的二进制就是1111, 此时就可以让哈希码的低位能够完全参与到位运算中,从而实现高效的分布。

2024-08-05 22:03:23 311

原创 Redis的事务是什么样子的?Redis的事务和MySql的事务的区别在哪?watch命令的作用是什么?

有这样一种场景,客户端1开启了事务,并且设置了 key,但是,在执行事务之前,客户端2 修改了key,此时,按照常理来讲,key 应该是 222,但是,因为在客户端1中,只是将命令放到了队列中,并没有实际的去执行,只有在输入 exec 命令之后,才会执行,所以,最终的 key 的 value 是 111。从下图可以看到,在开启事务后,set 命令并没有生效,只是返回了一个 queued,这就说明,当前的命令,只是被放入了事务队列中,并没有生效,此时,如果通过另一个客户端获取的话是获取不到的。

2024-08-04 20:46:42 780

原创 锁策略(乐观锁/悲观锁、自旋锁/互斥锁、读写锁、CAS算法、ABA问题)

比如,现在有一个内存M,有两个寄存器 A,B,假设CAS 相当于是一个函数,M,A,B是函数的三个参数,CAS(M,A,B),如果 M 和 A 相同,就将 B 和 M 进行交换,说是交换,其实也就是一种赋值效果,因为,主要关心的是内存中 M 的值,而没人会关心 B 的值,同时整个操作返回 true,如果 M 和 A 不同,就什么事也不做,同时整个操作返回 false,Java中的悲观锁和乐观锁是一种锁的思想,并不是一种具体的锁,所以以下的内容,都是在讲解锁的思想,请读者不要和具体的锁产生混乱;

2024-07-27 20:33:37 1004

原创 Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)

其实,重写的时候,并不关心 aof 文件中原来都有啥,只是关心内存中最终的数据状态,所以,在进行重写时,并不需要再去遍历旧的 aof 文件,把最终结果整理出来,因为,我们只需要获取到最终的数据即可,而最终的数据现在也就是在内存中保存着的呀,所以,子进程只需要把内存中当前的数据,获取出来,以 AOF 的格式写入到新的 aof 文件中即可。此处的子进程写数据的过程,非常类似于 RDB 生成一个快照文件,只不过,RDB 这里是按照二进制的方式生成的,AOF 重写,则是按照 AOF 这里要求的文本格式来生成的。

2024-07-19 23:35:50 1151

原创 Redis 的 RDB持久化策略(详细讲解,注意事项,操作演示)

说到一个数据有没有持久性也就是说,当这台主机或进程重启后,数据是否还存在,而在内存中存储数据时,是没有持久性的,只要重启,数据就会丢失,而在硬盘上存储数据时,就可以保证持久性。对于 Redis 来说,Redis 是一个内存数据库,是把数据存储到了内存中,如果想要让 Redis 也做到持久,就需要让数据存储到硬盘上。如果只单一的存储到硬盘上,那么它和Mysql数据库不就一样了么,而 Redis 相比于 Mysql 这样的关系型数据库,最明显的一个优势就是 :快。

2024-07-16 10:25:24 1197

原创 Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

通过上述的方式,此时在我们的Java客户端代码上,访问 127.0.0.1:8888 ,就相当于访问 Linux 主机上的 6379 端口了,这个 8888 端口就是 ssh 程序监听的端口。

2024-07-14 15:53:38 939

原创 Redis 中String类型操作命令(命令演示,时间复杂度,返回值,注意事项)

字符串类型是 Redis 中最基础的数据类型,在讲解命令之前,我们先讨论以下 Redis 中的 String 类型,关于 Redis 中的 String 类型,要注意三点:① Redis 中的 “键” 都是 String 类型,而 Redis 中的 value 是多种类型的,而在这多种中类型中,它们存储的元素类型也都是 String 类型,比如,list 类型,set 类型,存储的元素值是 String 类型。

2024-07-12 18:07:05 932

原创 Redis 中Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

前面文章讲解了 Set 类型,Set 类型有一个特点,就是集合中的元素是唯一的。,依靠这个分数,就维护了集合中元素的有序性,什么意思呢,举个例子:在三国中,每一个武将都是有武力值的,我们根据武力值就可以对武将进行一个排名,如下图:在 zset 类型中,默认是按照**“升序”**的方式排列的,提供了一组获取元素分数、元素范围查询等等功能命令,下面就来介绍一些主要并且常用的命令。

2024-07-09 19:16:21 941

原创 Redis中list类型操作命令(操作演示、命令语法、返回值、时间复杂度、注意事项等)

如果 list 中没有元素,blpop、brpop 取元素时就会阻塞等待(类似于阻塞队列),同时也设置阻塞等待的时间,如果在超过等待时间之前,list 中有了元素,就直接弹出,如果等到超过这个最大等待时间,就不在进行等待,而且在等待的过程中,Redis 可以去执行其他的命令。如果指定的 key 存在,从“右侧”向 list 中插入一个或多个元素,如果不存在,则插入失败,和 lpushx 命令用法一样。注意:如果指定的下标越界,没有那么多的元素,那么,在获取的时候,列表中有多少个元素就返回多少个元素。

2024-07-06 16:16:57 1324

原创 Redis中hash类型的操作命令(命令的语法、返回值、时间复杂度、注意事项、操作演示)

注意:在 Redis 中,“键” 称为 key,“值” 称为 value,如果value 的类型是哈希类型,则 “键” 称为 field,“值” 称为 value。注意:返回值是一个字段一个值相对着,同时呢,这也是个危险的操作,如果字段特别多的情况下,就可能使 Redis 阻塞。:O(k),因为插入时,可以插入多个,所以,k 表示插入的键值对(field-value) 的个数。:O(k),k 表示删除的键值对(field-value) 的个数。将 hash 中字段(field)对应的值添加指定的值。

2024-07-03 21:13:24 2063

原创 Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)

而 Redis 经常是用作缓存,是替 Mysql 冲锋陷阵的,万一 Redis 被Keys*给阻塞住了,此时其他的查询 Redis 的操作也就超时了,那么所有的查询请求就会给到 Mysql 上,此时突然一大波请求来到给到Mysql,就有可能给Mysql一个措手不及,给 Mysql 也搞挂了,此时就出现大问题了,如果没有及时的发现及时的恢复的话,会出现很大的问题!**时间复杂度:**O(k) ,注意这个k不是所有的数据,而是因为它是可以查看多个key是否存在的,所以这个k是指定的 key 的数量。

2024-07-01 20:11:59 1114

原创 线程池概念、线程池的不同创建方式、线程池的拒绝策略

1.协程:又称为轻量级线程,线程比较轻量是因为线程省略了分配资源的环节,而协程它在着基础上又省略了操作系统调度执行的环节,由程序员自己调度;在Java中呢,主要使用线程池,所以对于协程只是简单提一下;

2024-06-24 17:14:13 1602

原创 分布式系统的演化(单机架构/应用符合和存储服务分离架构/应用服务集群架构/主从分离架构/冷热分离架构)

上述都是针对请求量太大时所做的解决策略,但是,引入分布式系统,不光要能够去应对更高的请求量,同时也要能应对更大的数据量,当数据太多时,也可能会存在一台主机存不下的情况,可以使用多台主机存储,针对数据库进行进一步的拆分,本来一个数据库服务器上有多个数据库,现在引入多个数据库服务器,每个数据库服务器存储一个或多个数据库,如果某个表特别大,大到一台主机存不下,也可以针对表进行拆分,拆分成多个表分布在不同的主机上。而现在计算机硬件发展也是非常快的,哪怕只有一台主机,这一台主机的性能也是非常高的。

2024-06-23 06:52:52 936

原创 什么是哈希冲突?如何解决哈希冲突?HashMap和TreeMap之间的区别?

如下图:当通过相同的哈希算法计算44的哈希地址时,44的哈希地址就和4的哈希地址冲突了。

2024-06-07 18:39:02 898

原创 Selenium 自动化测试工具<2>(Selenium 常用API的使用方法)

可以看到,点击新闻后,又打开了一个新的窗口,但是,上述代码中,我们想要定位的是百度新闻页面的搜索框,从新闻页面中搜索乌克兰,而上述代码它还是在百度主页面查找元素,所以,它找不到这个搜索框,所以就会报错。场景2: 场景1:在百度输入框中输入“张三”,点击百度一下按钮进行搜索,搜索出来之后,点击导航栏上的后退按钮,重新返回到百度的主页面,然后再点击前进按钮,重新回到刚才搜索到的张三页面。场景1:在百度输入框中输入“张三”,点击百度一下按钮进行搜索,搜索出来之后,点击导航栏上的后退按钮,重新返回到百度的主页面。

2024-05-26 17:19:47 505

原创 Selenium 自动化测试工具(1) (Selenium 工作原理,常用API的使用)

将人工要做的测试工作转换成让代码去执行测试,以提高测试效率和测试的质量。测试工具可以是一个jar包,用的时候,导入这个包,调用方法使用,或者是一个web网站,输入测试数据进行测试,或者是一个exe程序,就例如fiddler工具这样,测试工具是各种各样的,

2024-05-22 11:58:34 1271

原创 什么是MVC?什么是SpringMVC?什么是三层架构?

MVC(Model View Controller),它是一种思想,他把软件系统分为 以下三部分:Model(模型):用来处理程序中数据逻辑的部分View(视图):在应用程序中,专门和浏览器进行交互,展示数据的资源Contreller(控制器):可以理解成是一个分发器,来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图,也就是用来连接视图和模型的举个例子:1.比如进入京东的购物页面2.搜索手机。

2024-05-10 08:16:40 8523 4

原创 10000字讲解IoC 思想以及五大注解

什么是 Spring 呢?我们经常听到的都是说 Spring 是一个框架,让我们的开发变得更加简单了,但是这个概念相对来说,太抽象化了,具体点来讲:Spring是包含了很多工具方法的IoC容器什么是容器?容器是用来容纳某种物品的装置。在生活中,水杯就是一个容器,它用容纳水,垃圾桶也是一个容器,它用来装垃圾。在我们学习过的数据结C构中,像 List,Map,Statck等,也都是一个容器,用来存储数据。还有 Tomcat,它就是一个 Web 容器,在上面可以部署很多的Web服务。什么是 IoC?IoC:inv

2024-05-07 14:13:00 1028

原创 10000 字详细讲解 Spring 中常用注解及其使用

如下图京东购物页面,当我们选择点击访问某一类商品时,就会向后端发起 HTTP 请求,当后端收到请求时,就会,那么,后端是如何来查找处理请求相对应的代码呢?答案就是:通过注解来寻找,同时,注解也有其他很多的功能,也分成了很多的注解,下面就来讲解一些网站开发中,一些常见的,使用频率比较高的注解。

2024-05-06 20:51:40 1166

原创 阻塞队列、生产者消费者模型、阻塞队列的模拟实现等干货

1、阻塞队列是线程安全的2、带有阻塞特性:​ a.向队列中添加元素时,如果队列满了,就会阻塞等待,直到其他线程从队列中取走元素时才会解除等待​ b.从队列中向外拿元素时,如果队列为空,就会阻塞等待,直到其他线程向队列中添加元素后,才会解除等待。

2024-03-06 22:40:23 853

原创 wait() 、notify()、notifyAll() 的详细用法

首先,我们知道,线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们并不喜欢这种随机的执行,更喜欢的是它们能够顺序的执行,所以,Java就引入了一种机制,wait() 和 notify() ,它们的而前面的文章中也讲过一个方法,也是能影响线程的执行顺序,但是呢,这个join只能控制线程结束的顺序,而我们想要的是,线程不结束,也能按照我们自己规定的顺序去依次执行;

2024-03-05 22:19:37 1594

原创 volatile关键字的作用 以及 单例模式(饿汉模式与懒汉模式的区别及改进)

因为访问一个变量时,CPU就会先把变量从内存中读出来,然后放到CPU寄存器中进行运算;运算完之后,再将新的数据在内存中进行刷新;对于操作系统来讲,

2024-03-04 00:42:20 926

原创 synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

例如:让线程1先获取 lock1,线程2获取 lock2,然后在 thread1 的内部再尝试获取 lock2,在 thread2 的内部再尝试获取 lock1。以上虽然时嵌套加锁的,但是并未形成环路,得到lock1锁的线程执行,未获得lock1的线程阻塞等待,并且也无法获得lock2。**那么,问题就来了,如果加两次锁,在 }2 的地方是否应该解锁呢?第一点和第二点是锁的特性,如果想要解决死锁,就要破坏第三点和第四点,在Java中,如果一个线程对同一个锁连续加锁两次,不会造成死锁现象。

2024-03-03 00:12:44 577

原创 如何解决线程安全问题(synchronized、原子性、产生线程不安全的原因,锁的特性,加锁的方式等等干货)

那么我们修改一下代码:将thread1的join放在thread1的start后面,最后运行的结果就是对的!!!这个。

2024-03-02 23:47:36 956

原创 什么是后台线程?线程是否存活?线程的中断、join() 等待线程 以及 线程状态 等等干货

通过代码可以看到,想要休眠1000 毫秒,却休眠了1005秒,因为:系统会按照1000这个时间来控制线程的睡眠,等达到1秒后,就会唤醒线程,就会使线程从阻塞状态转化为就绪状态,但是呢,当线程转换为就绪状态后,并不是说就会直接去CPU上执行,这中间会有一个“调度开销”,所以,在时间上,就会和我们预期的不一样。在上述代码中,因为sleep() 的原因,所以抛出了异常,当Thread发出中断信号时,正在处于休眠的线程就会被强制唤醒,唤醒之后,sleep() 就会抛出异常,但是线程并没有终止,而是继续执行;

2024-02-29 00:18:11 914

原创 Java中几种常见的创建线程的方式

上述结果就可以看到,两个线程分别在执行自己的代码,这也就印证了每一个线程都是一个单独的”执行流“, 本来在运行时只有一个执行流,但是遇见 thread.start() ,就开始了兵分两路”同时执行“, 就达到了并发编程的效果,而这里的并发指的是”并行+并发“, 因为,程序员在写代码的时候,是无法感知到这两个线程到底是在一个CPU核心上调度执行还是在两个CPU核心上同时执行, 所以在宏观上也就是我们人的肉眼看着都是在同时执行的,这一点在进程那篇文章中已经讲解的很清楚了。也就没有实现”并发编程”;

2024-02-28 23:31:02 275

原创 进程基础知识(什么是进程?什么是 pid/内存指针/文件描述符表?以及进程的状态,进程的优先级,进程的记账信息,进程的上下文,虚拟地址空间等等)

早期的操作系统,是一个“单任务操作系统”(单核CPU),同一时刻只能有一个进程运行,如果想要运行下一个进程,就需要先退出上一个进程,,而进程要执行,就是需要CPU来执行上面的指令,但是对于单核CPU来说,一个CPU核心,同一时刻只能执行同一个进程的指令,这里也可以进行一个比喻,把CPU核心比喻一个舞台,进程比喻成一个演员,一个演员舞台上表演时,其他演员不能去干扰;通过上述方式,把进程之间给隔离开了,进程之间就无法互相访问,交互数据,但是,如果某个需求中,需要多个进程之间相互配合,那该怎么办呢?

2024-02-27 22:15:09 892

原创 线程基础知识(线程的概念,线程与进程的区别等)

比如有一家公司,现在要到银行去进行 财务转账、贷款、办理社保等等业务,公司就派了张三去完成,但是呢,由于业务比较多,张三一个人完成起来就非常的费时间,所以就喊来了李四和王五帮忙,这样效率就会高很多,所以公司就好比是一个进程,张三、李四、王五就好比是三个执行流(线程),虽然它们各自都在完成不同的任务,但分配一个业务员(一份资源)也可以同时为他们服务,因为归根结底它们都是在为同一家公司工作,与上篇文章中的进程大大不相同,上一个文章中举了取钱的例子,读者可以去看一下就会茅塞顿开了;这之间有没有这要那个的顺序;

2024-02-27 21:38:01 784

原创 什么是Maven ??? (以及关于依赖,中央仓库,国内源)

本篇文章详细讲解了如何创建 Maven 项目,以及什么是中央仓库,私服,国内源,依赖管理等

2024-01-03 17:56:45 1518

原创 常见的锁策略详细讲解(悲观锁 vs 乐观锁,轻量锁 vs 重量锁,自旋锁 vs 互斥锁,公平锁 vs 非公平锁,读写锁等)

本篇文章详细讲解了各种锁策略,以及代码的演示,有需要的小伙伴请认真查阅!!!

2024-01-02 15:44:03 1028

原创 10000字讲解TCP协议(确认应答,超时重传,三次握手,四次挥手等等众多机制)以及UDP协议(UDP报文,校验和)

本篇文章主要讲解了TCP报文,确认应答,超时重传,三次握手,四次挥手,流量控制,拥塞控制,滑动窗口,捎带应答,延时应答等众多重要机制以及粘包问题,TCP和UDP的区别总结

2023-12-19 22:01:40 1571

原创 TCP流套接字编程

对于TCP来说,并不需要,前提是需要先把连接给建立上。这里的“有连接”和“无连接” 不是传统意义上的连接,而是通信双方都保存了对端的信息,而UDP呢,它是每发送一次数据,都要指定一次对端的IP和端口号,然后将生成的数据报作为send的参数发出去,下图就是UDP中的发送数据报的核心代码;TCP和UDP差距是很大的,在数据传输方面,UDP是面向数据报的,而TCP是面向字节流的的,下面列出了使用TCP来实现网络编程所依赖的Socket类,通过这些类和具体的例子,来详细的讲解TCP网络编程。

2023-12-08 22:14:22 1167

原创 UDP数据报套接字

往 Socket 文件中写数据,就相当于通过网卡发数据,从 Socket 文件中读数据,就相当于通过网卡接收数据。注意:为了解决空字符或读取请求时读取的字符串长度不够,造成数据丢失的情况,这里约定,客户端和服务端发送的数据都已 ‘/3’ 进行结尾,读取到 ‘/3’ 就表示请求或响应都全部读取完成。3.服务器接收到请求并计算响应:根据该请求数据,如果是一目录,列出目录中所包含的所有文件及文件夹,如果是一个普通文件,列出文件所在目录中的所有文件及文件夹。5.客户端接收响应:打印出所有的文件及文件夹。

2023-12-05 20:48:17 2038 2

原创 网络通信基础

网络传输时,本质是通过光/电信号进行传输的,例如,低电平表示1,高电平表示0,或者高频光信号表示1,低频光信号表示0,由这样一组 0 或 1 组成的二进制数字进行网络通信,但是,网络通信时,传输的数据由很多种,有:图片,视频,文本等,不同类型的数据,格式也不同,在网络传输时,如何识别这是一个图片还是文本呢?网络协议,是在网络数据数据传输时,在经过所有网络设备时,都必须遵守的一组约定,如,通过哪种格式建立连接,按照哪种格式去识别传输过来的数据,只有遵守这组约定,计算机之间才能互相通信交流。

2023-11-30 21:25:44 525

原创 【数据结构】优先级队列(堆)

这里不做详细的介绍,只需知道,所有引用类型所创建的对象都保存在堆上,包括数组;而这里的堆是将所有的元素,按照完全二叉树的顺序存储方式存储到了一维数组中;

2023-09-16 16:41:07 458

空空如也

空空如也

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

TA关注的人

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