- 博客(220)
- 资源 (4)
- 收藏
- 关注
原创 从源码角度讲讲ReentrantLock及队列同步器(AQS)
JDK独占锁(排他锁)的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么大区别,但ReentrantLock相比synchronized而且功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。ReentrantLock与synchronized的区别:synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也
2025-01-17 20:55:31
1053
原创 秒杀业务设计
但流量组成却非常的混杂,这些请求中,一部分是刷子请求,一部分是无效请求(传参等异常),剩下的才是正常请求,这个的比例可能是6:1:3,所以需要我们在网关层尽可能多地接收流量进来,并做精确地筛选,将真正有效的3成请求分发到下游,剩余的7成拦截在网关层。对于秒杀活动,大家抢购的都是同一个商品,所以这个商品直接就被推到了热点的位置,不管你是用的数据库,还是分布式缓存,都无法支持几十万、上百万对同一个key的读写,以Redis的写为例,最高仅可支持几万的TPS。另一个是高并发引起的请求无序。
2025-01-17 20:22:18
869
原创 不知kafka如何保证消息有序性和可靠性?面试官:你出去吧!
1、为方便扩展,并提高吞吐量,一个topic的消息会被负载到多个partition2、配合分区的设计,提出消费者组的概念,组内每个消费者并行消费3、为提高可用性,为每个partition增加若干副本,比如上面的图中,topicA就被分成了3个分区,每个分区又配置了3个副本。4、ZK中记录谁是leader,Kafka2.8.0以后也可以配置不采用ZK.
2025-01-17 20:03:49
1067
1
原创 多线程编程
Java是支持多线程的编程语言,多线程是相对于单线程(单进程)而言的,传统的DOS系统是单进程的,同一时间段只允许一个进程执行,当出现病毒那么将导致整个系统瘫痪。多线程则允许同一个时间段多个程序轮流运行,轮流抢占CPU资源。一、进程与线程线程是在进程的基础上划分的更小的程序单元,线程是在进程的基础上创建并使用的,所以线程依赖进程的支持,但是线程的启动速度要比进程快许多,当时用多线程进...
2025-01-07 20:59:13
563
1
原创 什么是阻塞和非阻塞?什么是同步和异步?什么是BIO、NIO、AIO?
一、什么是阻塞和非阻塞?什么是同步和异步?1.1、阻塞与非阻塞阻塞与非阻塞是描述进程在访问某个资源时,数据是否准备就绪的的一种处理方式。当数据没有准备就绪时:阻塞:线程持续等待资源中数据准备完成,直到返回响应结果。 非阻塞:线程直接返回结果,不会持续等待资源准备数据结束后才响应结果。1.2、同步与异步同步与异步是指访问数据的机制,同步一般指主动请求并等待IO操作完成的方式。 异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知。老王烧开水:1、普通水壶煮水,.
2025-01-07 20:14:36
1954
1
原创 Netty
粘包问题是指发送方发送的多个数据包在接收方被合并成一个数据包接收。粘包问题通常发生在发送方发送的数据包较小且频繁的情况下。比如发送方发送了两个数据包A和B,数据包A的内容是"Hello",数据包B的内容是"World"。由于TCP是基于字节流的协议,接收方可能会将这两个数据包合并成一个数据包接收,内容为"HelloWorld"。粘包问题的原因主要有两个:1.发送方发送的数据包较小且频繁:当发送方发送的数据包较小且频繁时,TCP可能会将多个数据包合并成一个数据包发送,导致接收方接收到合并的数据包。
2024-12-29 23:45:27
1051
原创 Zookeeper 能干的事这么多?
确保数据在集群中的一致性,适用于对数据一致性要求高的场景。。Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。所以zookeeper可以看作是一个。文件系统指的是zookeeper可以存储数据,尽管数据量比较少(默认只有1M),但还是像文件一样可以存储的;
2024-12-29 00:03:45
772
原创 ClickHouse
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。在传统的行式数据库系统中,数据按如下顺序存储:处于同一行中的数据总是被物理的存储在一起。在列式数据库系统中,数据按如下的顺序存储:列式数据库总是将同一列的数据存储在一起,不同列的数据也总是分开存储。采用行式存储时,数据在磁盘上的组织结构为:行存储的好处是想查某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。
2024-12-28 16:50:29
1064
原创 Spark生态圈
join其实常见的就分为两类: map join 和 reduce join。当大表和小表join时,用map join能显著提高效率。将多份数据进行关联是数据处理过程中非常普遍的用法,不过在分布式计算系统中,这个问题往往会变的非常麻烦,因为框架提供的 join 操作一般会将所有数据根据 key 发送到所有的 reduce 分区中去,也就是 shuffle 的过程。造成大量的网络以及磁盘IO消耗,运行效率极其低下,这个过程一般被称为 reduce join。
2024-12-27 22:48:55
1478
原创 Hadoop生态
随着大数据技术的发展,Hadoop 已成为处理大数据的基础框架之一。它广泛应用于各类大数据处理场景中,如互联网日志分析、推荐系统、数据挖掘、机器学习等。Hadoop 的开源特性和强大的生态系统使其在全球企业中得到了广泛的应用,为大规模数据处理提供了强大的工具。Hadoop生态圈是一个更广泛的概念,它不仅包括Hadoop框架本身,还包括一系列与之相关的项目和工具,形成一个庞大的体系。
2024-12-27 15:58:21
1175
原创 关于 Hive 的必知必会
拉链,就是记录一个事物从开始,一直到当前状态的所有变化的信息。拉链表有数据的开始日期和结束日期,记录着数据的生命周期。拉链表通过增量表进行不断的更新。下面就是一张拉链表,存储的是用户购买商品的基本信息,另外也记录了每条订单的生命周期。下图展示订单号为1 的记录生命周期,我们可以很方便的使用这张表拿到最新的数据以及这条订单历史上的数据。拉链表另一个角度去说就是,同一个信息在同一个表里有多条记录,只是这个信息的时间或者状态不同。比如上面的订单ID=1的就有四条记录,每条记录对应当时的这个订单的某种状态。
2024-12-27 11:30:57
1151
原创 一看就懂:这就是机器学习过程!
大家印象中机器学习好像是很高深的东西,至少也是晦涩难懂的,这里就以一个线性回归的实现过程来讲解下,看完大家就会觉得机器学习真的没那么难懂!
2024-12-26 21:26:19
335
原创 Java后端面试场景题汇总
如此大的数据集进行去重(例如50亿数据条目),我们需要考虑内存和存储空间的限制,同时还需要有一个算法。一般来说,这样的数据量无法直接载入内存进行处理,因此需要采用磁盘存储和分布式处理的技术。将数据分为多个批次,每个可以加载到内存中。对每一批数据进行排序和去重,然后存回磁盘。对所有排序且去重后的批次进行归并排序,同时去重。使用哈希函数将数据分配到不同的桶(Bucket)或文件中,确保相同的数据项会落到同一个桶里。对每个桶的数据进行内存中去重操作。
2024-12-14 19:05:48
1423
原创 【一分钟搞懂】Maven依赖原则:最短路径和先声明优先 指的是啥?
你只需要在你的项目中以坐标的方式依赖一个 jar 包,Maven 就会自动从中央仓库进行下载,并同时下载这个 jar 包所依赖的其他 jar 包。项目中的jar包一般都不是独立的,会有互相依赖的情况,我们凭肉眼自己无法去判断某个jar包究竟依赖了哪些包,哪怕少一个jar包你的代码也跑不起来。而Maven 就可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来,程序员不用去了解某个jar到底还是否依赖其他jar包。是直接依赖,路径最短,那么。的依赖坐标,那么导入的就是。
2023-08-15 21:40:20
576
原创 虚拟线程详解
虚拟线程又叫协程。JDK19 中引入了虚拟线程,这是一个重大的更新项,虚拟线程在Project Loom项目中已经孵化很久了。据官方阐述,引入的原因是。允许通过 java.lang.ThreadAPI 的现有代码来使用虚拟线程,并且只做最小的更改。(当然虚拟线程不是Java语言独有的,更不是Java发明的,只是JDK19时才引入,比如Go语言的goroutines和Erlang语言早就支持虚拟线程了)各种语言争相引入虚拟线程的原因就是它能以简单的方式来提高系统并发性能。那么虚拟线程是怎么做到的?
2023-04-09 21:27:28
1678
1
原创 SpringBoot 和 Vue前后端分离在线工具项目实战,源码+超详细讲解
一、前言主要通过SpringBoot和Vue来实现一个前后端分离的在线工具平台,包含PDF转换、图片处理、文本处理、图表展示、二维码工具等功能。为了更直观展示项目效果,也给大家提供了在线体验地址:http://49.234.28.149, 源码资源见文末。通过此项目大家可以了解和学习到以下知识,包括但不限于:springboot + mybatis + mysql 等后端知识基础的前后端增删改查交互流程前端如何请求后端接口前端如何请求三方接口前端请求拦截器实现前端组件的封装&.
2022-08-31 09:14:09
3417
原创 响应式编程将成主流?啥是响应式编程?
一、响应式编程解决什么问题?Spring framework 5 最大的变化就是引入了响应式编程(Reactive Programming)。Spring 为啥要引入这个特性?八个字:“逆水行舟,不进则废”!在2009 年,微软提出了响应式编程,旨在应对高并发服务器端开发场景。随后各语言很快跟进,都拥有了属于自己的响应式编程实现,比如Go、Node 等新语言。Java 作为服务器端开发语言老大的地位受到了不小的挑战,后有追兵,不得不进化啊。所以,响应式编程的初心,就是去满足高并发下的服务器端开.
2022-05-09 19:15:35
1835
原创 面试官:你知道 LRU算法 —— 缓存淘汰算法吗?
常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来。缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据。常用淘汰算法有 LRU,LFU,FIFO。这篇文章我们聊聊 LRU 算法。一、LRU 简介LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓存容量的满时候,优先淘汰最近很少使用的数据。假设
2021-10-03 12:56:53
13290
1
原创 Redis的基本数据类型及其底层实现原理
最近去面试,面试官都会先问:Redis中有哪些数据类型?接着就会问你知道某个类型的底层实现么?现在一块来了解下。四、Redis支持的6种数据类型三种特殊数据类型:1.geospatial: Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。2.hyperloglog:基数:数学上集合的元素个数,是不能重复的。这个数据结构常用于统计网站的 UV。3.bitmap: bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状
2021-10-03 12:31:34
3346
3
原创 面试官:你了解一致性Hash算法吗?
面试官问这个问题不奇怪,可以说一致性Hash算法是分布式系统中的一个基石一样的算法,没有这个算法可能很多问题不太好解决。一、解决什么问题?先看看一致性Hash算法到底解决的是什么场景中的问题。假设有三台缓存服务器,用于缓存图片,这三台缓存服务器编号为0号、1号、2号。现在,有3万张图片需要缓存,这些图片被均匀随机的缓存到这3台服务器上,每台服务器能够缓存1万张左右的图片,以便它们能够分摊缓存的压力。但是如果这样做,当我们需要访问某个缓存项时,则需要遍历3台缓存服务器,从3万个缓存项中找到我们需要
2021-10-02 11:45:15
484
1
原创 备战大厂—— Leetcode 刷题(二叉树、三数和、回文子串、公共祖先、TOP K、栈与对列的互相实现等大厂常考算法 【56】 题)
最近面了京东(已拿offer)、百度(等待二面)、字节(二面挂)、蚂蚁金服(等待三面中),大厂都考了算法,一般算法占面试的20%,但是算法挂了希望就不大了(面试字节,面试官让手写代码的地方有两个:一个是手写静态内部类型的单例模式,这个写出来了,另一个就是全排列算法,没写出来,挂了),这里梳理总结下已经考到的算法以及常考的算法,不打无准备之仗!(给自己梳理的,就不对大家可见了,如果想看那就私信我!)
2021-10-01 23:26:40
267
原创 分布式限流方案
一、限流算法主要的限流算法包含:漏桶算法、令牌桶算法、计数器 。每种限流算法详细可以参考这里二、分布式限流方案一般也就分为三种:Gateway限流,redis+lua实现限流,nginx限流 。2.1 Gateway限流Spring Cloud Gateway 中提供了 RequestRateLimiterGatewayFilterFactory 类,这个是基于令牌桶实现的。它内置RedisReteLimiter,依赖于Redis存储限流配置和统计数据,也可以通过继承org.spri.
2021-09-24 18:09:03
923
原创 蓝绿发布?灰度发布?滚动发布?
一、概述应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。长期以来,业务升级渐渐形成了几个发布策略:蓝绿发布、灰度发布和滚动发布,目的是尽可能避免因发布导致的流量丢失或服务不可用问题。下面先大致介绍下三种发布形式。蓝绿发布项目逻辑上分为A、B组,在项目系统时,首先把A组从负载均衡中摘除,进行新版本的部署。B组仍然继续提供服务。当A组升级完毕,负载均衡重新接入A组,再把B组从负载列表中摘除,进行新版本的部署。A组重新提供服务。最后,.
2021-09-23 11:15:08
495
原创 Spring Cloud 核心组件协作及原理
SpringCloud不能只停留在使用的层面,其底层的很多原理也需要去知晓。业务举例:一、Eureka如上图所示,库存服务、仓储服务、积分服务中都有一个EurekaClient组件,这个组件专门负责将这个服务的信息注册到EurekaServer中。说白了,就是告诉EurekaServer,自己在哪台机器上,监听着哪个端口。而EurekaServer是一个注册中心,里面有一个注册表,保存了各服务所在的机器和端口号。比如订单服务里的EurekaClient组件,它会找EurekaS
2021-09-14 21:39:31
501
1
原创 分库分表 & 数据迁移方案
不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。1、IO瓶颈第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表 。第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库 。2、CPU瓶颈第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引
2021-08-08 21:10:30
378
原创 k8s相关
一、k8s是什么?请说出你的了解?Kubenetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的容器编排。K8S是Google公司推出的,它来源于由Google公司内部使用了15年的Borg系统,集结了Borg的精华。二、K8s架构的组成是什么?和大多数分布式系统一样,K8S集群至少需要一个主节点(Master)和多个计算节点(Node)。主节点主要用于暴露API,调度部署和节点的管理;计算节点运行一个容器运行环境,一般是docker环境(类似do.
2021-08-08 11:05:48
247
1
原创 SQL优化
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及 order by 涉及的列上建立索引。3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t
2021-08-05 23:03:49
183
原创 【八】多线程 —— AQS原理、ReentrantLock原理
一、AQS 框架简介AQS即AbstractQueuedSynchronizer是JUC(java.util .concurrent工具包的简称)里是一个用于构建锁和同步器的工具框架。Ok,它定性为一种框架,且是工具框架。那就是说,通过这个工具框架我们可以更方便的更便捷的去实现我们想要的功能,这里当然指的是多线程相关的功能。可以想想其他的框架Spring,Mybatis等是什么作用,类比一下。它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可.
2021-08-03 22:55:03
399
原创 【七】多线程 —— 线程池
池化技术有很多,比如线程池、数据库连接池、HTTP连接池等等。线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(创建的线程,实际最后要和操作系统的线程做映射,很消耗资源)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。一、自定义一个简单的线程池阻塞队列中维护了由主线程(或者其他线程)所产生的的
2021-08-03 19:33:43
448
1
原创 【六】多线程 —— 共享模型之不可变
如果一个对象在不能够修改其内部状态(属性),那么它就是线程安全的,因为不存在并发修改。比如类用 final 修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性。一、日期转换的问题SimpleDateFormat 不是线程安全的,可能出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果,例如:public class SimpleDateFormatTest { public static void main(String[] arg
2021-08-03 14:47:51
211
原创 【五】多线程 —— 共享模型之无锁
Java中 synchronized 和 ReentrantLock 等 独占锁 就是 悲观锁 思想的实现。管程即monitor是阻塞式的悲观锁实现并发控制。AtomicInteger 的内部并没有用锁来保护共享变量的线程安全,这是一种乐观锁的思想,说是锁实际没有锁,是一种无锁的实现。最重要的无锁方式就是CAS(还有volatile,适用于一写多读的场景),它使用原子操作来保证线程访问共享资源的安全性,相对于悲观锁思想的synchronized,reentrantLock来说, CAS的方式效率会更好!
2021-08-03 12:52:19
299
原创 【四】多线程 —— Java内存模型
一、Java内存模型JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受线程上下文切换的影响可见性 - 保证指令不会受cpu 缓存的影响有序性 - 保证指令不会受cpu 指令并行优化的影响主要是从Java的层面进行了抽象和封装,使得开发人员不用直接面对底层操作。1.1 可见性保证指令不会受cpu 缓存的影响。【退不出的循环】先来看一个现象,m.
2021-08-02 23:00:32
797
1
原创 【一】多线程 —— 基础概念
一、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士等)线程一个进程之内可以分为一到多个线程。一个线.
2021-08-01 23:24:05
393
1
原创 【二】多线程 —— 共享模型
引子两个线程对初始值为 0 的同一个变量分别做自增和自减,各执行5000次,这个变量结果还是不是0?public class AddMinus5000TimeEach { static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i =
2021-08-01 20:16:05
569
springboot项目linux系统下 通用 启动脚本
2022-07-10
spring boot + Vue 实现汽车销售管理系统
2022-07-10
spring boot + Vue 实现汽车销售管理系统
2022-07-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人