- 博客(152)
- 收藏
- 关注
原创 FTP协议
FTP(File Transfer Protocol),文件传输协议,是目前网上常用的文件传输协议。它允许用户在客户端和服务器之间长传或下载文件。FTP是在TCP/IP协议簇中的应用层协议,它采用客户端-服务器模式工作,并使用两个连接来传输数据。根据数据链路的建链方向和所使用的端口号的不同,分为主动模式和被动模式两种。
2025-11-13 11:48:59
849
原创 PPPoE基础原理
在以太网链路上,虽然以太网具有简单易用,成本低的特点,但是以太网广播网络的属性,使得其通信双方无法互相验证对方的身份,因此通信是不安全的在PPP链路上,由于PPP协议自带的认证功能,因此可以完美解决以上问题,但是PPP协议无法实现多用户接入的功能为了解决这个问题,解决用户上网行为管理和收费的问题,提出了将PPP数字帧封装在以太网数据帧里面,从而在以太网中传输的技术 - PPPoE技术。
2025-11-13 09:54:58
831
原创 NAT基础原理
NAT是一种地址转换技术,它可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的。NAT作为一种缓解IPv4公网地址枯竭的过渡技术,由于实现简单,得到了广泛应用。
2025-11-11 18:36:41
637
原创 ACL 基本原理
访问控制列表ACL是一组规则,按照顺序检查每个人进入或离开路由器的数据包。每条规则可基于源地址、目的地址、协议类型、端口等多种维度进行判断。
2025-11-11 17:13:00
696
原创 DHCP协议基础原理
DHCP:Dynamic Host Configuration Protocol,动态地址解析协议;是一种基于客户/服务器模式的协议,旨在为网络设备自动分配IP地址以及其他网络配置信息,如子网掩码、默认网关和DNS服务器。主要功能IP地址分配:为网络中的每一个设备分配唯一的IP地址网络配置参数分发:提供子网掩码、默认网关、DNS服务器等信息IP地址租约管理:跟踪和管理IP地址租用期限,避免地址冲突减少配置错误:手动配置IP容易出现IP地址冲突等问题。
2025-11-11 00:56:45
677
原创 VLAN基本原理
虚拟局域网。它的出现主要是为了解决交换机在进行局域网互联时无法限制广播域的问题。有效控制广播域增强局域网安全性灵活构建虚拟工作组简化网络管理0 - 4095 (0和4095保留,默认为1)共12bit。
2025-11-10 17:00:21
479
原创 交换机的工作原理
交换机接收到C返回的应答数据后,查询MAC地址表,找到主机A所在的接口,单播至该接口,不需进行泛洪。交换机收到应答请求后,就学习到了主机C的MAC地址,并将MAC与接口信息更新至MAC地址表。交换机收到请求后,就学习到了该端口所对应的主机A的MAC地址,并将其更新到MAC地址表中。主机A发送ARP广播请求,同时该以太网帧已经携带主机A的MAC地址。一个源MAC出现在另一个接口上,会删除老的记录,添加新的记录。,在每个交换机中,都有一张MAC地址表,这个表是交换机。,可以用来隔离冲突域,在OSI参考模型中,
2025-11-07 17:43:33
347
原创 单播、广播、组播
单播,又称为一对一通信,是网络通信的基本模式之一。在单播通信中,一个源设备向一个目标设备发送数据包。这意味着数据包从一个发送者传输到一个明确定义的接收者。单播通信时最常见的网络通信方式,用于许多网络应用,如网页浏览,电子邮件传输和文件下载等。 将数据包发送到广播域的所有设备,而不是特定的单个设备。这种通信模式被广泛用于局域网中,向网络中的所有设备广播消息目标MAC地址:ff:ff:ff:ff:ff:ff:ff目标IP地址:该网段的广播地址广播不能穿透路由器:广播是二层的概念,路由器工作在三层;
2025-11-07 14:44:08
550
原创 网络层协议 - ICMP
InternetICMP()是网络层的一个重要协议。ICMP协议用来,它对于收集各种具有至关重要的作用。虽然ICMP和IP协议一样都属于网络层协议,但是它不像IP或ARP协议一样直接传递给数据链路层,仍需要先封装层IP协议然后再传递给数据链路层。所以在IP数据包中协议类型字段为,代表这该数据报文为ICMP报文。
2025-11-06 17:59:00
597
原创 OSI网络模型(通信方向)
OSI网络模型由国际化标准组织(ISO)提出,其主要目的为将复杂的网络通信过程分为七个层次,使得每层可以独立设计、标准化接口、互相协作。
2025-11-03 17:56:38
245
原创 以太网的性能参数
延迟(网络延迟):数据从发送端到接收端的传输时间。这个时间不仅包含数据包在物理介质上的传输时间,还包括了数据包在网络设备上的处理时间。RTT:往返时间,网络请求从A->B以及响应从B->A所花费的时间。带宽:网络连接可以传输的数据量,通常以每秒比特(bps)表示。它决定了网络连接的容量,即能够传输多少数据量。带宽描述了网络连接的最大数据传输速率,而延迟描述了数据传输的时间。带宽和延迟之间的关系可以类比高速公路:带宽类比高速公路的宽度,延迟类比告诉公路上的速度。严格来讲带宽和延迟申相互独立的参数,但是共同决定
2025-10-24 14:58:52
608
原创 【面试题】介绍一下类加载过程,什么是双亲委派模型
()方法是在编译之后自动生成的。对于初始化阶段,虚拟机严格规范了有且仅有 6 种情况,必须对类进行初始化(只有主动去使用类才会初始化类)
2023-11-26 20:41:49
1497
原创 Spring IOC 和 AOP
IoC (Inversion of Control 控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由给 Spring 框架来管理。AOP(Aspect Oriented Programming)即面向切面编程。AOP 的目的是将横切关注点(例如日志管理、事务管理、权限控制、接口控制)从核心业务逻辑中分离出来,通过动态代理,字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP(面向对象编程)
2023-11-24 21:34:11
586
原创 String 、StringBuffer 和 StringBuilder 的区别?
使用 String 声明一个字符串的时候,该字符串会存放在堆中的字符串常量池中。因为在java中所有的String 都是以常量表示,且由 final 修饰,因此在线程池中它的。虽然执行效率高,但是不安全所以不建议在多线程环境下对同一个 StringBuilder 对象进行操作。我们在创建String的时候,它在常量池中对这些信息进行处理,如果程序中出现了大量字符串拼接、划分等操作效率将非常低。比StringBuffer 效率低的原因:考虑到了多线程的情况,在进行字符串操作的时候 使用。
2023-11-23 20:10:05
391
原创 什么是缓存雪崩、击穿、穿透?
数据一般是存储于数据库中,数据库中的数据都是存在磁盘上的,磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。如果用户的请求都直接访问数据库的话,请求数量一上来,数据库很容易就崩溃了,所以为了避免用户直接访问数据库,会用 Redis 作为缓存层。因为Redis 是内存数据库,我们可以直接将数据库的数据缓存在 Redis 中,相当于数据缓存在内存,内存的读写速度比硬盘快很多,这样大大提升了系统的性能。引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。通常为了保证缓存中的数据
2023-11-18 22:16:47
474
原创 @Autowired 和 @Resource 的区别
比如:UserService接口有两个实现类:UserServiceImpl1 和 UserServiceImpl2 , 而且它们都已经被 Spring 容器所管理。@Resource 有两个比较重要且日常开发常用的属性:name (名称),type(类型)。会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入。(根据名称进行匹配),这个名称通常就是类名(首字母小写)。内置的注解,默认的注入方式是。提供的注解,默认注入方式为。
2023-10-30 14:40:46
189
原创 MySQL 三大日志(bin log、redo log、undo log)
而 bin log 属于逻辑日志,记录的内容是语句的原始逻辑,比如:“给id 为 2 的这一行的 a 字段 加 1”,属于 Server 层。数据页的大小是 16KB ,刷盘比较耗时,可能就修改了数据页中的 几 Byte 数据,为了这些数据而重新刷盘整个页,有所不值。硬盘上存储的 redo log 日志文件不止一个,而是以一个日志文件组的形式出现,每个 redo 日志文件大小是一样的。中数据时以页为单位,查询一条记录,会从硬盘中把该页的数据都加载出来,加载出来的页叫做数据页,会放入。
2023-10-20 20:52:07
702
1
原创 为什么MySQL使用B+树索引,而不使用其他作为索引呢?
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成一种排序号的数据结构。索引的作用相当于书的目录。打个比方:在查字典的时候,如果没有目录,那我们就只能一页一页地去查,速度很慢。如果有目录,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。索引底层数据结构存在很多种类型,常见的索引结构有:B树、B+树、Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam ,都使用了B+树作为索引结构。二分查找树。
2023-10-20 19:18:13
331
原创 Java IO流
IO 即 Input / Output ,输入输出流。IO流在Java中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个 抽象类基类中派生出来的。
2023-10-14 12:25:33
254
原创 Java synchronized 关键字
synchronized 关键字加到 static 静态方法和 synchronized(class) 代码快上都是给 class 类加锁synchronized 关键字加到实例方法上是给对象实例加锁尽量不要使用 synchronized(String a) ,因为 JVM中,字符串常量池具有缓冲功能、构造方法不能使用 synchronized 关键字修饰。构造方法本身就属于线程安全的,不存在同步的构造方法一说。
2023-10-13 13:45:40
182
原创 Java 中 Volatile 关键字
只要在某个线程中无法检测到重排序的情况(即使在其他线程中可以明显地看到该线程中的重排序),那么就无法确保线程中的操作将按照程序中指定的顺序来执行。两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含 "禁止指令重排序" 的语义,synchronized 是由"一个变量在同一时刻只允许一条线程对其进行 lock 操作" 这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,无法得到正确的结论。
2023-10-13 13:13:39
230
原创 HashMap为什么线程不安全?
可能会导致链表中的节点指向错误的位置,从而形成一个环形链表,使得查询元素的操作陷入死循环而无法结束。而不是头插法来避免链表倒置,使得插入的节点永远都是放在链表的末尾,避免了链表中的环形结构。数据丢失问题在 JDK1.7 和 JDK 1.8 中都存在,这里以 JDK1.8 为例。中,多个键值对可能会被分配到同一个桶,并以链表或红黑树的形式存储。这是由于当一个桶位中有多个元素需要进行扩容时,多个线程同时对链表进行操作,还是会存在数据覆盖的问题。操作会导致线程不安全,具体来说会有数据覆盖的风险。
2023-10-12 11:24:59
258
原创 java中HashMap的实现原理
每个 Entry其实就是一个 键值对,并且包含一个指向下一个元素的引用,这就构成了链表。当需要取出一个 Entry 对象时,也会根据 hash算法找到其在数组中的存储位置,再根据 equals 方法从该位置的链表中取出 Entry。HashMap 结合了 ArrayList 的查询效率高的特点以及 LinkedList 插入效率高的特点,但是如果我们要存储的数据过于庞大,肯定会造成多次 哈希冲突,这样一来,链表上的节点就会堆积很多,在做查询的时候效率又会变得很低,失去了 HashMap本来的特点。
2023-10-12 10:37:22
259
原创 为什么需要 Buffer Pool?
MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先从磁盘读取该数据,然后再内存中修改这条记录。那修改完这条记录是选择直接写回磁盘还是选择缓存起来呢?当然是缓存起来号,这样下次有查询语句命中这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。为此,Innodb 存储引擎设计了一个,来提高数据库的读写性能。
2023-10-10 09:40:25
144
原创 String 类型的变量和常量做 “+” 运算时发生了什么?
对象引用 和 “+” 的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象。被 final 关键字修饰后的 String 会被编译器当做常量处理,编译器在程序编译期就可以确定它的值,其效果相当于访问常量。常量折叠会把常量表达式的值求出来作为常量嵌在最终生成的代码中,这时 Javac 编译器对源代码做的极少量优化措施之一。方法是比较的对象的内存地址,而。方法比较的是字符串的值是否相等。
2023-10-06 15:35:21
202
原创 Redis 持久化
当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的 AOF 文件。加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得。
2023-09-28 11:24:43
287
原创 Redis 线程模式
之所以 Redis 为 [关闭文件、AOF 刷盘、释放内存] 这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。图中的蓝色部分是一个事件循环,是由主线程负责的,可以看到网络 I/O 和命令处理都是单线程。后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者(BIO)不停轮询这个队列,拿出任务就去执行对应的方法即可。的,这也是常说的 Redis 是单线程的原因。
2023-09-26 13:50:48
425
原创 Redis 数据结构
随着Redis 版本更新,后面又支持了四种数据类型:BitMap(2.2版本新增)、HyperLogLog(2.8 版本新增)、GEO(3.2版本新增)、Stream(5.0版本新增)。String类型的底层的数据结构实现主要是 SDS (简单动态字符串)。Redis 提供了丰富的 数据类型 , 常见的有五种数据类型:String(字符串),Hash(哈希),List(列表)、Set(集合)、Zset(有序集合)。Hash 类型的底层数据结构是由。String 类型的内部实现。Set 类型内部实现。
2023-09-22 18:25:39
384
2
原创 什么是 Redis?
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成的,因此,常用于。Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流)、并且对数据类型的操作都是的,因为执行命令由单线程负责的,不存在并发竞争的问题。
2023-09-22 12:05:31
543
原创 Grom 如何解决 SQL 注入问题
SQL 注入是一种常见的数据库攻击手段, SQL 注入漏洞也是网络世界中最普遍的漏洞之一。SQL 注入就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常规代码的过程。这个问题的来源就是, SQL 数据库的操作是通过 SQL 命令执行的,无论是执行代码还是数据项都必须卸载 SQL 语句中,这就导致如果我们在数据项中加入了某些 SQL 语句关键字(比如 SELECT,DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
2023-09-22 10:18:19
1111
原创 go语言 rune 类型
ASCII 码只需要 7 bit 就能完整地表示,但只能表示英文字母在内的 128 个字符,为了表示世界上大部分的文字系统,发明了 Unicode ,它是 ASCII 的超集,包含世界上书写系统中存在的所有字符,并且为每个代码分配一个标准编号(称为 Unicode CodePoint),。go 语言中 ,。运行结果为:但是,。
2023-09-21 13:50:29
547
原创 Go中 new() 与 make() 的区别
即类型为 *T 的值。话句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值,如数组,结构体等。new(T) 和 make(T,args) 是Go语言内建函数,用来分配内存,但适用的类型不同。make()只适用于 slice 、map 和 channel。,这个值并不是 T类型的零值,也不是指针 *T ,会为 T 类型的新值分配已置零的内存空间,并。
2023-09-19 10:34:28
155
原创 事务隔离级别是怎么实现的?
事务是在 MySQL 引擎实现的,我们常见的 InnoDB 引擎时支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性。当多个事务并发执行的时候,会引发脏读,不可重复读,幻读这些问题,那为了避免这些问题,SQL提出了四种隔离级别,分别是读未提交、读提交、可重复读、串行化、从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。要解决脏读现象,就需要将隔离级别升级到读提交以上的隔离级别,要解决不可重复读现象,就要将隔离级别升级到可重复读以上的隔离级别。
2023-09-14 10:43:44
224
原创 索引失效有哪些?
当使用 左 或者 左右 模糊匹配的时候,也就是 like %xx 或 like %xx% 这两种方式都会造成索引失效;当我们在查询条件中对索引列使用函数,就会导致索引失效。当我们在查询条件中对索引列进行表达式计算,也无法走索引MySQL在遇到字符串和数字比较的时候,会将字符串转换为数字,然后进行比较。如果字符串是索引列,而条件查询时数字,那么索引列会发生优势类型转换,由于隐式类型转换是通过 CAST 函数实现的,相当于对所有列使用了函数,所以就会导致索引失效。
2023-09-11 18:34:12
220
原创 count(*) 和 count(1) 有什么区别?哪个性能最好?
如果表里只有主键索引,没有二级索引时,那么,InnoDB 循环遍历聚簇索引,将读取到的记录返回给 server 层,然后读取记录中的 id 值,判断id值是否为 NULL,如果不为 NULL ,就将 count 变量加 1。前面的案例都是基于 InnoDB 存储引擎的,但是在 MyISAM 存储引擎里,执行 count 函数的方式是不一样的,通常在没有任何查询条件下的 count(*) ,MyISAM 的查询速度要明显快与 InnoDB。当我们在数据表中插入一条数据的同时,将计数表中的计数字段 + 1。
2023-09-11 09:46:02
731
1
原创 从数据页的角度看 B+Tree
InnoDB的数据是按照 [ 数据页 ] 为单位来读写的,默认数据页大小为 16KB。每个数据页之间通过双链表的形式组织起来,物理上不连续,但是逻辑上连续。数据页内包含用户记录,每个记录之间用单向链表的方式组织起来,为了加快在数据页内高效的查询记录,设计了一个页目录,页目录存储各个槽(分组),且主键值是有序的,于是可以通过二分查找的方式进行行检索,从而提高效率。为了高效查询记录所在的数据页,InnoDB 采用 B+Tree 作为索引,每个节点都是一个数据页。
2023-09-09 21:54:05
286
原创 MySQL 索引
索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象地说就是索引是数据的目录。所谓的存储引擎,就是如何存储数据、如何为数据建立索引和如何更新、查询数据等技术的实现方法。MySQL存储引擎有 MyISAM、InnoDB 、Memory ,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。%5Cinfty。
2023-09-06 15:16:53
450
原创 MySQL一行记录是如何存储的?
所以,在存储数据的时候,也要把数据占用的大小存起来,存到 [变长字段长度列表] 里面,读取数据的时候才能根据这个 [变长字段长度列表] 去读取对应长度的数据。B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。varchar(n) 和 char(n) 的区别:char是定长的,varchar 是变长的,变长字段实际存储数据的长度(大小)不固定。
2023-08-29 20:48:50
1034
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅