自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Netty和Tomcat有什么区别

Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis访问的功能,这就是netty和tomcat最大的不同。Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。http是应用层的协议。

2025-11-14 16:06:49 840

原创 记一次 idea “错误: 找不到或无法加载主类”问题

该问题的原因有多种,先说一下这次问题产生的背景:开始有个业务项目,但由于要经常切换不同分支修改代码,索性将原来项目目录复制一份,但 windows 中文版复制后会默认在原项目目录后面加上“ - 副本”后缀。

2025-11-12 11:10:41 131

原创 Visual Studio Code 控制台乱码问题

百度了很多办法,比如修改注册表,可能因为我用的是 windows 11 家庭版,注册表那一项没有找到。点击“确定”按钮,提示是否重启,选择是,重启后再次运行 vscode,成功!

2025-11-03 09:26:08 258 1

原创 为什么web.xml不见了

使用 Spring 或 Springboot 开发一个 web 系统如今并不是一件难事,但是如果问这套系统底层是如何工作的,恐怕有很多人答不上来。比如当我们找开浏览器,输入 www.baidu.com 后回车,过程中用户的请求是如何被服务器接收并处理,服务器是怎么知道我们想要什么呢?

2025-10-29 15:02:28 884

原创 Git 日常

Git用户名和邮箱地址主要用于标识提交记录的作者信息,确保版本控制的可追溯性和团队协作的规范性。每次提交都会记录用户名和邮箱作为作者信息,便于追踪修改责任归属。在团队协作或开源项目中,这些信息帮助他人识别提交者身份,确保代码质量控制。对于GitHub、GitLab等平台,邮箱地址用于将提交记录与用户账户绑定。若未配置正确的邮箱,可能导致提交信息显示为“匿名”或无法关联个人账号。未配置时,Git可能使用系统默认信息(如操作系统用户名或主机名),但可能导致身份信息缺失或提交被拒。

2025-10-24 16:56:10 777

原创 Git 版本回退 reset --mixed 命令

git reset --mixed commit-id:回退到指定版本。(mixed:混合的)该命令不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本,但是工作区中的版本仍是回退前的版本。–mixed参数是git reset命令的默认选项。比如首先在版本库中的 readme.txt 文件中添加一行内容,并提交该内容。我们的目的就是要再回退到该版本。

2025-10-24 11:07:51 740

原创 记一次Springboot 项目启动报错“java: 警告: 源发行版 11 目标发行版 11 ”

但是由于当前主机 JAVA 环境配置 JAVA_HOME 不是 11 版本,所以在运行 maven (构建)时发现版本不一致,所以会报错。因为 maven 本身也是一个 Java 程序,它的运行环境需要与目标项目的环境保持一致,如果不一致则终止构建总给出如上提示。上面两属性值是在创建项目(注意,不是模块)的时候自动生成的,如果不修改则是根据项目创建时选择的 SDK 版本,即 JAVA 版本。

2025-10-10 11:32:39 220

原创 宏与前向声明

优点减少头文件包含,降低代码耦合;提高编译效率;打破循环依赖。缺点只能用于指针、引用等,不能实例化对象或调用函数;使用过度会大幅降低代码可读性,不利维护。注:前向声明和具体定义之间涉及标识符(变量、结构、函数等)实现细节的使用都是非法的(表明只能使用指针的形式来引用前向声明)。宏和前向声明都是编程开发过程中有利的辅助工具,合理使用可以大幅提高开发效率,使代码更加简洁,提高代码的可重用性,但过度依赖也会造成难以维护,可读性降低等负面影响。

2025-08-18 11:22:24 276

原创 少用“的、了、也”

摘要:写作中的"的""了""也"虽常见却易被滥用,适度减少使用能让文字更显精炼。"的"字过多会让语句拖沓(如"美丽的花朵"→"美丽花朵");"了"字频繁使用破坏节奏感("吃了饭"→"吃饭");"也"字堆砌导致表达啰嗦("他也喜欢"→"他同样喜欢")。通过经典文学范例可见,

2025-08-18 11:03:34 554

原创 UML类图中对象之间的几种关系

对象间主要关系包括:泛化(继承,如老虎继承动物)、实现(类实现接口)、依赖(A需要B才能工作,如特斯拉依赖电池)、关联(同级对象关系,如学生与老师)、聚合(整体与部分关系,如汽车由发动机组成)和组合(强聚合,整体与部分共存亡)。这些关系描述了面向对象设计中类与类、类与接口之间的不同连接方式,从继承层次到对象协作,涵盖了软件系统设计的关键结构。

2025-07-03 09:57:38 350

原创 Vulkan官方教程(一)

本文首先是对 Vulkan 的简单介绍,以及其主要解决的问题。之后我们来看一下如果画一个三角形都需要什么。获得一个整体认识,在理解后续的内容会有很大帮助。最后,我们将介绍 Vulkan API 的结构以及其一般使用方式。

2025-06-20 17:20:58 742

原创 (六)子目录使用

简单项目中将所有文件置于同一目录没有问题,但是实际过程中通常会存在多个目录,不同目录存放各自类型相同或功能相关的文件。当存在多个目录时,项目结构会各不相同,而这也会影响构建的过程。在多目录项目中 CMake 会用到两个基础命令 add_subdirectory 和 include()。这些命令会将其他文件或目录中的内容引入构建过程中,从而使得构建逻辑能够分布在各目录层级结构中,而非强制所有内容都定义在最顶层。

2025-06-16 16:11:03 771

原创 (五)变量、字符串、列表和科学计算

前面的章节介绍了如何定义基本目标以及如何生成构建输出。单就这一点而言,已经够用了,但 CMake 还具备一系列其他功能,这些功能带来了极大的灵活性和便利性。本章介绍了 CMake 中最为基础的部分之一,即变量的使用。

2025-06-16 14:37:13 749

原创 (四)构建简单目标

创建一个可执行程序是所有的项目基本诉求,但对于大型项目来说,使用库文件来管理项目也是必需的。CMake 提供了多种类型库文件,兼容了不同平台之间的区别的同时,支持它们独特的本地化特性。同 add_executable() 命令类似,targetname 和 EXCLUDE_FROM_ALL 具有同样的意义和作用,不同的是库有三种类型:STATIC、SHARED、MODULE。STATIC:表示静态库和文档。

2025-06-16 10:15:19 681

原创 (三)最小构建

所有 CMake 项目起始于一个 CMakeLists.txt 文件,可视为 CMake 的工程文件,它定义了关于构建的所有:从源码到目标文件,包括测试、打包以及其他自定义任务。继续以源文件为例来说明,CMake 定义它自己的语言,比如变量、方法、宏、逻辑判断、循环、注释等等。每一行包含一条内置的 CMake 命令,类似于其它语言中的函数调用,除了它们包含多个参数且不直接返回值外。参数之间以一个或多个空格分隔,也可以分隔成多行。

2025-06-13 15:08:06 870

原创 (二)建立项目

摘要:CMake通过CMakeLists.txt文件管理项目结构,区分源目录(含源代码)和构建目录(存放生成文件)。推荐使用out-of-source构建方式,支持多配置生成。配置时需选择生成器类型(如Unix Makefiles),通过命令行执行构建过程。最佳实践包括:保持源目录与构建目录分离、定期测试不同生成器、使用cmake --build命令调用构建工具。这确保了项目的跨平台兼容性和构建一致性。(149字)

2025-06-13 11:23:09 574

原创 (一)CMake构建C++项目

本文介绍了在Windows 11环境下使用gcc 13.2.0、CMake 4.0.2和VSCode搭建C++开发环境的完整流程。文章详细说明了开发工具安装方法、项目目录结构设计、多模块CMakeLists.txt配置(包含主程序规划模块process和pnc_map两个子模块),以及编译运行过程。最终生成planning_main.exe及两个动态链接库,实现了控制台输出功能。项目代码已开源,可作为Windows下C++项目开发的入门参考。

2025-06-07 23:59:02 792

原创 Windows 中安装配置终端Oh-my-posh

本文介绍了在Windows 11系统下配置终端环境的详细步骤。首先说明选择Windows 11的原因,然后分步讲解:1)安装NerdFonts字体;2)使用winget或手动命令安装oh-my-posh并进行终端美化配置;3)简单说明Neovim的安装方法和配置文件路径设置。文章强调简化操作流程,避免不必要的软件安装,并提供了每个步骤的截图和具体命令。最终目标是实现一个美观实用的终端环境,满足日常开发需求。特别提醒用户不必过度追求最新版本,稳定够用即可。

2025-06-06 10:30:22 825

原创 (一)数据结构和算法的框架思维

种种数据结构,皆为数组(顺序存储)和链表(链式存储)的变换。数据结构的关键点在于遍历和访问,即增删查改等基本操作。种种算法,皆为穷举。穷举的关键点在于无遗漏和无冗余。熟练掌握算法框架,可以做到无遗漏;充分利用信息,可以做到无冗余。

2025-03-31 15:25:23 773

原创 (三)Redis内存兜底策略——内存淘汰及回收机制

在算法的选择上,Redis需要能够快速地查询添加删除数据,也就是说查询、添加、删除的时间复杂读需为O(1)。哈希表能保证查询数据的时间复杂度为O(1)。Redis内存淘汰机制是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据Redis提供了八种内存淘汰策略,分别是:noeviction:不会淘汰任何键,达到内存限制后返回错误allkeys-random:在所有键中,随机删除键volatile-random:在设置了过期时间的键中,随机删除键。

2025-03-21 16:43:59 762

原创 (二)缓存更新的四种策略及选取建议

缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。不同于以上三种,应用程序无需等待数据的刷新,也无需自己去触发数据的刷新,而是后台服务来完成这些操作。

2025-03-21 16:13:26 1395

原创 (一)redis十种数据类型及底层原理

string 是 Redis 最基本的数据类型,它可以存储任意类型的数据,比如文本、数字、图片或者序列化的对象。一个 string 类型的键最大可以存储 512 MB 的数据。string 类型的底层实现是 SDS(simple dynamic string),它是一个动态字符串结构,由长度、空闲空间和字节数组三部分组成。embstr:占用64Bytes的空间,存储44Bytes的数据raw:存储大于44Bytes的数据int:存储整数类型embstr和raw存储字符串数据,int存储整型数据。

2025-03-21 15:45:59 882

原创 (四)Redis的三种持久化策略及选取建议

RDB持久化策略是指在一定的时间间隔内,将Redis内存中的数据以二进制文件的形式保存到硬盘上。这个二进制文件就是一个快照,它记录了某个时刻Redis内存中的所有数据。RDB持久化策略可以通过配置文件或者命令来触发,配置文件中可以设置多个条件,当任意一个条件满足时,就会执行一次快照操作。save 900 1 # 900秒内执行一次 set 操作 则持久化1次save 300 10 # 300秒内执行10次 set 操作,则持久化1次。

2025-03-21 14:10:51 1190

原创 什么是 Docker?

Docker 使用 C/S 框架。客户端负责与 Docker 守护进程(Daemon) 进行对话,而守护进程负责繁重的构建、运行、分发 Docker 容器的工作。Docker 客户端和守护进程可以在同一操作系统中运行,或者通过客户端与远程的 Docker 守护进程进行连接。Docker 客户端和守护进程之间通过使用 REST 接口,基于 UNIX socket 或网络接口进行通信。另外还有一个 Docker 客户端叫作 Docker Compose,让你可以同时管理多个容器。

2025-03-17 11:35:05 907

原创 Java Concurrent 包

并发编程中通用的工具类。包括一些标准化,可扩展的小的实现结构(框架),和一些实用但却枯燥且不易实现的工具类。以下为主要组件的简易描述。另参考 java.util.concurrent.locks 和 java.util.atomic 包。

2025-03-16 02:03:43 998

原创 (五)缓存问题之缓存雪崩、缓存击穿和缓存穿透与布隆过滤器

缓存异常会面临的三个问题:缓存雪崩、击穿和穿透。其中,缓存雪崩和缓存击穿主要原因是数据不在缓存中,而导致大量请求访问了数据库,数据库压力骤增,容易引发一系列连锁反应,导致系统奔溃。不过,一旦数据被重新加载回缓存,应用又可以从缓存快速读取数据,不再继续访问数据库,数据库的压力也会瞬间降下来。因此,缓存雪崩和缓存击穿应对的方案比较类似。而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。

2025-03-11 20:54:38 826

原创 Java 中的死锁

这样虽然避免了循环等待,但是这种方法是比较低效的,资源的执行速度回变慢,并且可能在没有必要的情况下拒绝资源的访问,比如说,进程c想要申请资源1,如果资源1并没有被其他进程占有,此时将它分配个进程c是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。释放已经保持的资源很有可能会导致进程之前的工作实效等,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。

2025-03-11 20:02:25 687

原创 spring-boot-starter-parent 项目的作用

当我们使用 Spring Initializr 创建 Spring Boot 项目时,发现总会继承一个 spring-boot-starter-parent 作用父类。假如不继承就不能用了吗?这个父类的作用是什么呢?在深入探究之前我们需要先了解一下 Maven 的继承特性。

2025-03-10 19:18:50 1054

原创 序列化与反序列化

将对象持久化后,可以将其存储到磁盘或数据库中,以便后续读取和恢复对象的状态;在网络传输中,将对象序列化后,可以通过网络传递到远程节点,实现分布式系统间的通信和数据交互;:通过序列化,可以将对象转换成通用的格式,以便在不同平台、不同语言之间传递和交互;:通过序列化与反序列化,可以实现对象的尝试克隆,即创建一个与原对象完全相同的新对象。总结一下,序列化与反序列化就是在对象与特定格式(如二进制、JSON、XML等)之间转换的过程,可以实现数据持久化、数据传输以及跨平台和跨语言通信等功能。

2025-02-27 14:41:20 950

原创 Arch&Win10双磁盘双系统安装及相关知识

双磁盘安装Arch Linux 和 Windows 10,Winodws 10先于Arch安装,通过 Grub 引导。本文成功案例是在虚拟机(VMWare 14 pro)中实现,过程中出现的问题(如os-prober无法检测到 windows 系统)已解决,详见 Q&A 部分。

2022-01-27 11:10:25 6256

空空如也

空空如也

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

TA关注的人

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