- 博客(285)
- 收藏
- 关注
原创 Day04
每个对象有一个 monitor(监视器锁),当线程第一次获取该对象的锁,锁计数器 + 1,如果这个线程再次请求同一个锁(重入),计数器继续 + 1,直到退出 synchronized 块或方法时,计数器依次递减,归0时真正释放锁。notify():只唤醒一个线程,其他线程仍处于等待状态。线程处于 wait() 状态时,会释放对象锁并进入等待队列,底层实际上调用了类似 LockSupport.park() 的方法,使线程进入等待(WAITING)状态,线程此时没有占用CPU资源。
2025-05-27 21:59:25
352
原创 Day02
首先,在消息生产阶段,生产者发送消息后必须等待 RabbitMQ 返回确认(ack),如果出现异常则需要重试,确保消息成功写入队列,避免消息丢失。其次,在消息存储阶段,RabbitMQ 通常以集群方式部署,消息会同步写入多个节点副本,即使某个节点宕机,也能保证数据不丢失,提高系统的高可用性和容错能力。最后在消息消费阶段,消费者在完成消息处理后才发送确认,这样如果消费者异常宕机,消息不会丢失,RabbitMQ 会将未确认的消息重新投递给其他消费者。另外,通过分布式锁防止并发写冲突,也是保障一致性的重要手段。
2025-05-25 22:15:52
671
原创 Java多线程&JUC
多线程是一种程序执行方式,它允许一个程序在同一时间运行多个线程,每个线程可以看作是程序中的一个执行单元。多线程的目的是提高程序的并发性、利用多核CPU的性能、提升执行效率。
2025-05-25 21:01:29
799
原创 Day01
幻读:一个事务中前后两次执行相同条件的查询,结果集的记录条数不一致,因为其他事务插入了符合条件的新数据。它的核心思想是:每个事务在读数据的时候,其实看到的是数据在某个时间点的“快照”,而不是最新的值。快速排序是不稳定的算法,是基于比较的内部排序中性能最好的方法之一,当待排序关键字是随机分布时,平均时间复杂度为O(nlogn),适用于内存足够且速度要求高的场景。MVCC 让事务在读数据时看到的是符合当前事务版本的数据快照,从而避免加锁冲突,实现高并发读操作,是 InnoDB 保证性能和一致性的重要机制。
2025-05-24 15:37:59
882
原创 Day54 验证二叉搜索树
空间复杂度:O(n),其中 n 为二叉树的节点个数。递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,即二叉树的高度。最坏情况下二叉树为一条链,树的高度为 n ,递归最深达到 n 层,故最坏情况下空间复杂度为 O(n)。时间复杂度:O(n),其中 n 为二叉树的节点个数。在递归调用的时候二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)。时间复杂度:O(n),其中 n 为二叉树的节点个数。空间复杂度:O(n),其中 n 为二叉树的节点个数。
2025-04-20 13:58:48
292
原创 Day53 二叉树的层序遍历
空间复杂度:O(n)(最坏情况下队列存储所有叶子节点)空间复杂度:O(h)(递归栈空间,h为树高)时间复杂度:O(n)时间复杂度:O(n)
2025-04-18 12:49:20
356
原创 GO语言入门
常量是一个简单值的标识符,在程序运行时,不会被修改的量。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。显式类型定义:隐式类型定义:const (Unknown = 0 // 未知Female = 1 // 女性Male = 2 // 男性常量可以用函数计算表达式的值。const (a = "abc"b = len(a)函数体func:函数由 func 开始声明。
2025-04-14 13:47:05
1340
2
原创 Day50 单词规律
时间复杂度是 O(n),其中 n 是字符串 s 中单词的数量,或者是模式 pattern 的长度。因为我们只遍历了一次字符串和模式。空间复杂度是 O(n),因为我们使用了两个哈希映射来存储字符和单词的映射关系。
2025-03-30 22:03:29
354
原创 Day49 最长连续序列
综合来看,总时间复杂度为 O(n),空间复杂度为 O(n)(存储 HashSet)。构造 HashSet:遍历 nums 存入 HashSet,时间 O(n)。每个元素最多访问两次(一次作为起点,一次在扩展时访问),总时间 O(n)。查找起点 & 计算最长序列:遍历 numSet 一次 O(n)。
2025-03-25 15:20:08
111
原创 Redis实战
数据表介绍:后端的最初功能都是基于Mybatis-Plus搭建的,前端代码后面有空再用Vue写更新。发送验证码:用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户短信验证码登录、注册:用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后和用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号查询用户,如果用户不存在,则为用户创建账号信
2025-03-13 15:30:58
735
原创 Day47 环形链表
判断链表是否有环,通常可以使用 快慢指针法,该方法通过两个指针(慢指针和快指针)遍历链表,如果链表中有环,两个指针最终会相遇。如果链表中存在环,快指针最终会追上慢指针。否则,快指针会先到达链表末尾(null),说明链表没有环。时间复杂度:O(n),其中 n 是链表的节点数。快慢指针最多遍历整个链表一次。空间复杂度:O(1),只用了两个额外的指针,空间复杂度是常数。
2025-03-06 16:16:28
152
原创 React
JSX是React的核心内容JSX表示在JS代码中书写HTML结构,是React声明式的体现使用JSX配合嵌入的JS表达式,条件渲染,列表渲染,可以渲染任意的UI结构结果使用className和style的方式给JSX添加样式React完全利用JS的语言自身的能力来编写UI,而不是造轮子增强HTML的功能。(对比VUE)
2025-03-06 14:21:02
1349
1
原创 Day46 反转字符串
时间复杂度: O(n),其中 n 是字符串的长度,因为我们只遍历了一次字符串,并在每次处理时执行常数时间的反转操作。空间复杂度: O(n),用于存储字符数组。
2025-02-26 21:43:54
213
原创 Day45 最长公共前缀
时间复杂度:最坏情况下,每个字符串都需要与前缀进行比较,比较次数为 O(n * m),其中 n 是字符串数组的长度,m 是最长字符串的长度。空间复杂度:O(1)。
2025-02-25 19:17:27
205
原创 Day43 两数相加
空间复杂度:O(n),其中 n 是结果链表的长度(最多为两个链表的长度之和)。我们需要额外的空间来存储结果链表。时间复杂度:O(n),其中 n 是较长链表的长度。我们需要遍历两个链表的所有节点,每个节点只访问一次。
2025-02-22 19:24:38
120
原创 Day42 反转链表II
时间复杂度:O(n),其中 n 是链表的节点数。我们只遍历了链表的一部分,所以复杂度是线性的。空间复杂度:O(1),我们只使用了常数的额外空间。
2025-02-21 19:32:00
130
原创 RabbitMQ服务异步通信
每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目加载时配置:// 获取RabbitTemplate对象 RabbitTemplate rabbitTemplate = applicationContext . getBean(RabbitTemplate . class);
2025-02-18 20:50:51
1078
原创 微服务保护---Sentinel
什么是雪崩问题?微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。可以认为:限流是对服务的保护,避免因瞬间高并发流量而导致故障,进而避免雪崩,是一种预防措施。超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围内,避免雪崩,是一种补救措施。Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html丰富的应用场景。
2025-02-12 20:51:13
1146
原创 分布式搜索引擎03
默认的拼音分词器会将每个汉字单独分为拼音,而我们希望每个词条形成一组拼音,需要对拼音分词器做个性化定制,形成自定义分词器。character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword就是不分词;还有ik_smarttokenizer filter:将tokenizer输出的词条做进一步处理。
2025-02-07 16:05:49
925
原创 分布式搜索引擎02
match和multi_match的区别是什么?match:根据一个字段查询multi_match:根据多个字段查询,参与查询字段越多,查询性能越差精确查询常见的有哪些?term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段range查询:根据数值范围查询,可以是数值、日期的范围query:查询条件from和size:分页条件sort:排序条件highlight:高亮条件。
2025-01-21 22:49:53
1229
1
原创 分布式搜索引擎01
elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容例如:在github搜索代码:在电商网站搜索商品:在百度搜索答案:在打车软件搜索附近的车:lasticsearch结合kibana、Logstash、Beats,也就是elasticstack(ELK)。被广泛应用在日志数据分析、实时监控等领域:而elasticsearch是elasticstack的核心,负责存储、搜索、分析数据。elasticsearch底层是基于lucene来实现的
2025-01-18 14:26:01
1145
原创 RabbitMQ
建立connection创建channel利用channel声明队列利用channel向队列发送消息建立connection创建channel利用channel声明队列定义consumer的消费行为handleDelivery()利用channel将消费者与队列绑定多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列。
2025-01-16 14:54:39
1302
原创 Docker
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。而要自定义镜像,就必须先了解镜像的结构才行。
2025-01-14 18:27:02
892
1
原创 SpringCloud
单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝微服务:一种良好的分布式架构方案①优点:拆分粒度更小、服务更独立、耦合度更低②缺点:架构非常复杂,运维、监控、部署难度提高SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。
2025-01-11 20:59:05
1342
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人