自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HandlerMapping分析

HandlerMapping体系分析

2024-06-25 15:55:38 827

原创 网络编程(Java)相关知识总结

java网络编程知识

2024-06-25 15:49:37 357

原创 Redis的高级数据类型与运用场景

如果这样的页面很多,那所需要的存储空间是惊人的。georadius和georadiusbymember两个命令的作用是一样的,都是以一个地理位置为中心算出指定半径内的其他地理信息位置,不同的是georadius命令的中心位置给出了具体的经纬度,georadiusbymember只需给出成员即可。地图元素的位置数据使用二维的经纬度表示,经度范围(-180, 180],纬度范围(-90,90],纬度正负以赤道为界,北正南负,经度正负以本初子午线(英国格林尼治天文台) 为界,东正西负。

2024-05-20 22:11:10 746

原创 RPC框架和网络编程-BIO

在Dubbo里:服务容器负责启动,加载,运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。服务消费者在启动时,向注册中心订阅自己所需的服务。注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。我们的实现和Dubbo的比较可以看到。

2024-05-20 21:42:19 961

原创 Semaphone源码解析

sync,ReentrantLock是互斥锁,保证一个资源同一时间只允许被一个线程访问Semaphore(信号量)保证1个或多个资源可以被指定数量的线程同时访问底层实现是基于AQS去做的。Semaphore底层也是基于AQS的state属性做一个计数器的维护。state的值就代表当前共享资源的个数。如果一个线程需要获取的1或多个资源,直接查看state的标识的资源个数是否足够,如果足够的,直接对state - 1拿到当前资源。如果资源不够,当前线程就需要挂起等待。

2024-05-14 18:05:58 446

原创 CountDownLatch源码解析

CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。需要一个并发安全的计数器来操作。CountDownLatch就可以实现。给CountDownLatch设置一个数值。可以设置3。每个业务处理完毕之后,执行一次countDown方法,指定的3每次在执行countDown方法时,对3进行-1。主线程可以在业务处理时,执行await,主线程会阻塞等待任务处理完毕。

2024-05-14 18:02:31 970

原创 并发编程可见性

可见性问题是基于CPU位置出现的,CPU处理速度非常快,相对CPU来说,去主内存获取数据这个事情太慢了,CPU就提供了L1,L2,L3的三级缓存,每次去主内存拿完数据后,就会存储到CPU的三级缓存,每次去三级缓存拿数据,效率肯定会提升。这就带来了问题,现在CPU都是多核,每个线程的工作内存(CPU三级缓存)都是独立的,会告知每个线程中做修改时,只改自己的工作内存,没有及时的同步到主内存,导致数据不一致问题。可见性问题的代码逻辑​// ....

2024-05-09 16:38:07 516

原创 并发编程的原子性

Lock锁是在JDK1.5由Doug Lea研发的,他的性能相比synchronized在JDK1.5的时期,性能好了很多多,但是在JDK1.6对synchronized优化之后,性能相差不大,但是如果涉及并发比较多时,推荐ReentrantLock锁,性能会更好。然后是弱引用,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。他在替换内存的某个位置的值时,首先查看内存中的值与预期值是否一致,如果一致,执行替换操作。

2024-05-09 16:35:59 1141

原创 Nacos的Raft一致性算法

(ps:如果是遇到平票现象,则会增加系统不可用时间,因此,raft中引入了randomized election timeouts,尽量避免出现平票现象的产生)一旦选举完毕,leader节点会给所有其他节点发消息,避免其他节点触发新的选举。多副本服务就会出现副本的一致性问题,比如client1将replica1的X值设置为1,而client2将replica2的X值设置为2,这样如果另一个客户client3从不同的副本获取到的X值可能是1也可能是2,这就导致了副本的一致性问题。

2024-05-06 10:37:48 1107

原创 JVM常用的一些命令

System.out.println(Thread.currentThread().getName()+"----if获得obj2锁");System.out.println(Thread.currentThread().getName()+"----否则获得obj1锁");System.out.println(Thread.currentThread().getName()+"----if获得obj1锁");(4)要是在发生堆内存溢出的时候,能自动dump出该文件就好了。(1)查看线程堆栈信息。

2024-05-06 10:34:33 908

原创 什么是MVCC多版本并发控制

具体流程如下:先拿该行记录的事务ID(4)去跟Read View中的up_limit_id相比较,判断是否小于,通过对比发现不小于,所以不符合条件,继续判断4是否大于等于low_limit_id,通过比较发现也不大于,所以不符合条件,判断事务4是否处理trx_list列表中,发现不再次列表中,那么符合可见性条件,所以事务4修改后提交的最新结果对事务2 的快照是可见的,因此,事务2读取到的最新数据记录是事务4所提交的版本,而事务4提交的版本也是全局角度的最新版本。

2024-05-05 20:38:42 935

原创 SqlSessionFactory和SqlSession的理解

SqlSessionFactory是MyBatis中的一个关键接口,用于创建SqlSession对象,是MyBatis的核心组件之一。SqlSessionFactory是通过SqlSessionFactoryBuilder创建的,SqlSessionFactoryBuilder会读取MyBatis的配置文件(mybatis-config.xml),并根据配置文件中的信息构建SqlSessionFactory对象。

2024-05-05 20:30:02 535

原创 MySQL Redo日志

在事务的实现机制上,MySQL采用的是WAL(Write-ahead logging,预写式日志)机制来实现的。就是所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含redo和undo两部分信息。redolog称为重做日志,每当有操作时,在数据变更之前将操作写入redo log,这样当发生掉电之类的情况时系统可以在重启后继续操作。undo log称为撤销日志,当一些变更执行到一半无法完成时,可以根据撤销日志恢复到变更之间的状态。

2024-04-30 21:48:45 990

原创 ZGC的并发处理

GC并发处理算法利用全局空间视图的切换和对象地址视图的切换,结合SATB算法实现了高效的并发GC并发处理算法利用全局空间视图的切换和对象地址视图的切换,结合SATB算法实现了高效的并发相比于 Java 原有的百毫秒级的暂停的 Parallel GC 和 G1,以及未解决碎片化问题的 CMS ,并发和压缩式的 ZGC 可谓是 Java GC 能力的一次重大飞跃—— GC 线程在整理内存的同时,可以让 Java 线程继续执行。

2024-04-30 21:44:15 327

原创 GC:STW&SafePoint

JVM设置的安全点就是相当于我们开车等红绿灯时,各个”路口“设置红绿灯,当程序执行到对应路口的时候, 去查看下当前是否需要执行GC(是红灯还是绿灯),如果是红灯GC 那么就在原地等待;STW:stop-the-world,是GC发生过程中,应用程序会产生停顿,整个应用程序线程在停顿产生时都会被暂停,不做任何响应,有卡死的感觉,此停顿称为STW。当程序执行过程中设置了太多的安全点,势必会导致资源消耗,每次到安全点都要去查询下GC是否需要运行,那么GC线程等待的时间就会变得很长, GC效率自然就会变低;

2024-04-26 22:02:18 284

原创 负载均衡算法

RR ,Round Robin,挨个发,适合于所有服务器硬件都相同的场景。一个一个来,如果有两个服务器,第一次是你,第二次就是我。代码实现:用i 保存 取 服务器的 下标。第一次来 取0,第二次来取1 ,第三次来 取 0。weighted round robin ,wrr,按照权重不同来分发,基本上是基于配置。代码实现:比如:两个服务权重分别是6和4,我们的方法,在1-10之间取 随机数,比如取到 1-6,就走6的权重,取到7-10,就走4权重的服务。:Random代码实现:这个就随意了。

2024-04-26 09:01:50 741

原创 并发编程原子性保证方式

保证并发编程原子性。

2024-04-26 08:56:42 714

原创 微服务的几种限流方式

微服务架构中,在遇到突发的请求量激增、恶意的用户访问,或请求频率过高给下游服务带来较大压力时,我们需要通过缓存、限流、熔断降级、负载均衡等多种方式保证服务的稳定性。限流:对请求或并发数进行限制;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行组件选择:sentinel、hystrixhystrix 底层是基于线程池和信号量实现的,默认情况下是使用线程池.sentinel底层是基于信号量来实现的。阈值:在一个单位时间内允许的请求量。

2024-04-25 19:57:52 750

原创 MySQL的体系架构、Page页结构

File Header 字段用于记录 Page 的头信息,其中比较重要的是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字段,通过这两个字段,我们可以找到该页的上一页和下一页,实际上所有页通过两个字段可以形成一条双向链表。Infimum 和 Supremum 是两个伪行记录,Infimum(下确界)记录比该页中任何主键值都要小的值,Supremum (上确界)记录比该页中任何主键值都要大的值,这个伪记录分别构成了页中记录的边界。比如表缓存,记录缓存,权限缓存,引擎缓存等。

2024-04-25 07:43:56 418

原创 RocketMQ的物理架构

使用消息中间件,系统的耦合性就会提高了。消息队列 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,是阿里巴巴双 11 使用的核心产品。天猫双11大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因为带宽瓶颈限制商品变更的访问流量,通过 RocketMQ 构建分布式缓存,实时通知商品数据的变化。

2024-04-25 07:08:49 594 1

原创 进程,线程,协程、MESI

操作系统进行资源分配和调度的基本单位。每个进程有独立的内存空间。进程通讯就采用共享内存,MQ,管道。一个进程可以包含多个线程,线程就是CPU调度的基本单位。一个线程只属于某一个进程。线程之间通讯,队列,await,signal,wait,notity,Exchanger,共享变量等等都可以实现线程之间的通讯。协程是一种用户态的轻量级线程。它是由程序员自行控制调度的。可以显示式的进行切换。一个线程可以调度多个协程。协程只存在于用户态,不存在线程中的用户态和内核态切换的问题。协程的挂起就好像线程的。

2024-04-25 06:46:42 776

原创 Redis的内存淘汰机制&布隆过滤器流程

定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。例如:一个推荐系统有1亿个用户id,每个小时算法工程师会根据每个用户之前历史行为计算出推荐数据放到存储层中,但是最新的用户由于没有历史行为,就会发生缓存穿透的行为,为此可以将所有推荐数据的用户做成布隆过滤器。3.volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。5.volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。

2024-04-24 21:58:57 172 1

原创 Redis缓存相关知识

bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。字符串类型:体现在单个value值很大,一般认为超过10KB就是bigkey,但这个值和具体的OPS相关。非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。bigkey无论是空间复杂度和时间复杂度都不太友好,下面我们将介绍它的危害。

2024-04-24 07:58:17 968

原创 数据库主键的类型该如何选择,是自增还是UUID?

因为 uuid 相对顺序的自增 id 来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以 innodb 无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。下一条记录就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费。在写的方面,因为是自增的,所以主键是趋势自增的,也就是说新增的数据永远在后面,这点对于性能有很大的提升。进行数据拆分、合并存储的时候,能保证主键全局的唯一性。

2024-04-23 21:45:01 245

原创 B+树和B树的区别

B+Tree磁盘读写能力更强,他的根节点和支节点不保存数据区,所有根节点和支节点同样大小的情况下,保存的关键字要比B Tree要多。B-Tree的每个节点的元素可以视为一次I/O读取,树的高度表示最多的I/O次数,在相同数量的总元素个数下,每个节点的元素个数越多,高度越低,查询所需的I/O次数越少.B+Tree是B Tree的变种,B Tree能解决的问题,B+Tree也能够解决(降低树的高度,增大节点存储数据量)B+Tree排序能力更强,如上面的图中可以看出,B+Tree天然具有排序功能。

2024-04-23 21:43:33 1026

原创 Redis的设计和实现

Redis 为各种文件事件需求编写了多个处理器,若客户端连接Redis,对连接服务器的各个客户端进行应答,就需要将socket映射到连接应答处理器写数据到Redis,接收客户端传来的命令请求,就需要映射到命令请求处理器从Redis读数据,向客户端返回命令的执行结果,就需要映射到命令回复处理器当主服务器和从服务器进行复制操作时, 主从服务器都需要映射到特别为复制功能编写的复制处理器。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。

2024-04-23 21:41:11 914

原创 线程池ThreadPoolExecutor体检套餐

2、如定时任务,时间一到,需要触发一个线程去执行某个任务,也能线程池,JUC也给咋们提供了 ScheduleThreadPoolExecutor,就是定时任务的线程池。如果在核心线程的基础上,又多追加了几个线程,反而会导致性能下降~5、其实java框架底层都有线程池,只是我们没配置,比如RabbitMQ的消费者,你不配置线程的信息,他就是单线程处理,配置了,就是多个消费者并行处理,速度很快。做压测,根据测试的结果,你可以调大核心线程数,重测,调小核心线程数重新测,直到得出一个效率最高的数。

2024-04-23 11:00:59 297

原创 SpringBoot自动装配原理

3.导入 ImportSelector 实现类:@Import 注解还可以导入实现 ImportSelector 接口的类,通过这种方式可以根据条件动态选择要导入的类。1.导入配置类:通过在主配置类上使用 @Import 注解,可以导入其他配置类,使其成为该主配置类的一部分。2.导入普通类:除了导入配置类,@Import 注解还可以用于导入普通的 Java 类。// 根据条件返回需要导入的类的全限定名数组。// 主配置类的内容。// 主配置类的内容。// 主配置类的内容。把 1 和 2 串联起来。

2024-04-23 08:03:19 670

原创 常用消息队列中间件MQ对比分析

消息队列是一种异步的通信方式,用于在分布式系统中管理消息传递。消息队列采用了生产者-消费者模型,生产者将消息发送到队列中,而消费者则从队列中接收消息。

2024-04-23 07:35:17 641 2

原创 ConcurrentHashMap

从时间和空间的角度综合得出的:1.如果是1.0 当数组的值全部填充了才会发生扩容,此时Hash冲突是避免不了的。链表的操作或者红黑树的操作会牺牲时间来保证空间的利用率2.如果是0.5 当数组中一半的数据利用了之后就会开始扩容。这时填充的数据少。hash冲突也会减少,底层的链表和红黑树的高度也会降低。查询效率增加。但是这时还有太多的空间没有利用。空间资源浪费了。所以0.75是综合1和2的逻辑考虑得出。2、写操作线程安全的保证方式2.1 往数组上存数据,基于CAS保证安全。

2024-04-22 09:11:34 660

原创 垃圾收集算法整理

垃圾回收其实就是对不需要的内存对象进行清理,前面提到的GC算法,无论哪种,基本都是过一段时间对所有的内存空间对象进行一次大扫除。可在服务端,这是大忌。黑色的对象代表已经扫描过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。显然在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达。是在垃圾回收算法执行过程中,将jvm内存冻结,停顿的一种状态,在Stw情况下,容易出现两种现象:该回收的对象没有被回收、不该回收的对象被回收了。

2024-04-21 21:55:56 628 1

原创 介绍下什么是“混沌工程“

当你拥有非常复杂的系统时,很容易引起出乎意料的下游效应,这是混沌工程寻找的结果之一,” 因此,系统越复杂,越重要,它就越有可能成为混沌工程的候选对象。故障 注人首先要知道会发生什么故障,然后一个一个地注人, 而在 复杂分布式系统中,想要穷举所有可能的故障,本身就是奢望 混沌工程的思维方式是主动去找故障,是探索性的,你不知道摘 掉一个节点、关掉一个服务会发生什么故障,虽然按计划做好了降级预案,但是关闭节点时却引发了上游服务异常,进而引发雪崩,这不是靠故障注人或预先计划能发现的。这就是混沌工程要解决的问题。

2024-04-21 15:59:07 558 1

原创 雪花算法原理分析

了,所以,相当于系统调整了下时间,把当前时间修改到下一秒钟,参考tilNextMillis(lastTimestamp),不难理解了。69年都不会重复,既然只能使用69年,我们系统中的时间,是从1970年开始的,所以设计上,设。题,至少linux上,存在时间同步等产生的时间跳跃问题,在分布式环境中,如果事件发生回拨,这里解释了最终结果的构成,非常巧妙,综合了性能,变化点,生成了非常完美,不容易重合的一。这种设计,严重依赖服务器的时间,但是时间,不仅是哲学家的难题,也是计算机领域的一大难。

2024-04-21 08:47:14 1307 1

原创 垃圾收集器的分类

垃圾收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现:最基本、发展历史最悠久的收集器,曾经(在JDK1.3.1之前)是虚拟机新生代收集的唯一选择。它是一种单线程收集器,不仅仅意味着它只会使用一个CPU或者一条收集线程去完成垃圾收集工作,更重要的是其在进行垃圾收集的时候需要暂停其他线程。优点:简单高效,拥有很高的单线程收集效率缺点:收集过程需要暂停所有线程算法:复制算法适用范围:新生代应用:Client模式下的默认新生代收集器。

2024-04-21 08:20:34 341 1

原创 Java对象的内存模型

一个Java对象在内存中包含:对象头、实例数据和对齐填充三个部分。

2024-04-21 08:00:49 567 1

原创 深入理解Redis分布式锁

Redis分布式锁一句话理解:利用Redis的单线程及原子性命令的特征、加入过期时间避免死锁、加入守护线程续锁避免锁释放问题.

2024-04-20 21:55:02 775

原创 Redis持久化方式以及他们的区别?

如图,假设先在 T0 时刻做了一次快照(下一次快照是T4时刻),然后在T1时刻,数据块 5 和 8 被修改了,要是在T2时刻,机器宕了,那么只能按照 T0 时刻的快照进行恢复。很明显,配置为always时,每次写入都要同步AOF文件,在一般的SATA 硬盘上,Redis只能支持大约几百TPS写入,显然跟Redis高性能特性背道而驰,不建议配置。第一方面:频繁将全量数据写入磁盘,会给磁盘带来很大压力,多个快照竞争有限的磁盘带宽,前一个快照还没有做完,后一个又开始做了,容易造成恶性循环。

2024-04-20 21:33:24 1093

原创 TCP/IP四层、OSI七层的解释

1985 年国际标准化组织ISO指定了网络互联模型。:接受上一层的数据,在必要的时候对数据进行分割,并将这些数据交给网络层,保证这些数据段有效到达对端,如TCP传输控制协议、UDP数据报协议。:多种应用程序协议如HTTP、HTTPS、FTP、SOCKS安全套接字协议、DNS域名系统、GDP网关发现协议等。:不同机器上的用户建立和管理会话,如SSL安全套接字层协议、TLS传输层安全协议、RPC远程过程调用协议等。:控制子网的运行:逻辑编址、分组传输、路由选择,如IP、IPV6、SLIP等。

2024-04-20 06:16:02 136

原创 你对线程池如何理解?

A.判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。3.能提高线程的可管理性:线程是稀缺资源,无限制的创建的话,一定会消耗系统资源,还会降低系统的稳定性,使用线程池的话,可以进行统一的分配,进行调优和监控。C.判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。B.线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。

2024-04-20 06:01:56 372

原创 内存泄露导致内存溢出的排查方式

内存泄露导致内存溢出的排查方式

2024-04-20 05:46:11 271

空空如也

空空如也

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

TA关注的人

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