- 博客(195)
- 资源 (1)
- 收藏
- 关注
原创 平衡二叉查找树和多路查找树
红黑树也是一种平衡二叉树,但是定义不同,红黑树要求是:每个节点要么是红色节点要么是黑色节点,叶子节点都是黑的,如果节点是红的,那么子节点一定是黑色的,不可以出现连续的红节点,可以出现连续的黑节点,任何子树的黑节点个数需要保证相同。定义一个m阶的树,要求每个节点都只能包含m-1个节点,也意味着每个节点只能有m-1个子节点,同时也要满足平衡树的定义,左右子树高度差不能大于1,但是全量数据只存在叶子节点,非叶子节点只存关键检索数据。缺点:当进行删除节点和新增节点,树进行自平衡的时候,需要频繁树旋转,性能比较低。
2024-07-03 21:45:18 336
原创 redis实用技能
MoreKey问题指的是redis中有百万key value对,或者list set zset hash中有大量元素,一次使用key * 之类的命令,获取数据量太大的问题,可能导致redis卡顿,导致数据库雪崩指的是 string类型 的value 值大于10k, hash,list,set,zset元素个数超过5000。
2024-07-03 17:46:30 258 1
原创 mysql实用技能
幻读:两个事务非操作同一条数据,一个事务使用非等值查询,比如范围查询,另外一个事务在这个范围插入数据并且提交,那么之前范围查询会查询出之前没有的记录,被称为幻读(幻读只针对新出现的记录,比如老的记录被删除了,只能称作不可重复读)不可重复读:两个事务或者以上同时操作一条数据时候,一个事务读取数据,另外其他事务一直修改这条数据并且提交了,那么每次读到的数据都不一样,读到的确是是真实的最新数据,那么又叫不可重复读。(原子性,隔离性,持久性,最终都是体现在一致性上,都是为一致性服务的)
2024-07-03 17:42:35 90
原创 Elasticsearch实用技能
1.通过客户端写入的数据先缓存在memory buffer,在没有refresh到segment文件之前,这个数据是还没正式生效的,refresh间隔时间是一秒,所以一般数据是有一秒的延迟的。4.倒排索引: es对于文档的存储是使用倒排索引的,每个数据写入前,先使用分词器进行分词,然后加入到倒排索引中,这个对于全文检索非常重要,是全文检索功能的核心体现。5.分片-shard: es每个索引存储在多个分片上的,分片又分为主分片和副分片,主分片负责读写,副分片负责读。quorum:默认值。
2024-07-03 17:34:52 676
原创 消息队列-kafka提交offset问题
说明:转载本人掘金文章概述offset是相对Consumer来说的,offset是用来帮助记录某个主题某个分区的消费情况的。当你每提交一次offset,意味着向kafka汇报一次消费进度,对于提交offset所以又分为同步和异步提交同步和异步提交offset对比同步提交:1.每次处理完一条消息,然后调用consumer.commitSync()提交offset2.在调用consumer.commitSync()方法时候会堵塞住,严重影响消费者性能3.每次提交都会向__consumer_offs
2022-05-18 14:00:53 4062 4
原创 消息队列-kafka关于CommitFailedException问题
说明:转载本人掘金文章概述提交offset失败这个异常也是我们开发中常见的异常,那么这个异常是怎么引起的呢?只要我们明白原因,那么就能避免,特别是在异步提交情况下(offset丢失),导致重复消费,消息一直卡在最后一批,导致业务数据受到严重的破坏。了解消费者实例机制1.kafka消费者都是按照批量消息拿过来消费的,因为发送也是批量的,这样可以提高kafka性能2.kafka中消费者有个参数max.poll.interval.ms(获取下一批消息间隔时间),如果上一批还没在这个事件之内处理完,那么k
2022-05-17 16:12:25 970 2
原创 消息队列-kafka消费异常问题
说明:转载本人掘金文章概述在kafka中,或者是说在任何消息队列中都有个消费顺序的问题。为了保证一个队列顺序消费,当当中一个消息消费异常时,必将影响后续队列消息的消费,这样业务岂不是卡住了。比如笔者举个最简单的例子:我发送1-100的消息,在我的处理逻辑当中 msg%5==0我就进行 int i=1/0操作,这必将抛异常,一直阻塞在msg=5上,后面6-100无法消费。下面笔者给出解决方案。重试一定次数(消息丢失)@KafkaHandler @KafkaListener(topics = {
2022-05-17 16:11:26 2061
原创 消息队列-kafka如何处理消息堆积问题
说明:转载本人掘金文章概述如何处理消息堆积问题? 这个问题也是经常面试被问到的问题。除此之外当然是有实际应用场景的。笔者在公司就碰到消息堆积问题,笔者公司是做流量监控防网络攻击的,因此需要对路由器所有流量进行处理和风险过滤,你可以想象一个公司的流量数据,公司员工只要在使用电脑就有进出流量,我们就要对每个请求进行处理。除此之外,我见过一些常见错误处理消息堆积问题的方式也分享给大家。增加分区同时增加消费实例kafka中一个消费组内的一个消费者线程只能对应一个主题内的一个分区进行消费,也就是说如果你单独增
2022-05-17 16:10:17 5201
原创 消息队列-kafka消息丢失问题
说明:转载本人掘金文章概述消息队列丢失消息是个经典的问题,也是我们在开发当中容易忽略的问题,最重要是面试当中必考题。消息队列总体上分为三部分:生产者(Producer),消费者(Consumer),消息队列服务端(broker)。不幸的是在使用不当情况下,三个环节都有可能丢失消息,今天我们就来讨论下为什么会丢消息,以及丢消息的解决方案。producer丢失消息问题Producer的作用是向Broker发送消息的。例如在这样一个场景: Producer已经向Broker发送了一条消息,在消息传输到Br
2022-05-17 16:09:26 605
原创 分布式系统CAP理论到BASE理论落地
说明:转载本人掘金文章CAP理论1.Partition tolerance指的是一个分布式系统不能因为多个网段的其中一个网段出现问题,而导致整个分布式的一致性和可用性得不到保证,也就是支持分区容错是一个分布式系统的前提和基础,否则不被称为分布式系统。保证分区容错的言外之意就是,如果你的系统是个分布式系统,那么你的服务节点一定是多副本并且副本节点分布在任意网段的,这是作为一个分布式系统的基本要求。2.Availability指的是分布式系统对于一个任意用户请求,需要在用户预期内得到系统的响应。这里如果没
2022-05-17 16:00:18 423
原创 多线程编程重新认识ReentrantLock
说明:文章转发自本人掘金文章概述ReentrantLock是我们常用的单机锁,可以帮助我们正确同步多线程代码。ReentrantLock是基于AQS实现的,我们可以看看ReentrantLock是怎么基于AQS实现锁机制的。ReentrantLock原理NonfairSync实现1.lock方法(获取锁)a.线程A先获取锁,获取成功,直接运行同步代码(获取锁的线程在head节点)b.线程B,C获取锁发现锁状态已经改变,那么加入到队列中,并且线程被park2.unlock方法(释放锁)a
2022-05-17 15:58:13 206
原创 多线程编程重新认识Volatile & synchronized
说明:转载本人掘金文章 https://juejin.cn/post/7082242009242550285as-if-serial语义as-if-serial语义初衷是为了提高指令执行速度(指令执行顺序优化),大概语义是保证在单线程情况下可以允许多个指令在没有数据依赖的情况下可以进行指令重排。数据没有依赖public static void test3(){ int a=0,b=0; a=1; //和b=1没有数据依赖 b=1; //和a=1没有数据依赖}这种情况
2022-05-17 15:54:00 132
原创 kafka就多方面理论实践总结
说明:转载本人掘金文章 https://juejin.cn/post/7094074279477641246分区立论实践总结理论1.从架构上来说,分区可以达到系统伸缩的目的。增加节点,增加分区,提高整个系统的生产,消费,服务端吞吐量。2.每个分区都是一个消息集合,都是有顺序的。3.消息决定放入哪个分区,可以自己去选择相应的分区策略或者自定义一些自己的分区策略。kafka自带了三种分区策略,分别是:轮询,随机,key有序(key的hash一致特性),默认是轮询,适合大部分场景。实践1.业务中有需
2022-05-17 15:45:05 290
原创 JVM内存调优总结(JDK8)
说明:转载本人掘金文章 https://juejin.cn/post/7094613544687108126内存分配查看内存分配情况1.查看堆总内存 jinfo -flag MaxHeapSize vmid2.查看新生代内存 jinfo -flag NewSize vmid3.查看老年代内存 jinfo -flag OldSize vmid4.查看使用的垃圾收集器 jinfo -flags vmid5.查看元空间(方法区)内存 jinfo -flag MetaspaceSize(MaxMet
2022-05-17 15:42:26 1578
原创 JVM关于CMS和G1垃圾回收器总结
说明:转载本人掘金文章 https://juejin.cn/post/7095305190420512781CMS1.使用的是标记清除算法,对老年代的回收器2.初始标记,标记的是GC Roots的对象,会STW,时间很短3.并发标记是进行标记GC ROOTS关联的对象,时间可能比较长,但是不影响用户线程使用4.重新标记是对并发标记的补充,因为并发标记阶段,用户程序还在运行,其实是个修正过程。5.并发清理,直接多线程清理掉不在GC ROOTS的对象,回收结束总结:缺点:1.使用标记清除算
2022-05-17 15:40:14 2371
原创 Elasticsearch整体架构解析总结升级版
总体架构图1.整体上看一个es集群,一个es集群由多个节点组成2.es一个数据索引由多个分片组成,并且分布在es各个节点中3.es分片又由P(主)分片和R(副)分片组成4.主分片可以读写,副分片只能提供读的功能5.索引一创建,主分片不可改变(参考数据路由算法),副分片可以增加或者减少单个分片架构图1.一个分片内部包含几种文件,segment,commit point,translog,.del文件2.segment可以理解为一个倒排索引,数据全部存在里面,并且是倒排索引结构(索引即数据)
2022-04-03 18:34:45 3913 4
原创 JVM常用工具总结
jps(查看JVM进程基本信息)1.jps 查看所有jvm进程(显示进程id和执行的java入口类)2.jps -m 查看jsp数据+main方法参数3.jps -v 查看jvm启动参数(堆大小,使用编码等)jstat(监视虚拟机各种运行状态信息)jstat -<option> [-t](jvm运行时间) [-h<lines>](多少行重新打印头) <vmid> [<interval>(打印间隔时间) [<count>(打印次数)]]1
2022-04-03 18:31:27 819
原创 JVM关于内存回收总结
theme: channing-cyan概述JVM内存回收,我将从以下几方面分析。分别是回收的区域,回收的数据,回收的依据,回收的算法,常见垃圾回收器来彻底聊一下这个问题。回收的区域1.JVM内存模型分为线程共享和线程独享2.线程独享内存生命周期是等于线程的生命周期,是不需要回收的3.线程共享的内存生命周期是和JVM进程相同的,是需要回收的回收的数据堆回收1.当我们new一个对象或者数组的时候,其实就会将对象和数组的内存分配在堆上2.当堆上数组和对象已经不需要的时候,这些对象和数组.
2022-04-03 18:29:43 1138
原创 缓存一致性问题三种解决方案附上代码
概述缓存一致性问题也是使用缓存中比较经典的问题之一。使用缓存,涉及数据库和缓存两部分数据的维护,既然是两个组件的数据,那么必然有数据一致性问题。常用的解决方案有三种,分别是设置过期时间,先更新数据库,再删缓存,先删缓存,再更新数据库。吗,设置过期时间代码示例1.查询数据@RequestMapping("/cache/db/{userId}")@GetMappingpublic User getUser(@PathVariable Integer userId){ //查询缓存
2022-04-03 18:28:04 1679
原创 布隆过滤器解决缓存穿透方案附上代码
概述缓存击穿,大家多多少少听说过。那么这个问题到底是个什么问题?怎么解决呢?这个问题其实是在高并发场景下,使用缓存提高访问速度,一些非法访问或者说攻击刻意绕过缓存,来直接攻击我们数据库。导致我们缓存形同虚设,并没有起到缓存效果。这个问题解决的根本就是过滤掉非法请求,只允许访问合法数据即可,而布隆过滤器就是用来过滤非法请求的,能达到我们预想的效果。布隆过滤器原理原理图1.首先会初始化一个全0比特位的数组,这个数组长度取决于用户期望存储数据的个数size,以及用户期望的误判率fpp,根据用户size
2022-04-03 18:26:46 1263
原创 Elasticsearch业务常用21种语句操作附Java Api代码
概述我们操作数据习惯使用sql语句,对于非sql语句的数据库中间我们肯定使用得很不习惯.今天我要说的就是Elasticsearch,经常写过的一些语句,可能就忘记了,特别是写一些复杂查询的时候,更是到处百度资料,很是烦人.因此,我特地花了大量时间进行总结(包括 json格式语句和对应java api编写)配置<dependency> <groupId>org.springframework.boot</groupId> <artifactId&
2022-03-11 12:58:58 2690
原创 spring源码分析事件原理图文详解
概述说到事件,大家多少都是首先想到消息中间件,比如kafka,rabbitmq等。spring中也支持事件,分为事件发送和时间监听。spring事件机制原理本质其实就是调用事件发送方法,然后直接回调容器中listener对象。说到这里,大家应该明白,spring事件机制是依赖于当前容器的,说明白点就是一个单机版事件机制。那么使用场景也就是spring容器生命周期的事件应用。参考资料1spring源码分析容器整个生命周期图文详解2spring源码分析AOP原理图文详解代码示例//定义事件发布器@
2022-02-18 13:18:06 1277 5
原创 spring源码分析AOP原理图文详解
概述spring aop是spring特性之一,大部分情况下,我们使用aop特性都是想对功能方法的增强。想要透彻了解aop原理,最好需要提前了解两块内容,一个是java两种动态代理的实现,一个是spring容器初始化bean原理。参考资料1 spring源码分析容器整个生命周期图文详解2java两种实现动态代理方式sping使用aop代码示例//1.开启aop@EnableAspectJAutoProxy@Configurationpublic class MyConfig {}//
2022-02-17 20:23:56 1066
原创 spring源码分析容器整个生命周期图文详解
注册Bean1.注册bean包括bean信息解析,容器创建,注册bean到容器中三部分2.bean信息解析,会将xml,注解,配置类等信息转换为BeanDefinition,加入到Bean工厂3.这部分我们重点关注的是BeanFactoryPostProcessor,这是spring容器留给我们扩展用的, 在容器初始化之前可以添加我们自定义的一些东西,最常见的就是添加bean的注册信息. 4.这部分会提前初始化BeanFactoryPostProcessor和BeanPostProce
2022-02-14 23:54:47 804 2
原创 nginx安装配置总结
nginx安装1.安装nginx https://www.runoob.com/linux/nginx-install-setup.html2.如果需要代理mysql,redis之类的,编译安装nginx时需要--with-stream 举例 ./configure --with-stream --with-pcre=../pcre-8.353.比较熟悉情况下,推荐docker安装nginx常用命令1.nginx -version //查看版本2.nginx //启动3.nginx
2022-01-27 19:44:27 3222 1
原创 Elasticsearch集群环境搭建(Dcoker)
创建networkdocker network create elasticsearch_network安装Elasticsearch1.安装node1docker run --name elastic-node1 \ --net=elasticsearch_network \ -p 9200:9200 \ -e ELASTICSEARCH_CLUSTER_NAME=elasticsearch-cluster \ -e ELASTICSEARCH_CLUSTER_HOSTS=ela
2022-01-27 19:43:34 1433
原创 Elasticsearch重建索引
概述很多情况下,Elasticsearch是需要重建索引的. 比如主分片数量想修改,加了keyword类型等.操作步骤1.首先创建一个新索引,结构一致PUT /myindex_new{ "settings": { "number_of_shards": 2 , "number_of_replicas": 0 }, "mappings": { "properties": { "name":{ "type": "keyword"
2022-01-27 19:42:50 2748
原创 linux防火墙命令
1.查看开放端口 firewall-cmd --list-all 2.开放端口 firewall-cmd --add-port=8080/tcp --permanent 3.加载防火墙 firewall-cmd --reload
2022-01-24 23:24:47 1545
原创 mysql使用redo日志实现事务持久性
概述前面提到,为了减少io操作,加载的数据页先会放到Buffer pool,等到刷盘时机,才会真实将页数据刷到磁盘进行持久化.假设修改好的脏页,在事务已经提交的情况下,突然断电,那么修改的脏页就丢失了,这样没办法保证事务的持久性.这个时候redo日志就派上用场了.redo日志原理1.当执行一条写语句时候,首先会加载到Buffer pool的缓存页中,然后修改页中数据,加入到 flush链表中,我们知道如果这个时候断电,数据其实在只是内存中改了,会导致数据丢失, 这个修改后的脏页再也无法恢复出
2022-01-14 23:10:37 518
原创 mysql中的Buffer Pool
概述innodb存储引擎加载数据是按照页单位来加载的。当我们对一张表做增删改查的情况下,mysql会查找对应的表空间,根据索引找到段,根据段找到页或者区,然后将16k整页数据加载到内存,然后修改页中的记录,保存到磁盘。其实真实情况不是这样,最后一步并不是马上写回磁盘,而是先写到Buffer Pool中,等到了一定时机,才会统一刷盘的,这样mysql可以节省一些io操作,特别是操作频繁的热点数据。也就是说数据修改是暂时写到内存(Buffer Pool)的,其实会存在持久性问题,后续讨论redo,undo日志
2022-01-12 22:14:16 828
原创 mysql查询优化器对sql执行成本的估算
概述mysql中,有个查询优化器,是专门用来估算查询语句的成本的,然后选择一个mysql认为成本最低的方案进行执行。今天我们来了解一下常见查询sql语句的成本是怎么估算的,mysql依据是什么?估算准备知识点1mysql估算基于哪些数据a.mysql既然要估算查询成本,那么必然要进行一些计算,就像我们要去一个地方,想要知道要多久一样。 计算公式是路程除于速度。不同交通工具速度不一样,不同路线总路程也是不一样的。 b.mysql有类似于上面的数据存在。mysql每张表都有统计信息,使用命令S
2022-01-09 15:29:45 713
原创 mysql两表连接原理(搞懂join buf)
概述一般情况下,我们使用mysql都是使用两种查询比较多,一个是单表查询,一个是多表连接。多表连接原理还是很重要的,特别是对查询优化这块的理解。从表空间层面来看,多表都不在一个表空间,那么可想而知这个是不是更加需要考虑优化,更加需要知道其中的原理。原理1.正常情况下表连接1.两张表 stu 和stu_score,也就是一张记录学生基本信息表,一张记录学生成绩表2.现在需要join 两张表,假设 on 条件为 stu.id=stu_score.stu_id作为连接条件 3.基于stu作为驱
2022-01-08 11:49:14 1303
原创 mysql单表访问方法
概述所谓的访问方法就是你想查出一堆数据,然后把sql丢给mysql,然后mysql根据你的表情况(索引,数据量,查询成本),给出mysql自己认为最优的执行方式,这就是访问方法。mysql给这些执行方法取了独立名字,分别是:const,ref,ref_or_null,range,index,all,index merge等值查询(单字段单值)(走单个索引)1.const方法select * from user where id=? //id是主键(聚簇索引)select * from user
2022-01-04 23:59:58 544
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人