- 博客(147)
- 资源 (1)
- 收藏
- 关注
原创 【Redis】数据类型:Stream
Redis Stream 是 Redis 5.0 新增的数据结构,专为消息队列设计。相比于传统的 List 和 Pub/Sub 方案,Stream 支持消息持久化、主备复制、全局唯一ID生成、ACK确认机制和消费组模式,解决了消息丢失问题。其底层采用消息链表结构,每条消息都有唯一ID。核心指令包括 XADD(添加消息)、XREAD(读取消息)、XGROUP(消费组管理)和 XACK(消息确认)。Stream 通过 PENDING List 机制确保故障恢复后仍能处理未完成消息,大大提升了消息队列的可靠性。
2026-06-10 17:05:27
172
原创 【Redis】数据类型:bitmap
Redis位图(Bitmaps)是一种基于二进制位的数组结构,通过0和1表示二值状态(如用户签到、点击记录)。它底层使用String类型存储,支持位操作命令(setbit/getbit/bitcount/bitop),能高效统计与计算数据(如日活用户)。位图最大支持2^32位,适合高基数场景(如海量用户签到),内存占用远低于集合类型(1亿用户仅需12.5MB)。但在低活跃场景(如10万用户)可能浪费存储空间。典型应用包括用户行为标记、连续签到统计等,通过位运算快速实现交集、并集等分析。
2026-06-09 15:04:30
178
原创 【Redis】数据类型:Hash
Redis哈希表(Hash)是一种存储键值对映射的数据结构,适合存储对象(如用户信息)。每个Hash可存储40多亿个键值对,支持针对单个字段的CRUD操作,避免重复存储和序列化问题。其底层采用ziplist(或Redis7的listpack)和hashtable两种编码格式,根据字段数量和长度自动选择。常用命令包括HSET/HGET(设置/获取值)、HMSET/HMGET(批量操作)、HGETALL(获取全部字段)等。小规模数据使用压缩存储(ziplist/listpack),超出限制则转为hashtabl
2026-06-09 10:27:37
242
原创 【Redis】数据类型:String
Redis字符串(String)是Redis最基本的数据类型,支持普通字符串、整数和浮点数三种格式。String类型采用简单动态字符串(SDS)结构,支持预分配空间以减少内存频繁分配。Redis通过层级key结构(如项目名:业务名:类型:id)区分不同类型数据。常用命令包括set/get、mset/mget、incr/decr、strlen/append等,支持原子操作和分布式锁(setnx/setex)。String类型最大支持512MB数据,可存储JSON序列化对象、图片等二进制数据。
2026-05-19 20:33:57
410
原创 【Redis】数据类型:Set
Redis集合(Set)是存储唯一字符串的无序集合,基于哈希表实现,具有O(1)时间复杂度的增删查操作。支持自动去重、成员判断及集合运算(交/并/差集)。最大可存储2^32-1个元素,底层采用intset(整数)或hashtable(非整数)两种编码方式。常用命令包括SADD添加、SMEMBERS遍历、SISMEMBER判断存在等。集合运算功能强大,适用于需要高效处理唯一数据的场景,如标签系统、好友关系等。
2026-05-18 21:26:51
414
原创 【JVM】面试题-元空间的内部结构
《深入理解Java虚拟机》中介绍,元空间(Metaspace)是存储类元数据的内存区域,取代了永久代(PermGen)。它主要存放已被JVM加载的类信息、常量池、字段和方法数据等元数据。元空间使用本地内存(Native Memory),避免了永久代的内存溢出问题,并支持动态扩容。相比永久代,元空间具有更好的内存管理机制和性能表现。
2026-05-18 11:52:33
215
原创 【JVM】面试题-Parallel 回收器
Parallel回收器是JVM中专注于高吞吐量的垃圾收集器,特别适合服务器端后台任务场景。它通过并行处理机制优化垃圾回收效率,在追求系统整体吞吐量的应用中表现优异。
2026-05-13 00:07:36
417
原创 【JVM】面试题-Java中有哪些引用类型
程序可以通过判断引用队列中,是否加入了引用,来判断被引用的对象,是否将要被垃圾回收,这样可以在对象被回收之前,采取一些必要的措施。一个对象是否有虛引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用,来获得一个对象的实例。无法通过虚引用获得对象,用 PhantomReference 实现虚引用,虚引用的用途是在 gc 时,返回一个通知。当垃圾回收器准备回收一个对象时,如果发现它还有引用,就会在回收对象之前,把这个引用加入到引用队列中。引用队列可以与软引用、弱引用、虚引用一起配合使用。
2026-05-12 18:24:32
95
原创 【JVM】面试题-创建对象的步骤
对象创建流程主要包括六个关键步骤:首先检查类是否已加载并初始化;其次根据内存规整情况选择指针碰撞或空闲列表方式分配内存;第三通过CAS和TLAB机制解决并发安全问题;第四初始化对象属性默认值;第五设置对象头存储元数据信息;最后执行init方法完成初始化。整个过程确保了对象创建的线程安全性和内存分配的效率,同时为后续程序运行提供了正确的初始状态。
2026-05-12 10:58:34
182
原创 【JVM】面试题-有哪些垃圾回收器
需要注意的是,不同收集器之间的连线代表它们可搭配使用(如Serial与Serial Old、ParNew与CMS等),实际应用中需根据应用的性能需求选择合适的组合。不同的垃圾收集器针对JVM堆的不同分代(新生代、老年代)设计,具备不同的性能特点,适配不同的应用场景,也是JVM面试中的高频考点。,该算法的核心优势是执行效率高,垃圾回收速度快,不足则是会浪费部分内存空间(需预留空闲区域用于复制);在JVM的内存管理中,垃圾收集算法是内存回收的核心逻辑与方法论,而垃圾收集器则是将这套方法论落地实现的具体工具。
2026-05-11 12:00:06
396
原创 【JVM】面试题-对象的内存布局
虚拟机的⾃动内存管理系统,要求任何对象的⼤⼩必须是8B的倍数,对象头已被设为 8B 的 1 或 2 倍,如果对象实例数据部分没有对⻬,需要对⻬填充补全。存储对象⾃身的运⾏时数据,如哈希值、 GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分占8B,称为Mark Word。【偏向锁】:偏向线程ID---epoch---GC分代年龄---是否是偏向锁---锁标志位。【无锁状态】:对象哈希值---GC分代年龄---是否是偏向锁---锁标志位。是对象指向它的类型元数据的指针,占 4B。
2026-05-10 16:02:33
102
原创 【Vite】vite.config.ts 配置详解(Vite 8)
Vite 8 作为前端构建工具的性能天花板,相比 Vite 7 优化了冷启动速度、热更新效率和打包体积,尤其适配 Vue3 + TypeScript 技术栈,是当前前端项目的首选构建工具。
2026-04-15 19:12:36
611
原创 【Redis】缓存击穿
缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期,一般都会从后端 DB 加载数据,并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。后面的线程进来发现已经有缓存了,就直接走缓存。
2026-04-09 11:08:40
447
原创 【Spring】常用注解:@Bean
创建一个MainConfig类,并在该类上添加@Configuration注解,来标注该类是一个Spring的配置类,也就是告诉Spring它是一个配置类,配置类就相当于一个xml文件,最后通过@Bean注解,将Person类注入到Spring的IOC容器中。主要是我们在类上加上@Configuration注解,并在方法上加上@Bean注解,就能够将方法中创建的JavaBean,注入到Spring的IOC容器中。然后,修改MainTest类中的main方法,以测试通过注解注入的Person类,如下所示。
2026-04-08 17:10:30
258
原创 【Spring】@Component VS @Configuration
@Controller(Web 层)、@Service(业务层)、@Repository(数据层),均是 @Component 的语义化扩展,底层逻辑完全一致。,将普通 Java 类,标记为 Spring 容器管理的 Bean,是 Spring 中最基础的组件注册注解。:支持在类内部,通过 @Bean 注解,手动创建 Bean,实现复杂 Bean 的初始化、依赖注入。是管理 Bean 实例、实现依赖注入的核心注解,也是 Java 后端开发必须吃透的基础知识点。
2026-04-08 13:03:20
370
原创 【SpringBoot】过滤器
核心逻辑:通过Java配置类,创建FilterRegistrationBean对象,将过滤器注册到Spring容器中,可直接配置拦截URL、排除URL、执行顺序,无需@WebFilter和@ServletComponentScan,是开发中最常用的方式。而实际开发中,单一过滤器无法满足多场景需求(例如:同时需要登录校验、接口限流、请求日志打印、参数脱敏),此时就需要配置多过滤器,并严格控制其执行顺序——这也是SpringBoot多过滤器的核心价值所在。通过@Order注解指定执行顺序(值越小,执行越早);
2026-04-07 10:36:46
221
原创 【SpringBoot】集成 Knife4j
Knife4j 是一款基于OpenAPI规范(OpenAPI3.0)开发的接口文档工具,核心定位是「接口文档全解决方案」,主打「轻量无冗余、功能强大、UI友好、适配性强」,可独立完成接口文档的生成、调试与交付,适配各类Java后端项目开发需求。in(可选,默认自动识别):参数位置,可选值为header(请求头)、query(查询参数)、path(路径参数)、body(请求体),一般无需手动指定,Knife4j会自动识别。若为必填参数,Knife4j调试时会自动标记为必填。
2026-04-03 17:15:09
568
原创 【SpringBoot】集成 Swagger
OpenAPI Specification(OAS)是由 Linux 基金会主导的开源规范,用于标准化 RESTful API 的描述格式,当前主流版本为 3.0,是前后端协作、接口自动化测试的通用行业标准。,支持接口调试、参数校验、响应预览,彻底解决前后端分离架构下,接口文档维护滞后、手动编写易出错、团队沟通成本高的核心痛点。,全覆盖 Controller、接口方法、请求参数、响应实体、参数忽略等场景。:前端、测试、运维、产品统一依据文档工作,降低沟通歧义,提升研发效率。
2026-04-03 16:43:12
404
原创 【SpringCloud】Nacos 组件:服务注册与发现
打开 mysql-schema.sql 文件,发现其中只能表的创建语句,并没有数据库的创建语句, 且文件中给出数据库的名称建议使用 nacos_config。所以, 需要 添加如下注解。修改 02-consumer-nacos-8080 的配置文件,指定 nacos 服务发现的 group 与 namespace, 就只会调用到指定范围中的服务。这里要搭建的 Nacos 集群中包含三台 Nacos 服务器,由于这些 Nacos 都在同一台主机, 所以这里创建的集群实际只有端口号不同,是个伪集群。
2026-04-03 12:22:06
220
原创 【SpringCloud】Sentinel 组件:blockHandler vs fallback
场景1:订单提交接口(高并发场景),配置Sentinel限流规则(QPS上限100)、熔断规则(失败率上限50%,熔断时长10秒),当请求超出限流阈值或触发熔断时,通过blockHandler返回统一的兜底提示,同时区分不同类型的BlockException,返回更精准的响应。触发时机早于业务逻辑执行(或业务逻辑未执行);核心作用是当业务代码出现错误(如数据库异常、远程调用失败、自定义业务异常)时,提供兜底逻辑(如返回默认数据、友好提示),避免服务崩溃或返回不友好的异常信息,保证业务链路的稳定性。
2026-04-02 08:47:59
444
原创 【SpringCloud】Sentinel 组件:流控规则
默认 coldFactor 为 3,即请求QPS从(threshold / 3) 开始,经多少预热时长才逐渐升至设定的 QPS 阈值。默认coldFactor为3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。设置含义:/testA每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒。如 QPS=30,则初始允许 10 QPS,10 秒后提升至 30。匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。
2026-04-01 17:28:04
470
原创 【MySQL】子查询
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询。同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询。外部的查询语句,称为主查询或外查询。
2026-04-01 10:19:14
433
原创 【MySQL】关联查询(多表查询)
右外连接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,可以简写成RIGHT JOIN。左外连接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,可以简写成LEFT JOIN。需要注意的是,如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替,不能使用原有的表名,否则就会报错。:没有任何关联条件,结果集会很大,通常在实际应用中很少使用。
2026-03-31 16:07:26
416
原创 【MySQL】函数:MySQL 信息函数
MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员,更好地对数据库进行维护工作。
2026-03-31 15:40:45
42
原创 【MySQL】函数:聚合函数
这样,我们就既利用了 WHERE 条件的高效快速,又发挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。HAVING 则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。
2026-03-30 10:57:04
402
原创 【MySQL】函数:窗口函数
情况2:OVER(PARTITION BY 字段),无ORDER BY、无帧边界:每个分区内的所有行参与计算,例如“SUM(salary) OVER(PARTITION BY dept_name)”表示计算每个部门的薪资总和,同部门每行返回相同的部门总和。底层逻辑:与RANK()、ROW_NUMBER()逻辑一致,先分区、再排序,核心差异在于并列排名后的处理——DENSE_RANK()不会跳过并列名次,无论有多少个并列名次,后续排名均按连续序号递增,确保排名序号无跳跃,仅体现“等级差异”。
2026-03-27 19:23:17
533
原创 【Java】常见加密算法
CBC模式(密码分组链接模式):安全性高于ECB模式,加密前需指定初始向量(IV,Initial Vector),每个明文分组加密时,会与前一个密文分组进行异或运算,相同的明文分组会得到不同的密文分组,适合大量数据、敏感数据加密(如文件加密、数据库敏感字段加密),是开发中AES的首选模式。核心要求:初始向量(IV)需随机生成,长度与AES分组长度一致(128位,即16字节),IV无需保密,但需与解密时完全一致,且每次加密需使用不同的IV(避免相同明文+相同密钥+相同IV导致加密结果重复,降低安全性)。
2026-03-26 10:40:43
342
原创 【MySQL】增删改查(CRUD)手册
通过循环分批删除,每次只删少量数据(比如每次 10,000 行),提交事务,避免长时间锁表和 undo 膨胀。稳定版,遵循阿里巴巴《Java 开发手册》数据库规范,所有语法、示例、场景均贴合真实项目开发。在 Oracle 中删除大表(20GB)中大量历史数据时,如果直接使用。SELECT 后面的字段,要么在 GROUP BY 里,要么用聚合函数。方法二:或者是建新表,插入最新数据,然后直接删除旧表(注意备份)(兼容 emoji,替代不完整的 utf8);(支持事务、外键、行锁,唯一选择);
2026-03-25 10:04:19
336
原创 【MySQL】SQL 优化:关联查询优化
如果是表关联的话,尽量使用inner join ,不要使用用left join | right join,如必须使用,一定要以小表为驱动。straight_join: 效果和 inner join一样,但是会强制将左侧作为驱动表!第二个案例中,子查询作为被驱动表,由于子查询是虚表, 无法建立索引,因此不能优化。上述两个案例,第一个查询效率较高,且有优化的余地。如果两张表**只有一个有索引,那有索引的表作为。两个索引都存在的情况下, 数据量大的 作为。left join 时,左侧的为驱动表,
2026-03-23 15:08:52
461
原创 【Linux】常用命令:CPU性能专项(top、mpstat 等)
是Java后端服务(SpringBoot、微服务、分布式项目)最常见的故障之一:接口响应超时、服务假死、FullGC频繁、线程死循环,归根结底大多是CPU资源瓶颈导致的。:最基础、最常用的CPU监控命令,实时展示系统全局负载、CPU总使用率、进程级CPU占用,是排查CPU问题的第一步。:综合监控CPU运行队列、上下文切换次数,判断是否存在线程竞争、调度异常问题,适用于CPU使用率不高但负载高的场景。:1/5/15分钟等待CPU的进程数总和,理想值≤CPU核心数,超过2倍核心数判定为高负载,需紧急排查。
2026-03-20 12:33:18
385
原创 【Linux】常用命令:sort
不仅能实现基础的字符 / 数字排序,还支持多字段排序、去重、内存优化、大文件排序、自定义分隔符等核心功能,是处理日志、业务数据、配置文件的必备工具。:自定义列分隔符,默认以空格 / Tab 为分隔符,支持逗号、竖线等。:员工 ID、订单编号、端口号、薪资等数字类型数据排序。:CSV 文件、日志文件、竖线分隔的结构化数据处理。:格式化配置文件、缩进代码、格式不规范的日志排序。:英文日志、用户名、域名等不区分大小写的数据排序。:指定按第几列进行排序,支持数字、降序等组合使用。
2026-03-20 09:04:21
453
原创 【MySQL】索引:创建、删除索引
可以看到,查询id和name字段时,使用了名称为MultiIdx的索引,如果查询 (name, age) 组合或者单独查询name和age字段,会发现结果中possible_keys和key值为NULL, 并没有使用在t3表中创建的索引进行查询。使用CREATE TABLE创建表时,除了可以定义列的数据类型外,还可以定义主键约束、外键约束或者唯一性约束,而不论创建哪种约束,在定义约束的同时,相当于在指定列上创建了一个索引。length 为可选参数,表示索引的长度,只有字符串类型的字段,才能指定索引长度;
2026-03-19 15:14:12
362
原创 【MySQL】索引:索引分类
例如,在表中的字段id、name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中,使用了这些字段中的第一个字段时,才会被使用。MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
2026-03-19 10:51:11
365
原创 【Linux】脚本:console.log 日志定期备份清理
cp 复制备份+清空原文件,不修改程序文件句柄,SpringBoot 无感运行,不丢日志、不中断服务。日志会持续累积、无限增长,不仅占用大量磁盘空间,还会拖慢日志检索效率,甚至引发磁盘告警。,支持手动配置多项目日志路径,全程不重启服务、不丢失日志、不影响业务程序正常运行。:日志保留天数,默认7天,可按需改为15/30天,仅清理日期命名的备份日志。,无需额外配置重定向;:脚本执行日志路径,自动记录每次备份、清理、异常信息,运维排查更便捷。重命名,会导致程序继续往旧文件写入日志,造成日志割裂丢失。
2026-03-18 15:29:35
378
原创 【MySQL】MVCC:实现原理
比如,现在有id为 1 ,2 , 3 这三个事务,之后id为 3 的事务提交了。步骤4:下一个版本的列name的内容是'张三',该版本的trx_id值为8,小于ReadView中的up_limit_id值10,所以这个版本是符合要求的,最后返回给用户的版本就是这条列name为‘张三'的记录。步骤4:下一个版本的列name的内容是'张三',该版本的trx_id值为8,小于ReadView中的up_limit_id值10,所以这个版本是符合要求的,最后返回给用户的版本就是这条列name为‘张三'的记录。
2026-03-18 11:06:02
332
原创 【MySQL】事务:如何使用事务
READ ONLY和READ WRITE是用来设置所谓的事务访问模式的,就是以只读还是读写的方式来访问数据库中的数据,一个事务的访问模式不能同时即设置为只读的也设置为读写的,所以不能同时把READ ONLY和READ WRITE放到START TRANSACTION语句后边。这样的话,我们写入的多条语句就算是属于同一个事务了,直到我们显式的写出 COMMIT 语句,来把这个事务提交掉,或者显式的写出 ROLLBACK 语句,来把这个事务回滚掉。这样在本次事务提交、或者回滚前,会暂时关闭掉自动提交的功能。
2026-03-18 09:39:42
452
原创 【MySQL】事务:事务的隔离级别
Session A和Session B各开启了一个事务,Session B中的事务,先将studentno列为1的记录的name列更新 为'张三',然后Session A中的事务再去查询这条studentno为1的记录,如果读到列name的值为'张三',而 Session B中的事务稍后进行了回滚,那么Session A中的事务相当于读到了一个不存在的数据,这种现象就称之为 脏读。当我们将当前会话的隔离级别设置为可重复读的时候,当前会话可以重复读,就是每次读取的结果集都相同,而不管其他事务有没有提交。
2026-03-17 17:12:25
443
1
LED_Trafic.zip
2020-06-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅