- 博客(117)
- 收藏
- 关注
原创 synchronized的优化
如果偏向锁是开启的,并且没有延迟,有延迟的不会刚开始就创建偏向锁刚开始从无锁状态—>偏向锁的状态然后如果有有人与偏向锁的持有者进行竞争就会升级会轻量锁然后从偏向锁状态—>轻量锁如果继续有人和轻量锁的持有者竞争,一开始会尝试自旋获取锁,因为重量级锁对性能的损耗还是比较大。如果自旋过程中获取到了锁,就不会升级为重量级的锁如果自选过程中没有获取到锁,就会升级会重量级别的锁。
2024-10-30 14:05:01 537
原创 MySQL为什么有时候会选错索引
然后,我们往表 t 中插入 10 万行记录,取值按整数递增,即:(1,1,1),(2,2,2),(3,3,3) 直到 (100000,100000,100000)。首先从磁盘中随机加载N份数据页,然后统计不同的值,取得平均值后乘以索引页面的数量,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。MySQL中索引的选择是由优化器来决定的,而决定用什么索引的原因有很多,比如 区分度、扫描行数、是否使用了临时表、是否需要排序、是否需要回表等。这时,默认的 N 是 20,M 是 10。
2024-10-23 00:49:33 474
原创 普通索引和唯一索引,应该怎么选择?
普通索引,不能保证字段的唯一性,所以普通索引会比唯一索引要多N次判断,比如判断下一条记录是否和目标相同。InnoDB的数据其实是按页来取的,也就是说要拿到某一个数据,其实会把这一整页的数据都从磁盘加载到内存中,一页默认是16KB。
2024-10-18 10:54:35 940
原创 BeanFactory和ApplicationContext
Q:到底什么是 BeanFactory它是 ApplicationContext 的父接口它才是 Spring 的核心容器,主要的 ApplicationContext 的实现都是依赖BeanFactory的首先看一下继承关系再调试打断点看看ApplicationContext这个玩意里有什么东西。
2024-10-16 15:20:19 564
原创 IOC是怎么来的?
先创建一个空工程,用来存放接下来的所有工程编写DemoDao、DemoDaoImpl、DemoService、DemoServiceImpl、DemoServlwet这时候访问/demo1就可以看到返回值了。
2024-10-16 15:19:09 764
原创 合并两个有序数组
我们可以使用双指针法从后向前遍历,避免将已经排序的数组打乱。这个方法的核心思路是从。的末尾开始填充较大的元素,因为末尾是用零填充的空闲区域,这样我们可以避免覆盖。这个方法能够高效地解决问题,并且符合进阶要求的 O(m + n) 复杂度。
2024-09-30 18:53:35 502
原创 简单创建代理工厂
一般对于JDBC来说,无非就是连接数据库、查询数据库、封装实体、返回实体,如果要设计一个ORM框架的话也就是要考虑怎么把用户自定义的数据库操作接口、XML中的SQL语句、数据库三者给联系起来,其实最适合的操作就是代理,使用代理的方式来进行处理,因为代理可以封装一个复杂的流程为借口对象的实现类。接口的代理对象,并通过代理对象来处理接口方法的调用,从而实现接口的具体操作。这个流程图展示了如何通过代理工厂和代理模式,动态创建。这张图描述了一个使用代理模式的流程,主要涉及。首先是IUserDao。
2024-08-15 17:20:02 391
原创 MySQL架构设计
语法分析器使用上下文无关文法(Context-Free Grammar, CFG)来描述SQL语言的语法规则。这些规则定义了SQL语句如何由一系列词法单元构成,并规定了各个词法单元之间的合法组合方式。
2024-08-15 17:18:44 810
原创 【WEB系列】过滤器Filter
Filter,过滤器,属于Servlet规范,并不是Spring独有的。其作用从命名上也可以看出一二,拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servlet。WebFilter常用属性如下,其中urlPatterns最为常用,表示这个filter适用于哪些url请求(默认场景下全部请求都被拦截)接下来的一个问题就是如何让我们自定义的Filter生效,在SpringBoot项目中,有两种常见的使用方式。那么如何让@WebFilter生效呢?
2024-06-04 16:11:19 453 1
原创 如何利用GPT4写论文
我是一个科学研究助理,专门帮助用户通过搜索相关科学论文来回答问题、撰写内容和进行研究。我可以为你找到关于特定话题的研究论文摘要,并从中提取关键信息。无论你有关科学研究的任何问题或需要帮助撰写内容,我都可以提供帮助,并确保引用相关的研究论文。比如,如果你想知道某种药物的效果如何,或者某种技术在特定领域的应用,我可以为你搜索最相关的研究论文并总结它们的发现。我还可以帮助准备学术报告或文章草稿,提供数据分析和总结等。
2024-04-25 09:34:10 1258 1
原创 ForkJoinPool、CAS原子操作
ForkJoinPool是由JDK1.7后提供多线程并行执行任务的框架。可以理解为一种特殊的线程池。1.任务分割:Fork(分岔),先把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。2.合并结果:join,分割后的子任务被多个线程执行后,再合并结果,得到最终的完整输出。类似于分治的思想,把大任务一点点拆分为一个个小任务。如果要统计1~100之间的和,当然可以直接暴力for循环,不过也可以把它拆分为10个任务,计算1到10的和,11到20的和…
2024-03-29 20:46:05 1158
原创 ThreadPoolExecutor经典面试题
每个work在runWork()的时候去getTask(),在getTask内部,并没有针对性的区分当前work是否是核心线程或者类似的标记。只要判断works数量超出core,就会调用poll(),否则take()答案:如果队列中没有任务时,核心线程会一直阻塞在获取任务的方法,直到返回任务。即便是第一个被创建的核心线程,仍然有可能被销毁。验证:起一个线程池,放置一个任务sleep,debug查看结束前后的状态。1)线程池是如何保证线程不被销毁的呢?2)那么线程池中的线程会处于什么状态?
2024-03-29 17:22:41 296
原创 线程池详解
设置为20,那么任何时候线程池至少会有10个活跃的线程(如果有任务需要执行),即使有些线程是闲置的。当任务数增加,并且所有的核心线程都在忙时,线程池可以临时创建更多的线程,最多到20个。线程上下文切换是有成本的,因为它需要CPU周期来保存和加载线程的状态信息,并且在切换过程中CPU不做任何实际的工作,只是在两个线程之间传递。举例来说,如果你想要添加一个新线程到线程池时,需要检查当前活动的线程数是否少于配置的最大线程数。节省cpu切换线程的时间成本(需要保持当前执行线程的现场,并恢复要执行线程的现场)。
2024-03-28 23:56:13 889 1
原创 Linux 收发网络包的流程
数据包首先到达网络接口,并被放置在环形缓冲区(Ring Buffer)中。当环形缓冲区接收到数据后,会触发一个软中断(或者在某些情况下是NAPI轮询机制)。ksoftirqd内核线程(或者在高负载时直接由中断上下文)处理这些软中断,从环形缓冲区中取出数据帧。使用sk_buff结构来表示网络包,并进行基本的合法性检查,如CRC检验等,不合法的帧会被丢弃。识别上层协议(如IPv4, IPv6),并移除数据链路层的头(如以太网帧头)。在网络层,包括IP头的网络数据包会被进一步处理。
2024-03-28 12:50:31 1556 2
原创 Keepalive与idle监测及性能优化
两者的主要区别在于它们的目的和实施方式。Keepalive 主要用于确保连接双方知道对方仍然“活着”,并且连接是有效的。而Idle监测则用于确定一个连接在一段时间内是否有活动,以决定是否应该保持或关闭这个连接。Keepalive是通过定期发送控制消息来实现的,而Idle监测是通过观察一段时间内的数据传输活动来实现的。在Linux内核中也有一个keepalive来确认对端的连接状态是否健康。
2024-03-23 20:40:48 1137 1
原创 【Netty】TCP粘包、拆包、编解码问题
粘包拆包分析主要探讨固定长度字段存消息长度在这个例子中, 设置了最大行长度为 8192 字节,会剔除换行符,并且在检测到超长行时立即抛出异常。假设有一个基于文本的协议,消息以(换行符)结束。在这个例子中,会查找换行符,将接收的数据分割成单独的行,并将每行作为一个单独的帧传递到管道中的下一个处理器。LengthFieldPrepender从继承关系可以看出来,这是一个可以处理收、发的处理器其他编解码器maven依赖:插件依赖:proto文件可以看到,返回的就是我们在proto文件中
2024-03-23 13:13:23 938 1
原创 Netty中的核心概念
内存分配在jvm堆,分配和回收速度比较快,可以被JVM自动回收,缺点是,如果进行socket的IO读写,需要额外做一次内存复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有一定程度的下降。2,Netty的 Promise接口扩展了Netty的Future接口,它可以设置异步执行的结果并触发Listener,比如在IO操作过程,不管是顺利完成、还是发生异常,都可以设置Promise的结果,并且通知Promise的。1,Netty是基于事件驱动的,比如:连接就绪;
2024-03-18 21:54:29 1077 2
原创 初识Netty网络编程
是一个有序的处理器链容器,每个Channel(在网络编程中,Channel表示连接的抽象)都有自己的管道。管道中的处理器按顺序排列,形成一个链式结构,用于处理或拦截进出Channel的各种事件和数据。当数据从网络流入或流出时,它会经过管道中的每一个处理器。处理器可以修改、过滤、转换数据或者处理特定类型的事件(比如连接建立、读取完成、异常等)。提供了一种灵活的方式来组织和管理这些处理器,允许开发者在运行时动态插入、删除或替换处理器,从而定制不同阶段的数据处理逻辑。
2024-03-17 20:02:48 924
原创 Reactor线程模型
一个线程来处理所有的请求,会导致并发很高,如果其中一个Channel在进行读写数据的时候,数据量很大,会导致处理速度很缓慢,这时候如果有人再次发次连接,速度会很慢。单线程模型的特点:接收连接、IO处理、业务处理均在一个线程中完成。那么可以怎么优化呢?既然问题出在数据的读取上,那能不能把数据的读取放到线程池中进行,这样就不会因为某个Channel的读取导致整个系统的效率降低了。
2024-03-16 20:27:17 1039
原创 操作系统IO模型
服务端:Channel(通道)、Buffer(缓冲区)、Selector(选择器/多路复用器)什么是Channelcapacity:缓冲区可以容纳的元素的最大数量limit:停止读写的索引position:当前要读或者写的索引,读写操作是从position开始,到limit停止mark:用于标记position的位置,默认为-1。
2024-03-15 21:17:21 1020
原创 RPC通信原理(二)
网络IO其实就是计算机内存和外部设备之间拷贝数据的过程,对于单个进程是无法直接要到网卡的数据的,但是Linux kernel可以,在内核当中会存在一片内核缓冲区,内核会给上层提供一些列的系统接口来刷走这片数据。当可用率过低/失败率过高的时候会对服务进行熔断,熔断的时候会设置一个熔断时间,当超过熔断时间的时候系统会尝试调用一下这个服务,如果调用成功了,就可以结束熔断,反之继续熔断。限流的作用是用来限制其请求的速率,保护后台相应服务,以免服务过载导致服务不可用的现象出现。那么熔断工作什么时候开始的呢?
2024-03-13 15:54:35 1066
原创 RPC通信原理(一)
如果现在我有一个电商项目,用户要查询订单,自然而然是通过Service接口来调用订单的实现类。我们把用户模块和订单模块都放在一起,打包成一个war包,然后再tomcat上运行,tomcat占有一个进程,这个项目也是在这个进程中运行的,模块之间的调用也是在进程的本地进行调用,那么如果我是一个分布式项目该怎么解决呢?现在用户和订单模块部署在两台服务器上,这时候用户模块就不能直接调用订单模块了,只能够通过网络来进行调用,而RPC就是用来干这个事情的,。需要远程通信的各类场景。
2024-03-12 16:33:21 1078
原创 Redis的散列插槽及故障转移
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。如图,在7001这个节点执行set a 1时,对a做hash运算,对16384取余,得到的结果是15495,因此要存储到103节点。类似于一个哈希散列表,通过哈希算法来映射插槽,并为redis节点分配插槽区间,插槽的所有范围是0~16383。时,对num做hash运算,对16384取余,得到的结果是2765,因此需要切换到7001节点。
2024-03-06 19:11:24 1111
原创 redis主从架构
单节点Redis的并发能力是有上限的,要进一步提高redis的并发能力,就需要搭建主从集群,实现读写分离。修改每个实例的声明IP。
2024-03-05 19:15:32 1065
原创 Redis持久化
RDB全称Redis Database Backup file(Redis数据备份文件),就是把内存中所有的数据都记录到磁盘当中。如果Redis实例出现故障重启之后,从磁盘快照读取文件,恢复数据。快照文件默认是保存在当前运行目录的。Redis默认是有保存机制的,不过是在退出之前进行保存:那么如果是突然宕机呢?如果我使用kill -9来杀掉这个进程,就不会进行保存了,那么这种情况要怎么解决?
2024-03-05 16:39:40 501
原创 安装Docker及DockerCompose
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。Docker CE 分为stabletest和nightly三个更新频道。官方网站上有各种环境下的,这里主要介绍 Docker CE 在 CentOS上的安装。
2024-03-03 20:16:03 1333
原创 【elasticsearch】搜索结果处理
elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query部分。ES是分布式的,所以会面临深度分页问题。而如果要查询更多的数据就需要修改分页参数了。elasticsearch中通过修改from、size参数来控制要返回的分页结果。高亮:就是在搜索结果中把搜索关键字突出显示。
2024-02-25 22:57:21 531
原创 【笔记】常用方法
/更新操作UPDATE,//插入操作INSERT@Target(ElementType.METHOD) //注解只能加在方法上@Retention(RetentionPolicy.RUNTIME) //注解在运行期间起作用//数据库操作类型:update insert@Aspect@Component@Slf4j//切入点//锁定com.sky.mapper包下的所有类的所有方法,并且标注了AutoFill这个注解的方法就会被拦截进行填充处理//通知//获取调用函数签名。
2024-02-16 20:07:29 483
原创 【Java】苍穹外卖 Day02
ThreadLocal 并不是一个Thread,而是Thread的局部变量。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
2024-02-09 13:56:20 1090
原创 【Java】苍穹外卖 Day01
作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从 软件开发流程、角色分工、软件环境 三个方面整体介绍一下软件开发。在开发苍穹外卖这个项目之前,我们需要全方位的来介绍一下当前我们学习的这个项目。接下来,我们将从项目简介、产品原型、技术选型三个方面来介绍苍穹外卖这个项目。
2024-02-09 00:27:24 954
原创 【Java】Redis入门
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。**官网:**https://redis.io**中文网:**https://www.redis.net.cn/key-value结构存储:基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。
2024-02-04 18:01:48 1241
原创 【Java】MybatisPlus入门
MyBatisPlus环境搭建的步骤?@Mapper通过入门案例制作,MyBatisPlus的优点有哪些?MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率https有什么简单的办法可以自动生成实体类的GET、SET方法?
2024-02-03 00:19:34 1891
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人