自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Git快速入门

rebase变基操作,不会产生新的提交记录,同时会将分支上所有的提交记录放到目标分支的最末端,优点是更加线性、简洁的提交历史,便于追溯和理解更改,缺点是不谨慎使用,可能会导致提交历史的重写。merge合并操作,会产生新的提交记录,同时各方历史提交记录将按照实际提交时间线穿插,优点是保留了完整的分支历史,易于分支的发展过程。所以通常用于,合代码到公共分支(master/main)上,可以保留各个分支的独立历史记录,少合并次数,并明确哪些提交是从哪个分支合并而来的。:从开发分支分叉出来,用于准备新版本的发布。

2024-12-22 23:59:36 910

原创 Docker快速入门

当你写了个web应用想发给同学看,那他就要运行该web应用的相关环境,再去下载麻烦,部署到服务器上也需要服务器有同样的环境。可能会想到虚拟机,模拟虚拟操作系统,在上面安装环境,但是他是模拟硬件设备,需要把电脑硬件资源分配出来,虚拟出来的是一个完整电脑。而Docker是更加轻量级的可以将web应用,和相关配置好,打包成一个包(Docker镜像),服务器上下载Docker,直接拉取打包好的镜像,直接run(容器)就行。

2024-12-22 23:56:29 940

原创 线程和进程、作业的区别

- 进程是程序的一次执行过程,拥有独立的内存空间,而线程是进程的执行单元,共享进程的内存空间。- 进程之间相互独立,线程之间共享资源,因此线程间通信更方便。- 进程的创建和销毁开销大,线程的开销相对较小。

2024-12-21 20:42:26 1079

原创 短轮询和长轮询

长轮询(Long - Polling)是一种服务器推送技术。客户端向服务器发送请求,服务器在收到请求后如果没有新的数据可返回,会保持这个请求连接处于开放状态,直到有新的数据产生或者达到超时时间。一旦有新的数据,服务器会立刻将数据返回给客户端,客户端收到数据后会立即发起新的请求,如此循环

2024-12-21 20:23:01 839

原创 TCP三次握手,四次挥手

相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。这回答是没问题,但这回答是片面的,并没有说出主要的原因。在前面我们知道了什么是TCP 连接用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。所以,重要的是为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。接下来,以三个方面分析三次握手的原因:三次握手才可以阻止重复历史连接的初始化(主要原因)三次握手才可以同步双方的初始序列号。

2024-12-20 21:56:56 1223 1

原创 WebSocket了解

服务器接收到请求后,检查请求头中的信息,确认是否支持并愿意连接升级。一切正常的话,服务器会返回HTTP响应,状态码为101,表示成功升级到WebSocket协议。具体来说,Socket是一套标准,完成了对TCP/IP的高度封装,屏蔽网络细节,方便开发者更好地进行网络编程。WebSocket是一个持久化的协议,他是伴随H5而出的协议,用来解决http不支持持久化连接的问题。场景,在网页刷刷图文我们用的是HTTP协议,打开网页游戏时,就得切换到WebSocket协议。Socket其实就是等于。

2024-12-20 21:56:19 1158

原创 UDP基本了解

在数据传输过程中,UDP 不需要进行复杂的连接建立、维护和拆除操作,也没有像 TCP 那样的拥塞控制和流量控制机制,这使得 UDP 在发送数据时更加高效,能够快速地将数据发送出去。在网络传输过程中,数据报可能会经过多个路由器和网络链路,由于 UDP 没有对传输路径进行控制和保证,数据报可能会在传输过程中出现丢失、延迟或者乱序等情况。可靠性:TCP是可靠交付数据,数据可以无差错,不丢失,不重复,按序到达。UDP 是面向报文的,它对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。

2024-12-19 21:05:26 1086

原创 TCP基础了解

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。

2024-12-19 20:57:30 950

原创 怎么设计数据库

1. **需求分析:** 首先,你需要充分了解业务需求。这包括确定需要存储的数据类型、数据量、数据访问模式、数据完整性要求等。2. **概念设计:** 在需求分析的基础上,进行数据库的概念设计。这包括确定实体、关系和约束,绘制实体关系图(ER 图)等。3. **范式设计:** 根据概念设计,将数据表组织成满足范式要求的结构。范式设计有助于确保数据的完整性和一致性。4. **物理设计:** 在概念设计的基础上,进行物理设计,包括选择存储引擎、确定索引策略、分区策略等。物理设计应该考虑性能、可扩展性和可维

2024-12-17 19:07:32 662

原创 数据库密码加密

我们会经常看到重置密码,小时候就会有疑惑,为什么不直接告诉我们密码,原来服务器自己也不知道。* 我们都知道密码在数据库中不能明文,不然风险很高,有数据库权限的人还可能恶意利用,所以需要加密,通常使用哈希算法加密密码,而哈希算法又是不可逆的,密码进过哈希算法处理后,就无法知道原来的密码* 常见的哈希算法有MD5,Sha 256,bcrypt* MD5算法不同的密码加密,可能会产生相同的hash值,也就是我们所说的hash冲突* SHA 256在不同密码加密后,哈希冲突情况就极低了,所以他比MD5的碰

2024-12-17 19:07:17 921

原创 java常见的集合框架

JAVA的集合框架可以分成两类。Collection,主要有List、vector、set、queueList代表有序,可重复的集合,像动态数组ArrayList和链表LinkedListSet代表无序不可重复的集合。像HashSet、TreeSetQueue代表队列,像双端队列ArrayQueue,优先队列PriorityQueueMap,代表键值的键值对,HashMap、LinkedHashMap、TreeMap

2024-12-16 17:26:48 753

原创 Java序列化

序列化是将对象的状态信息转换为可以存储或传输的形式(如字节序列)的过程。在 Java 中,通过序列化可以把一个对象保存到文件、通过网络传输到其他地方或者存储到数据库等。最直接的原因就是某些场景下需要使用这种数据状态,像网络中不能传输数据,某些存储场景。在java中常见使用,就是实现Serializable接口,而不想被序列化的字段处理方法使用`transient`关键字就可以了

2024-12-16 17:25:59 1538

原创 一致性哈希算法

一般情况下,我们会使用hash表的方式key-value的方式存储数据,但当数据量大时,我们就会存储于多个节点,然后通过hash取模的方式来决定当前key存储于哪个节点。一致性hash算法就是应对这种情况,它的具体工作原理是这样,通过一个hash环实现,起始点为0,终点为2^32-1,然后把存储节点的ip作为key进行hash之后,会在Hash环上确认一个位置。将实际的物理节点分成多个虚拟节点,在缓存读写的时候,原本直接找对应的物理节点,现在是先找到虚拟节点,再找对应的物理节点,最后再进行读写。

2024-12-15 18:01:34 784

原创 Redis Sentinel(哨兵) 和 Redis Cluster(集群)

Redis集群主要有两种,一种是Redis Sentinel哨兵集群,一种是Redis Cluster。主从集群,包括一个Master和多个Slave节点,Master负责数据的读写,Slave负责数据的读取,Master上收到的数据变更会同步到Slave节点上实现数据同步,但不提供容错和恢复,在Master宕机时不会选出新的Master,导致后续客户端所有写请求直接失败。所以提供了哨兵机制,可以专门监听主从节点的状态,在Master宕机时,从多个Slave中选取合适的Slave作为Master,但

2024-12-15 18:00:52 1331 1

原创 Redis过期key删除策略是什么

常见的**删除策略**1. 惰性删除:只会在取出/查询key的时候才会对数据进行过期检查。这种方式对CPU最友好,但是可能会导致太多过期key没有被删除。2. 定期删除:周期性的随机从设置了过期时间的key中抽查一批,逐个检查,过期就删除。相对于惰性删除,定期删除对内存更加友好,对CPU不友好。3. 延迟队列:把设置过期时间的key放到一个延迟队列里,到期之后就删除key。这种方式可以保证每个过期key都能被删除,但是维护一个延迟队列太麻烦,且队列本身也需要占用资源。4. 定时删除:每个设置了过期

2024-12-14 18:11:42 1147

原创 Redis内存淘汰策略有哪些

1. volatile-lru(least recently used):从已设置过期时间的数据集(`server.db[i].expires`)中挑选最近最少使用的数据淘汰2. volatile-ttl:-------------------要过期的数据淘汰3. volatile-random:------------任意选择数据淘汰4. allways-lru:从数据集(`server.db[i].dict`)中移除最近最少使用的数据淘汰5. allways-random:-----------

2024-12-14 18:11:24 929

原创 你真的理解wait()和sleep()吗

都会进入阻塞状态,wait方法,直接释放锁,也就是对象的监视器,等待被唤醒,需要同Synchronized配合使用,sleep方法,不释放锁,等一定时间。wait 和 sleep 是否会触发锁的释放以及 CPU 资源的释放为什么 wait() 方法不定义在 Thread 中?sleep() 方法为何定义在 Thread 类?线程的 sleep()方法和 yield()方法有什么区别?

2024-12-13 18:25:51 818

原创 notify和notifyAll

- notify():只唤醒一个等待的线程,如果有多个线程在等待,那么被唤醒的线程是随机选择的。- notifyAll():唤醒在该对象监视器上等待的所有线程,但是这些被唤醒的线程仍然需要竞争锁,只有一个线程能够获取锁并继续执行。

2024-12-13 18:24:58 649

原创 数据流动在七层模型中每一层的经历

例如,在网页浏览中,用户通过浏览器(应用层软件)发起 HTTP 请求,请求数据从浏览器出发,依次经过表示层(可能进行加密等操作)、会话层(建立会话)、传输层(封装为 TCP 或 UDP 数据段)、网络层(封装为数据包)、数据链路层(封装为数据帧)和物理层(转换为物理信号)发送到服务器。如果不存在,则会进行广播,除了源端口外的其他端口都会收到该数据帧,直到目标主机响应,交换机从而学习到目标主机的 MAC 地址与端口的映射关系,并记录在 MAC 地址表中,以便后续通信1.对应的服务器 IP 地址)。

2024-12-12 21:22:52 641

原创 了解http缓存

HTTP 缓存是一种用于存储 HTTP 请求响应的机制,目的是减少相同请求的重复网络传输,从而提高性能和减少带宽消耗。当客户端(如浏览器)请求一个资源时,它可以首先检查本地缓存中是否已经存在该资源的有效副本。如果存在,就可以直接使用缓存副本,而无需再次向服务器发送请求。

2024-12-12 21:22:32 931

原创 怎么确定目标主机,整个网络过程

就是归结于计算机间怎么进行通信,(原始方法)简单点直接加网线,但一个设备的网口肯定是有限的当相连的设备多了,整个网线将变得十分复杂,不利于管理维护(集线器)于是出现集线器,由集线器来接受数据包,再广播到所有连接它的端口,目标设备接受,其他设备丢弃,但不知道是否发给自己于是用Mac地址标识各个设备。但集线器是一个 半双工 设备,意味着同一时间只有一个设备可以接发数据,多个设备同时工作会导致数据冲突集线器每次都会将接受的数据发送到全部网络设备(泛洪),这大大的浪费了网络资源

2024-12-11 18:34:01 774

原创 输入url到显示主页的详细过程

接收到HTTP请求后,根据请求的资源路径,经过后端处理(可能包括数据库查询等),生成HTTP响应信息;响应信息包括状态行(http/1.1 200 OK),响应头(内容类型、缓存控制等消息),响应体(请求的资源内容)浏览器构建HTTP请求,包含请求行(get、http)、请求头(包含用户代理、接收的内容类型等信息)和请求体(如果有);主要分为:DNS解析,TCP连接,发送HTTP请求,服务器处理请求,浏览器接收HTTP响应,断开连接。浏览器发起一个DNS请求到DNS服务器,将域名解析为服务器的Ip地址。

2024-12-11 18:33:40 1144

原创 快速了解Mysql索引

官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,他是对表中一列或多列排序,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。

2024-12-10 19:25:01 952

原创 HTTPS加密认证过程详细理解

也就是验证上述交互的信息,与对方发送过来的消息是否一致。客户端在向服务器端发送明文的时候,会通过摘要算法计算出明文的摘要,为了通俗来讲,我们将计算出的摘要比喻成身份证。然后客户端将明文和身份证通过密钥进行加密传给服务器端。服务器端会通过密钥解密客户端发来的数据,此时明文已经被解密出来,身份证呢?服务器端也会使用摘要算法计算出传来数据的身份证,然后将计算出的身份证和传过来的身份证进行比较,如果身份证相同,那么就说明数据是完整的。

2024-12-10 19:24:26 2128

原创 Mysql中B+树

B+树,非叶子结点上存储索引,叶子结点存储数据和索引,而B树,数据放在所有节点。因此B+树可以容纳更多的子节点,使得整体结构更加扁平,磁盘IO操作次数少,一般3~4次就能查出数据,查询效率更加稳定高效。在Mysql的InnoDB存储引擎中,B+树的每个节点不论内部还是叶子节点,大小通常与InnoDB的数据页大小相同,即16KB。Hash,其实可以,而且直接等值查询效率还高于B+树,但不支持范围,还有Hash冲突。B树,底部没有双向链表,不适合范围查找,数据放在所有节点,层级和IO次数也多。

2024-12-09 16:43:07 1280

原创 SQL语句在MySQL中如何执行

首先就是客户端,其次Server服务层,大多数MySQL的核心服务都在这一层,包括连接、分析、优化、缓存以及所有的内置函数(时间、日期、加密函数),所有跨存储引擎功能都在这一层实现:存储过程、触发器、视图等;最后存储引擎层,负责MySQL中数据的存储和提取,Server层通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间差异,使得这些差异对上层(Server)的查询过程比较透明(清晰,没有阻碍,差异不存在一样)。MySQL服务器的连接器开始处理这个请求,跟客户端建立连接,获取权限,管理连接。

2024-12-09 16:35:08 639

原创 如何处理和优化大文件上传和下载

文件过大会导致内存溢出,上传和下载过慢会影响用户体验,不合理的设计可能引发安全问题,还有网络问题,数据完整性,服务器压力等文件过大,内存溢出,就可以采用分块上传和下载,不要一次性读取文件到内存中,而是通过分块的方式进行上传和下载网络不稳定,就可以用断点续传进度记录,下次恢复下载,可以和分块技术结合使用,使用校验机制,为每个上传的文件创建校验码(如MD5),上传后和服务器进行校验,确保上传的文件块数据完整性。超时问题,上传时间需要较长时间,容易超时错误,就需要设置更长的超时时间,还可以使用HT

2024-12-08 18:43:10 919

原创 TCP 和 UDP 可以使用同一个端口吗

可以使用同一个端口,关键在于它们属于不同的传输层协议,在内核中是两个完全独立的软件模块,各自维护独立的端口空间,虽然端口号相同,但通过协议类型可以确定是哪种协议。当主机收到数据包后,可以在IP包头的协议号字段,知道数据包是TCP还是UDP,所以可以根据这个信息来确定发送给哪个模块来处理,送给TCP或者UDP模块的报文根据端口号来确定,应该给哪个应用程序来处理,所以TCP/UDP各自的端口号也相互独立,比如TCP有一个80号端口,UDP 也可以有一个80端口,二者不相冲突。像DNS服务,既可以通过UD

2024-12-08 18:42:35 1173

原创 http1.0、1.1、2.0、 3.0

引入长连接,在1.0,每次请求都需要建立新的TCP连接,处理请求完毕后立即断开。就导致处理大量图片,链接等资源,需要大量的连接与断开,造成资源浪费和时间延迟。而长连接允许在一个TCP连接上,发起多次请求,减少连接建立和断开的开销,提高网络资源的利用率引入请求管道化,允许客户端同时发起多个请求,服务端根据接受到的请求依次处理回应,减少了等待时长,需要注意的是,请求管道化可以并发发送请求,但服务器仍依次回应。引入更多的状态码,提供更加丰富的错误信息,方便开发人员定位问题,调试。引入缓存机制,允许服务

2024-12-07 19:32:27 814

原创 HTTP中GET和POST详细理解

GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服

2024-12-07 19:31:59 1858

原创 详细了解IO分类

输入流主要用于从外部数据源(如文件、网络连接、内存缓冲区等)读取数据到程序中。它是数据进入程序的通道,就像水通过管道流入容器一样。例如,使用。

2024-12-06 18:00:00 981

原创 IO模型分类

阻塞I/O当用户程序执行read,线程被阻塞,等待两个过程,内核数据准备好和数据从内核态拷贝到用户态。read才返回非阻塞I/O非阻塞的read请求在还没准备好数据就返回,期间程序不断轮询内核直到数据准备完成,内核拷贝数据至应用程序缓冲区中,read调用才可以获得结果。非阻塞的I/O多路复用避免轮询期间没法做其他事。当内核数据准备好时,以事件通知应用程序进行操作。前半过程不需要程序持续主动去关注处理

2024-12-06 18:00:00 1315

原创 HTTP 持久连接(长连接)

HTTP 持久连接通过在一次 TCP 连接上实现多次 HTTP 请求和响应交互,在减少网络开销、提升性能以及降低服务器负载等方面有着显著优势,但也需要注意其可能存在的局限性,并通过合理的参数设置、机制处理等来保障其良好的应用效果。

2024-12-05 19:08:26 1894

原创 ConcurrentHashMap详细理解,不同版本优化

扩容 JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。这种方式可以充分利用多线程的优势,提高扩容的效率,同时保证在并发环境下数据的正确性。而 ConcurrentHashMap 在不同版本中有不同的扩容策略,Java 7 基于分段利用多线程分别扩容,Java 8 及以后通过更复杂的多线程并发扩容机制,利用 CAS 操作等保证在扩容过程中的并发安全和高效性,以适应高并发的场景。

2024-12-05 19:07:51 736

原创 索引的数据结构和存储引擎是有关系吗

在数据更新操作方面,InnoDB 由于支持事务和行级锁,相比 MyISAM 在高并发场景下能够更好地处理数据的插入、删除和修改操作,减少锁冲突,对索引的维护也更加高效,能够保证数据的完整性和一致性。例如,在一个以姓名为索引的用户表中,B - Tree 索引可以根据姓名的字典序快速查找用户记录。不同的 MySQL 存储引擎支持的索引数据结构和索引存储方式各有特点,在实际应用中,需要根据具体的业务需求(如查询类型、数据更新频率、数据是否需要持久存储等)来选择合适的存储引擎和索引数据结构,以优化数据库的性能。

2024-12-04 18:39:10 366

原创 将引用类型以JSON格式输出

这些不同的库都提供了方便快捷的方式将 Java 对象转换为 JSON 格式进行输出,你可以根据自己的项目需求(例如性能、依赖大小、使用习惯等因素)来选择适合的 JSON 处理方式。对象转换为 JSON 字符串进行输出,输出的 JSON 格式内容和使用 Jackson 库时类似。方法将对象转换为 JSON 字符串输出,同样会得到符合预期的 JSON 格式内容来表示。// 使用JSON-B将对象转为JSON字符串并输出。// 使用Gson将对象转为JSON字符串并输出。以下是几种常见的在 Java 中直接将。

2024-12-04 18:37:32 939

原创 数据库事务优化

将长事务中不必要的请求摘除,把核心的、必须保证原子性的操作留在事务内,其余相对独立且不影响核心业务逻辑的操作放到事务外另行处理,可以有效缩短事务长度,减少资源占用,提高事务的执行效率和并发处理能力。:结合业务的低谷期(如凌晨等系统负载较低的时候)来执行拆分后的 DDL 操作,并且在每次执行小的 DDL 变更后,要进行充分的测试和验证(比如检查相关的数据完整性、业务功能是否正常等),确保不会引入新的问题,然后再进行下一轮的 DDL 拆分操作,保障整个数据库结构变更过程平稳过渡,对业务的影响降到最低。

2024-12-03 17:46:27 1103

原创 DDOS分布式拒绝服务攻击

传统的DOS就是一台或者多台服务对一个受害目标(服务器,路由,ip,国家)进行攻击,当范围过大时就是DDOS。目的就是通过大规模的网络流量使得正常流量不能访问受害目标,是一种压垮性的网络攻击。比如常见的SYN洪水攻击,基于TCP协议,不断发送SYN请求到服务器,服务器不但要一直返回确认应答请求,还要等待后续请求确认。一旦量大就造成服务器压力过大,正常请求都不能响应。攻击者首先通过各种手段(如恶意软件传播、网络钓鱼、系统漏洞利用等)入侵并控制众多互联网上的计算机设备,这些设备可以是普通的个人电脑、服务器,

2024-12-03 17:45:47 1693

原创 详细了解SQL语句规范

遵循这些 SQL 语句规范,能够在编写 SQL 语句时更加科学、合理,提高代码质量,优化数据库性能,同时保障数据的安全性和业务操作的准确性,更好地满足不同业务场景下对数据库操作的需求。

2024-12-02 19:59:37 1393

原创 详细了解索引规约

遵循这些索引规约及其所带来的好处,有助于在数据库设计和查询优化过程中,科学合理地运用索引,提升数据库性能,保障数据质量,满足业务系统对数据处理高效性和准确性的要求。

2024-12-02 19:58:58 1223

空空如也

空空如也

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

TA关注的人

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