- 博客(53)
- 收藏
- 关注
原创 HTTPS是如何确保安全的
当然是可能的:在零几年的时候有个特别活泼的社区叫乌云网:里面聚集了大量的网络安全学习者,他们的平时任务就是黑服务器找漏洞,当时很多互联网厂商都瑟瑟发抖生怕自家的服务器bug被挖出来造成大量的经济损失,至于他们采用的手段我们不研究,但是可以得出并不存在完全安全的服务,任何服务器都有可能会被攻破。加密的底层逻辑:毋庸置疑一定和数学相关且一定是来源于数论的知识,在这里我们不讨论加密的证明,只讨论加密的使用,因为在计算机开发中,存在相当完备的库供我们使用。如果想要读懂和理解它们的意思,得用第。
2025-10-15 19:21:27
2042
24
原创 Nginx初识到运用
Nginx是一款轻量级的HTTP服务器/反向代理服务器,其特点是占有内存少并发*能力强**,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪网易腾讯淘宝等。特点总结:占用内存小(不到3M C语言开发),并发能力强(5万/秒)nginx体系结构(多进程架构,一个master多个worker)nginx动静分离配置(服务于前后端分离结构)nginx负载均衡配置(轮询,轮询+权重,ip_hash)
2025-10-15 07:45:52
933
6
原创 java线程池详解
线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象;CPU密集型:计算为主,线程数 ≈ CPU核数IO密集型:等待为主,线程数 ≈ CPU核数 × 2混合型:根据IO/CPU比例调整https://cloud.tencent.com/developer/article/2092854 【关于美团线程池参数配置的个人实现】
2025-10-14 20:28:16
981
1
原创 TCP三次握手与四次挥手详解
我们可以清楚的看到TCP报文段其实挺复杂的,有很多字段属性,在此我们先学习其中的六种,这六种就可以帮助我们清楚的学习 大名鼎鼎的 TCP报文三次握手。
2025-10-14 20:27:26
977
1
原创 每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集
嗯,但是这里有一个问题,就是计算机的字节序有大端和小端的区别,所以这个字符串也完全可以被存成零 x 四八零零,零 x 六五零零,零 x 六 C 零零,零 x 六 C 零零,零 x 六 F 零零。:是的,而且作者还试过另一个商业的库,同样有字符编码的问题。甚至连 PHP 这种,广泛使用的开发工具,对字符编码的支持也很差,默认把字符当成8位来处理,导致很难开发真正的国际化的网站。嗯,比如 A 和 B 肯定是不同的码点,A 和 A 和 A 是同一个码点,但是 A 和 a 又不是同一个码点,这些都是很直观的。
2025-10-09 11:20:11
832
原创 UUID和雪花算法该怎么选择?
Snowflake的算法并不复杂,你在使用的时候可以不考虑独立部署的问题,先想清楚按照自身的业务场景,需要如何设计Snowflake算法中的每一部分占的二进制位数。比如你的业务会部署几个IDC,应用服务器要部署多少台机器,每秒钟发号个数的要求是多少等等,然后在业务代码中实现一个简单的版本先使用,等到应用服务器数量达到一定规模,再考虑独立部署的问题就可以了。这样可以避免多维护一套发号器服务,减少了运维上的复杂度。
2025-10-02 11:15:50
1258
1
原创 IDEA连接redis数据库时出现Failed to connect to any host resolved for DNS name.
本篇的实验版本是RockyLinux8.10版本基于Debian的UbuntuLinux发行版默认防火墙是关闭的,而基于RHEL(CentOS)的RockLinux发行版防火墙默认是开启的,idea连接出现问题很大概率就是这个导致的。
2025-09-11 22:23:50
1306
2
原创 教会新手小白如何正确查阅JDK官方文档之线程池的使用
从未知到已知,从接口到实现,从抽象到具体。1.如果我们想要查询某个类或者接口,大概率这个类的说明会很麻烦,包含很多无关的知识,而且这个类对于我们来说应该是陌生的。2.查询一个陌生的类或者接口,其实我们可以从它继承或者实现层次比较高的类/接口来当突破口,因为越是层次比较高的类/接口,对应的方法和解释说明会更少一点。
2025-08-27 18:54:07
940
原创 设计模式之工厂模式的使用
当我们谈到工厂模式,其实是分为三种类型,其中包括简单工厂模式、工厂方法模式和抽象工厂模式,他们都属于创新型设计模式,主要的目的都是封装对象的创建过程,将对象的创建和使用分离开来,从而提高代码的可维护性和可扩展性。简单工厂模式适用于创建单一类型的产品对象,工厂方法模式适用于创建多种类型的产品对象,而抽象工厂模式适用于创建多个产品族的对象。
2025-07-31 10:39:03
684
1
原创 设计模式之单例模式及其在多线程下的使用
单例模式在大佬给出的定义是:通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的办法。1.提供全局变量使得一个对象被访问是什么意思呢?// 每次都可以创建新的实例可以把instance设置为一个全局变量,比如2.让类自身负责保存它唯一的实例是什么意思?私有化构造方法,别人就不能随便new它了;在类中自己创建并保存唯一的实例;提供一个公开的静态方法用于获取该实例。
2025-07-30 10:56:11
1020
原创 Java后端开发数据校验工作
但是作为开发无论是前端还有后端,我们都不能简单的将用户想象成好人,更多的应该是想象为居心叵测的坏人,如果他们使用python爬虫,postman工具这么一些程序或者软件来绕过前端js代码数据验证,那前端没有一点办法。一种方式是如果我们仅仅凭人力来实现数据的校验,不合法可以抛出异常,但是工作量和代码复杂度会比较高 ,而且很有可能会因为疏忽遗漏等等造成一些本不该出现的bug或者缺失的。作用:不允许为空白,即不允许是“仅由空格、TAB等空白值组成的字符串”,也不允许为空字符串,也不允许为空值null。
2025-07-29 11:14:35
972
原创 解决线程安全的几个方法
在多线程并发编程中,有两个重要的关键字:synchronized和volatile,译为volatile是轻量级的synchronized,它在多线程开发中确保了共享内存变量的"可见性"。什么叫做可见性?简要的概述其实很简单:当一个线程修改一个共享变量的话,另一个线程能知道并读到这个修改后的值。如果volatile变量修饰符使用得当的话,会比synchronized的使用和执行成本更低,因为它不会引起线程的上下文切换和调度。
2025-07-27 18:21:14
870
原创 线程安全问题的发现与解决
1.一个Java中的线程类实例,对应了操作系统底层的一个线程,而且线程的调度是随机的。4.内存可见性,Java 多线程程序的内存不是共享实时的,每个线程有自己的。在学习中我会逐渐加入学习到的新的线程安全的问题,并给出不同的博客进行解答。是一个“复合操作”,它包括:load add save。,只要它们认为“逻辑上没有影响”。5.指令重排序,编译器或处理器为了提高效率,会。3.修改的操作不是原子的,2.多个线程同并修改。,最终结果不可预测。
2025-07-27 18:21:03
355
原创 多线程死锁的四个必要条件
死锁的发生是这四个必要条件同时成立互斥使得资源不能被随意共享。请求与保持使得进程在等待新资源时仍霸占着老资源不放。不可剥夺使得系统无法强行收回资源来打破僵局。循环等待使得所有相关进程互相等待对方释放资源,形成闭环。这四个条件缺一不可。如果其中任何一个条件被破坏(例如,资源可共享、进程申请新资源前必须释放所有已有资源、资源可被强制剥夺、强制资源申请顺序避免环路),死锁就可以被预防或避免。处理死锁的策略(预防、避免、检测与恢复)都是围绕着打破这四个条件中的一个或多个来设计的。
2025-07-27 17:40:55
604
原创 初学JMM见解,认识内存可见性和指令重排序问题
在上面我们分析了,为什么加上了volatile关键字,就能确保各个线程都能看到共享变量,其中一个重要的原因是:JVM为变量保驾护航,防止指令重排序 ,究竟什么是指令重排序呢?水果摊的分布,可能和我们水果清单的顺序不一致,如果强行按照初始的水果清单来购买,肯定会重跑很多次,如果能调整一下购买的顺序,按照图示的顺序就会轻松很多。:它是一台虚拟的“执行机器”,负责解释执行 Java 字节码,让 Java 程序能在各个平台运行,是 Java 的“发动机”。因此,在你的循环中,线程1会每次都从主内存读取最新的。
2025-07-27 17:38:52
754
原创 为什么线程 sleep 被中断后仍然继续执行?
我们的目标是在输入0后立即中断thread线程,通过在main线程中,输出0 判断后,使用thread的方法interrupt()方法,来中断thread线程,所以在thread线程中因为存在Thread.sleep()在被中断后catch到了 InterruptedException异常,在打印了异常输出后,立即break结束掉了thread的循环从而结束了run方法从而结束了thread线程。线程在 sleep() 时被 interrupt() 中断,1. 在 catch 中添加 break;
2025-07-23 16:25:05
291
原创 RESTful API设计与实现指南
通常与请求注解一起使用,可以将 URL 中的变量映射到 Controller 中的方法参数上。注解用于接受 RESTful API 中的 URL 中的变量;用于指定处理请求的 URL,它可以标注在类和方法上;如果限定为处理DELETE请求,则发送其他方式请求时。如果限定为处理POST请求,则发送其他方式请求时。如果限定为处理GET请求,则发送其他方式请求时。如果限定为处理PUT请求,则发送其他方式请求时。只会处理 HTTP DELETE 请求;只会处理 HTTP POST 请求;
2025-07-19 21:14:55
848
原创 window、DOM、document、html 他们之间的关系是什么?
window是浏览器的全局对象,包含了documentdocument是 DOM 树的入口,DOM 表示整个网页结构,而<html>是这棵 DOM 树的根节点。
2025-07-19 12:51:39
889
原创 spring注解大全
SSM框架是Spring生态的核心,包含2个核心特性:第1个:IoC控制反转,是一种编程思想,反转资源的获取方向,把创建对象和管理对象交由框架管理;第2个:AOP面向切面编程,是一种编程泛型,提高代码的可维护性、可重用性和可扩展性,降低代码的耦合度,集中管理横切关注点的代码,提高开发效率;Spring MVC。
2025-07-15 08:22:30
532
原创 MySQL联合查询
找到微博表中的id 然后再在评论表中找到weibo_id 如果这条评论的weibo_id和微博表中的id相同说明这条评论确实就是发布在相关的微博上面的。道理相同,只需要在用户表中找到id,然后在评论表中找到user_id,如果相同,可以确定这条评论确实是相关用户发布的。你可以看到评论者 ID、被评论微博的 ID,但你并不知道这个微博的内容是什么,也不知道用户昵称,只能看到 ID。如果只看到了微博表就看不到用户根据某个微博发的评论了,如果只看评论表就看不到,某个被评论发布的微博的具体信息了。
2025-07-12 15:00:04
1070
1
原创 Spring MVC中异常处理
前后端分离(REST 风格)用全局异常处理器统一返回结构化 JSON由前端(如 Vue、React)判断 status 或 code,显示漂亮的提示页面。
2025-07-11 22:37:55
1486
原创 Knife4j使用详解笔记[多版本]
Knife4j是基于SpringBoot构建的一个文档生成工具,它可以让开发者所开发的程序生成可视化的API文档。目的是可以更加方便的基于API文档进行测试再开发生成的文档还可以导出,然后给到前端开发团队,前端开发团队可以基于API文档所给的接口写具体的前端代码调用接口。
2025-07-10 20:59:12
1157
原创 Spring核心详解
在Spring框架的规范中,所有由Spring管理的对象都称之为Bean对象。Spring提供了以下多个注解,这些注解可以直接标注在Java类上,将它们定义为SpringBean。注解说明@Component该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅标识容器中的一个组件(Bean),并且可以作用在任何层次,例如Service层、Dao层等,使用时只需将该注解标注在相应的类上即可。该注解用于数据访问层(Dao层)的类标识为Spring中的Bean,功能与@Component相同。
2025-07-09 22:01:47
1189
原创 计组中机器字,机器字长,存储字长,指令字长辨析
存储单元的地址和存储单元的内容都是用二进制表示的,但是二者含义完全不同,存储单元的地址使用无符号二进制数表示。某存储器容量位 1K * 4 共有 1024个单元,每个存储单元字长4位,共有4096个二进制位。机器字长,指令字长,存储字长可以相等也可以不相等。,比如现代计算机为32位,64位等等。可以得出机器字长就是机器字的长度,旅馆中能够容纳的旅客数量叫做。在了解机器字长之前,了解。
2025-07-09 10:30:32
517
原创 WebSocket实战:打造实时在线聊天室
我们应该了解的是websocket是ISO参考模型的应用层的协议之一它是一种在大呢TCP连接上进行全双工也就是双向通信的协议。有了这个协议,客户端和服务器之间就可以随时互相发送数据,不再像传统HTTP那样一问一答了也就是请求响应。当客户端和服务器的连接一旦建立,不手动关闭或者设置自动关闭就会一直保持。比如我们想要实现网上聊天室或者网上棋类在线对战游戏HTTP 是“请求-响应”模式: 客户端发起请求,服务器被动响应。但这种模式有几个问题:如果我们使用websocket连接过程如下同理客户端2的websocke
2025-07-08 18:23:21
1146
原创 数据库从零到精通(持续优化)
数据库保存数据的仓库就称为数据库编写一个用户管理系统,可以让用户在我们编写的系统上进行注册等操作,此时就涉及到了保存用户数据的操作,目前我们的做法可以将一个用户信息以一个User对象形式表示,然后利用IO知识中的文件流与对象流将对象序列化都写入XXX.obj文件中保存。当有大量的obj文件后,可以使用一个专门的目录"users"来保存所有的obj文件,用来归纳所有的用户数据。同理,其他数据也可以放在对应的目录中,这些目录都可以称为数据库。以目录和文件形式保存数据,如何维护?半编码半手动,编码很难做到通用,灵
2025-07-03 17:41:46
329
原创 深入浅出数据库约束
数据库本质上就是一个大仓库,里面存放着我们的各种表数据等等,比如(博客记录表,期末成绩表)。数据库约束就是设计者为这个仓库设下的几条硬性规则。这些规则的唯一目的就是:保证我们仓库中的数据是靠谱的,不混乱的,符合实际的。先通览一下数据库中所有的约束类型说明NOT NULL非空约束指定非空约束的某一列不可以存储NULL值DEFALUT默认约束某一列忘记或者业务要求不赋值时使用的默认值比如(匿名)UNIQUE唯一约束指定唯一约束的列,每行数据必须有唯一的值PRIMARY KEY主键约束。
2025-07-02 08:22:06
1054
原创 存储器的分类(RAM,ROM等)及其性能指标
整个王国的日常运作,是这样的:国王(CPU)决定处理一个任务;他让秘书(寄存器)准备好关键数据;秘书不够用,就找 Cache;Cache 也找不到,就去 RAM;RAM 若没内容,再去硬盘取资料;如果是最初启动,ROM 提供法典(BIOS)指导大家开始工作。层级成员位置特点用途1寄存器CPU 内部速度最快,容量最小临时变量,指令操作数2CacheCPU 旁快速缓冲,预测性高提高访问效率3主存(RAM)内存条大容量,易失性程序和数据的主阵地4ROM。
2025-06-15 15:47:17
1047
1
原创 概率论几大分布的由来
两点分布”是之一,又称为,它只有两个可能的取值:例如事件成功(1)或失败(0)。设随机变量 XXX 的取值只有两个:X=1 表示事件发生(成功)X=0 表示事件不发生(失败)这种分布称为或。构造两点分布的来表达 X=0和 X=1 时的概率。可以这样写:这个公式可以说是接下来出现的二项分布,泊松分布,指数分布等的基础希望大家可以通过记忆,或者推导彻底记住,在这里我给大家一种简单的记忆方法在记忆两点分布的公式后我们尝试解决一下二项分布。
2025-06-12 20:45:34
937
原创 深入浅出掌握 Axios(持续更新)
在了解ajax和axios之前,我们先观察一下他们是什么英文的缩写ajax 的名字为 asynchroanous JavaScript and XML而axios的名称来源于英文单词“axis”与“I/O”的结合,并非直接缩写自某个特定短语。在本文我们简单的介绍一下ajax后着重讲解axios,在平时工作中因为ajax配置较为底层,代码相对冗长,所以我们使用更为现代化的axiosAxios是一个的库,专为设计。到底什么是基于promise?请看一下博主的上一篇文章。
2025-06-10 17:10:24
1276
原创 Javascript异步代码处理
假如我们现在有个要求需要,按顺序打印三个数字1,2,3.隔五秒输出1,隔两秒输出2,隔三秒输出3.因为setTimeout()天生异步操作,所以我们并不能按照顺序输出他们最终得到的结果是2 3 1,面对异步代码执行时我们并不能简单的认为是串行顺序执行。有一个解决方法是,我们可以通过调整代码的顺序来实现,顺序输出数字}, 1000);// 2 打印后 1s 打印 3}, 1000);// 1 打印后 1s 打印 2}, 5000);// 初始延迟 5s 打印 1。
2025-06-10 11:24:13
687
原创 Javascript个人问题收集
splice的「别扭感」源于你只关注了它的删除功能,而它的设计初衷是更通用的「剪切并拼接」。如果要找一个纯删除的方法,可以用filter,但splice的独特之处在于它能直接修改原数组并精确控制位置。下次使用时,可以想象自己在「剪接数组」,这样名字就合理多了!✂️➔🔀你在学习 JavaScript 后感到「语法奇怪」,尤其是从 Java 转向 JavaScript 时,这种反差感非常普遍。这种「怪异感」本质上源于 JavaScript 和 Java 在语言设计哲学、类型系统、运行时行为等方面的根本性差异。
2025-04-29 09:02:07
1244
原创 Java多线程(持续更新)
是独立的运行程序比如咱们电脑软件,你启动起来以后,他就是一个进程。qq idea进程需要windows系统的分配。可以获取当前的系统的网卡,内存,显卡等1.独立性各个进程之间是相互的独立的互不影响 的。录屏软件和idea没有关系的2.互斥性每个软件系统都会分配一个独立端口号,如果启动一个软件以后他的端口号97。如果再启动另外一个软件,另外一个软件如果端口也是97,这个程序就启动不了,端口被占用的脑海里面知道开启的软件就是一个进程 即可!!!进程是由多个或者一个线程组成的。
2025-04-25 17:10:12
2064
原创 JavaWeb核心技术之会话技术SessionAndCookie(图解版)
(Session):在店里存档你的完整消费记录(存在服务器)。(Cookie):直接交给你保管的小便签(存在客户端浏览器)。假设你常去一家咖啡店,这家店用「」记录你的消费习惯。我们把这个过程比作。现在我们仔细阅读一下咖啡馆的公告,看似没有什么作用,但等学完Cookie和Session之后再看会发现十分有用。
2025-04-20 22:18:35
254
原创 Java泛型程序设计(持续更新)
泛型程序设计意味着编写的代码可以对应多种不同类型的对象重用,比如你一一定不希望为收集到的String,File对象分别编写不同的类。编译器还知道ArrayList<String>的add方法有一个String的参数,这比有一个可以包含万物的Object类型的参数要安全的多,现在编译器就可以检查,防止你插入错误的对象。泛型类可以有多个类型变量。//2.此外,这里没有错误检查,我们可以向数组列表中添加任何类的值,我们定义的files只想插入文件类型但是我们定义一个Student类型之后也可以插入。
2025-04-13 21:16:06
811
原创 vue3从入门到精通(持续更新)
前端工程分为单页面架构和多页面架构指工程中存在多个*.html 文件,每一个页面对应一个 html 文件指工程中只有一个 html 页面文件,通过一个 html 页面中的内容改变实现多页面的效果每个页面至少对应一个*.vue 文件用户的URL只对应一个页面,我们可以随时替换这个页面的内容,方便更新每个页面可以由多个部分组成,每个部分都可以按需替换局部替换的做法,也反向实现了页面某些部分的"复用"html 文件是页面全部内容,vue 文件可能是页面的一个部分,也能是页面的所有内容。
2025-04-07 17:37:31
571
原创 Java内部类详解
当一个事物的内部还存在一个需要完整结构描述的部分,且该结构仅服务于外部事物时,推荐使用内部类。在Java中,可以将⼀个类定义在另⼀个 类或者⼀个⽅法的内部,前者称为内部类,后者称为外部类。内部类也是封装的⼀种体现。注意事项定义在花括号外部的类不是内部类编译后会生成独立字节码文件,命名格式:内部类和外部类共⽤同⼀个java源⽂件,但是经过编译之后,内部类会形成单独的字节码⽂件二、内部类分类1. 成员内部类① 静态内部类特点:② 实例内部类特点:对比总结:定义在方法体内的
2025-03-25 09:45:49
609
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅