自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吒哇

欢迎大家随时关注我,我会定期写一些技术分享

  • 博客(243)
  • 资源 (1)
  • 收藏
  • 关注

原创 浅谈 JVM GC 收集器--系列(一)

目前JVM主流的GC收集器有 Serial、Parallel 、CMS、G1,以及比较新的 ZGC和 Shenandoah, ZGC是 jdk 11中推出的垃圾回收器, 以及jdk17中的仙纳度Shenandoah 回收器。具体又分为分代收集器和跨代收集器, 传统的收集器都是基于分代收集的,一般又被分为新生代和老年代收集器新生代有:1、Serial2、ParNew老年代有:2、CMSG1属于跨代收集,既可以回收新生代、又可以回收老年代,这种一般称为Mixed GC。

2023-11-20 16:38:09 516

原创 类加载器(classloader)

是内嵌于JVM的,在双亲委派模型基础上,任何类加载任务都会交由 bootstrap classloader 这位大佬经手过目一次,只要是核心类库中的类,都会被 bootstrap classloader 加载,间接确保核心类库不被其他类加载器加载。SPI 的调用方和接口定义方很可能都在 Java 的核心类库之中,而实现类交由开发者实现,然而实现类并不会被启动类加载器所加载,基于双亲委派的可见性原则,SPI 调用方无法拿到实现类。这不禁思考,这么多类加载器之间是怎么协调类加载任务的?

2023-11-15 15:32:56 149

原创 记一次线上问题引发的对 Mysql 锁机制分析

本文以一个线上问题为背景,对 Mysql 中的各种锁机制进行了详细的总结,分析了各个锁的加锁时机和具体使用场景,其中特别要注意间隙锁的使用,因间隙锁和间隙锁之间不互斥,当多个事务之间并发执行时很容易形成死锁。

2023-11-13 15:24:48 221

原创 MySQL常见面试题汇总(建议收藏!!!)

【精选】MySQL常见面试题汇总(建议收藏!!!)_mysql面试题_<一蓑烟雨任平生>的博客-CSDN博客

2023-11-10 11:23:37 75

原创 缓存与数据库双写一致性几种策略分析

对于每种方案策略,各有利弊,但一致性问题始终存在(文章开头排除了原子性和锁),只是发生的几率在一点点慢慢变小了,方案的评估不仅要根据自身系统的业务场景,如读写比、并发量、一致性容忍度,还要考虑系统复杂度,投入产出比等,寻找最合适的方案。

2023-11-10 10:59:47 445

原创 Mysql 和 Redis 数据如何保持一致

Read Through 和 WriteThrough 的流程类似,只是在客户端查询数据A时,如果缓存中数据A失效了(过期或被驱逐淘汰),则缓存会同步去数据库中查询数据A,并缓存起来,再返回给客户端。可见,最后缓存中的数据A和数据库中的数据A是一致的,理论上可能会出现一小段时间数据不一致,不过这种概率也比较低,大部分的业务也不会有太大的问题。可见,最后缓存中的数据A跟数据库中的数据A是不一致的,缓存中的数据A是旧的脏数据。客户端1 更新缓存中数据A,缓存同步更新数据库中数据A,再返回结果。

2023-11-10 10:45:04 207

原创 高并发查询结果一致性设计实践

物流合约中心是京东物流合同管理的唯一入口。为商家提供合同的创建,盖章等能力,为不同业务条线提供合同的定制,归档,查询等功能。由于各个业务条线众多,为各个业务条线提供高可用查询能力是物流合约中心重中之重。同时计费系统在每个物流单结算时,都需要查询合约中心,确保商家签署的合同内容来保证计费的准确性。本文主要分析了面对高并发调用的调用场景设计及的技术方案,在引入缓存的同时,也要考虑实际的调用入参及结果,面对增加的网络请求,是否可以进一步减少。

2023-11-10 09:51:00 62

原创 分布式事务,你了解多少?(上)

分布式事务的产生,源自互联网、电商等的发展,当同一个系统不同模块不同业务的数据在一个存储设备里,随着业务的发展,系统逐渐满足不了业务的发展时,常用的手段就是“拆”,拆的手段有垂直拆分和水平拆分,针对业务模块和数据库存储,都可以进行垂直拆分和水平拆分。AP向TM发起commit请求,TM向RM发送prepare,当TM收到所有的RM返回的ok消息后,TM再向所有的RM发送commit指令,待收到所有的RM返回的ok消息后,commit才算完成。刚性分布式事务遵循XA协议,通过实现XA的接口来实现分布式事务。

2023-11-09 19:41:11 68

原创 分布式事务的华丽进化

说到分布式事务,大家并不陌生。之前我已做过相关的总结(连接附本文后面),不过比较偏理论。在实际工作中,用得比较多的还是柔性分布式事务,今天主要把在工作中运用到的几种柔性分布式事务的场景及实现方式做一个简单介绍,也可以看做是柔性分布式事务的一个演进过程。。

2023-11-09 19:36:45 61

原创 库存预占架构升级方案设计-交易库存中心

伴随物流行业的迅猛发展,一体化供应链模式的落地,对系统吞吐、系统稳定发出巨大挑战,库存作为供应链的重中之重表现更为明显。近三年数据可以看出:接入商家同比增长37.64%、货品种类同比增长53.66%货品数量同比增长46.43%、仓库数量同比增长18.87%通过分析过往大促流量,分钟级流量增长率为75%,大促仓内反馈三方订单下传不及时,库存预占吞吐量和性能是导致订单积压因素之一。

2023-11-09 14:19:09 602 1

原创 解密Elasticsearch:深入探究这款搜索和分析引擎

除了tip,nvd(norms),dvd(doc values), tim(term dictionary),cfs(compound)类型的文件都是由mmp方式加载传输,其余都是nio方式。但是它的参数是无状态的,始终会针对对新版本的搜索器进行解析。es的持久化分为两部分,一部分类似快照,把文件缓存中的segments 刷新(fsync)磁盘。如既是20-25岁的喜欢电商社交的男性,又是北京市喜欢撸铁的男性。写入时使用线程池来做,注意使用的阻塞队列的大小,还要选择适的拒绝策略(这里不需要抛异常的策略)。

2023-11-08 14:49:27 204

原创 Spring的缓存机制-循环依赖

这实际上涉及到 AOP。否则,注入的就是一个原始对象,而不是代理对象。答案:三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A,B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A放到一级缓存中。

2023-11-08 14:22:40 120

原创 springboot初始化

Bean是什么,Bean是特殊的对象,交由Spring管理的Java对象,这类对象在创建的时候会根据spring的一些注解,和IOC,属性如果使用@Autowired的话,会自动赋值。Bean和对象的区别是:bean是spring拖管的,里面的属性也是有值的,对象的话直接new 里面的属性是空的,bean是特殊的对象,spring会对单例Bean进行缓存。。

2023-11-06 17:53:16 213

原创 大厂的 Git 代码管理规范是怎样的?

master 为主分支,也是用于部署生产环境的分支,需要确保 master 分支稳定性。•对于工作量小的功能开发(工时小于 1 天),可以直接在 devolop 分支进行开发,否则由 develop 分支检出 feature 分支进行开发,开发完后合并到develop 分支。使用祈使句,首字母不要大写,结尾无需添加标点。线上出现紧急问题时,需要及时修复,以 master 分支为基线,创建 hotfix 分支。•feature 分支、hotfix 分支在合并后可以删除,避免分支过多,管理混乱。

2023-11-03 17:17:07 125

原创 Git代码合并流程规范

2023-11-03 16:59:14 102

原创 《ElasticSearch易筋经》

建议 单节点分片数量=索引总分片数 / 数据节点数 + 2,这可让您的索引的分片均衡的调度到不同的数据节点,您可以通过设置index.routing.allocation.total_shards_per_node参数来进行控制。:ES有强大的查询能力,但是复杂查询会消耗磁盘、CPU资源,不同查询线程直接会相互影响,请配置合理的超时,准备降级预案,避免ES性能变差严重影响您的业务。:单个索引的数据量不超过500G,索引的一个分片数据量不超过50G(单分片文档数超过21亿会导致服务异常)。

2023-11-02 16:56:02 99

原创 Java表达式引擎选型调研分析

首先,规则引擎有一定的学习成本,即使开发人员使用也需要进行专门的学习,更何况没有任何编程背景的业务人员,其次,其实现的复杂度也高,如果业务规则复杂,规则制定者对规则引擎内部隐藏的程序流程不了解,很可能会得到意想不到的结果,最后,有些规则引擎还存在性能瓶颈。JSEL是一个兼容 JavaScript 运算规则的简单的表达式解释引擎,你可以通过Map接口,或者JavaBean给出一个变量集合,能后通过表达式从这个集合中抽取变量,再通过表达式逻辑生成你需要的数据。Fel是轻量级的高效的表达式计算引擎。

2023-11-02 16:27:26 131

原创 索引失效的场景有哪些?

虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引这种情况会被认为还不如走全表扫描。我们在设计数据库表时,应该尽力避免NULL值出现,如果非要不可避免的要出现NULL值,也要给一个DEFAULT值,数值型可以给0、-1之类的, 字符串有时候给空串有问题,就给一个空格或其他。

2023-11-02 16:11:39 88

原创 一文全览各种 ES 查询在 Java 中的实现

而filter是先判断是否满足查询条件,如果不满足会缓存查询结果(记录该文档不满足结果),满足的话,就直接缓存结果,filter不会对结果进行评分,能够提高查询效率。searchSourceBuilder.query(QueryBuilders.termsQuery("sect.keyword", Arrays.asList("明教", "武当派")));searchSourceBuilder.query(QueryBuilders.termQuery("sect.keyword", "明教"));

2023-11-02 15:29:49 796

原创 高并发场景下的一些日志实践

如何打印出精简、便于线上排查问题的日志,是一门艺术,不在本文的篇幅中。本文主要讲一些跟性能相关的日志实践。在高并发场景下,业务日志往往是应用性能的一大杀手。这么说大家可能没有概念,那么看一个实际的案例。可以看Promise面向零售结算页的某个核心应用A压测过程中的火焰图:从火焰图可以看出:该应用的CPU消耗大头是Log4j日志,CPU%消耗占比超过了50%。再参考磁盘写速度,MDC分钟级平均后的数据:峰值磁盘写速度接近100Mb/秒;

2023-10-27 17:42:35 291

原创 【转载】双亲委派模型

双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如 JNDI 和 JDBC 不能通过这个规则进行加载,它需要通过打破双亲委派的模型的方式来加载。

2023-10-26 19:49:17 94

原创 小白学java--垃圾回收机制(Garbage Collection)

垃圾回收的执行过程会导致一些额外的开销,例如扫描和标记对象、回收内存空间等操作。这些开销可能会导致一定的性能损失和延迟。因此,在压测的过程中,在发生gc的时间段,cpu和tp99值都比较高。

2023-10-20 18:32:37 443

原创 架构师日记-33个常见编码漏洞大揭秘

在软件编码的过程中,经常会遇到各种棘手的问题和挑战:•高并发、大数据引起的性能问题;•SQL注入、跨站脚本攻击的安全问题;•协议、编码的规范设计问题等;本文就从最常见的性能、安全和设计等几个维度来探讨这些问题。通过分享日常踩过的“坑”以及各种填“坑”经验,普及一些知识点,也助力研发少走一些弯路。本文介绍了开发过程中常见的30多种编码漏洞,主要包括以下几类:•并发,线程池,大数据等设计不当,影响性能的场景;•SQL注入,XSS,XSRF等恶意攻击的场景;•不恰当设计和编码导致的各种异常的场景;

2023-10-19 20:21:09 154

原创 缓存相关问题

对于缓存,我们主要关心两个:缓存的命中率,数据的一致性。由此又会有一些缓存引起的问题,缓存击穿、穿透、雪崩。对于这些问题也是我们在使用缓存时不得不考虑的。这些问题的解决方案也有很多。这里简单列举几个:(1)针对无效数据穿透,多级拦截:无效数据,空数据,进行多种手段拦截,如布隆过滤器、业务参数有效性判断、缓存空值等等。多种手段拦截就是让流量最后无法穿透到最薄弱的底层服务。

2023-10-19 20:17:04 580 1

原创 JVM垃圾回收

JAVA同C++一个主要的区别便是JAVA的垃圾回收是交给JVM来管理的,而不是人为的手动释放。想要认识JAVA的垃圾回收机制,我认为要从以下三个问题出发:接下来我们依次回答上述三个问题?

2023-10-09 14:32:32 50

原创 Git学习总结

23

2022-12-19 14:47:32 363 1

原创 优秀的代码片段

2022-12-19 14:45:33 120

原创 Java内存模型(Java Memory Model,JMM)

一、导言多线程、高并发问题相信是每一位从事Java研发工作的程序员都不可回避的一个重要话题。从启动一个线程,到使用volatile,synchronized,final关键字,到使用wait(),notify(),notifyAll(),join()方法,再到编写复杂的多线程程序,不知道大家有没有思考过这样一个问题,为什么要使用这些API,或者说这些API到底给编程人员提供了什么样的保证,才使得在多线程环境下程序的运行结果能够符合预期。它就是Java Memory Model(后续简称JMM)。本文

2021-12-02 13:44:44 212

原创 敏捷开发下的Git工作流应用实践

1 背景在我们日常工作中,协同开发是最高效的一种方式,尤其是比较大的需求点以及功能,甚至是新项目的开发。这种情况下,Git的使用无可避免的也会出现一些问题。而在计算机技术发展到今天的同时,协同开发工具也不断进步着,向我们熟知的SVN和Git,本身就是成熟的协同开发框架。尤其是GitFlow工作流模式,更是一度被许多公司奉为协同开发的典范并纳入开发规范中。那么,今天就说一下敏捷开发过程中,我们应该使用怎样的工作流模式才能更高效的完成开发工作呢?2 传统的GitFlow工作流模式介绍一下Gi...

2021-12-02 13:42:33 745

原创 垃圾回收器-ZGC的设计思路

1 ZGC介绍ZGC收集器(Z Garbage Collector)是由Oracle公司研发的。2018年创建了JEP 333将ZGC提交给OpenJDK,推动其进入OpenJDK11的发布清单中,zgc是一款可拓展的低时延,为实现以下几个目标而诞生的垃回收器:- 停顿时间不超过10ms- 停顿时间不会导致堆大小增长- 堆大小范围可支持几G到几Tzgc的标签:- 与Shenandoah和G1一样,ZGC也采用基于Region的堆内存布局。- ZGC的Region具有动态性...

2021-09-15 14:31:30 244

原创 网络IO模型核心原理介绍

1 socket四元组与其对应的文件描述符的关系介绍客户端和服务器建立连接是在各自的内核中完成的,建立连接之后产生的socket四元组也分别保存在各自的内核中,并且客户端和服务器都会将socket四元组映射成一个文件描述符供用户空间使用。下面是简图图1 socket四元组与其对应的文件描述符关系图2 BIO模型存在的问题:如果连接上来的客户端一直不发送数据,就阻塞了,那么后面新的客户端的连接就得不到处理。退一步,即便是连接上来的客户端发送了数据,但是对数据的处理逻辑复杂,...

2021-09-15 14:28:54 275

原创 Redis Stream的消费者组介绍

Stream是Redis 5.0引入的一种新数据类型,它以一种抽象的方式来构建日志结构的数据。本文主要介绍Redis Streams的消费者组相关的信息。1 什么是消费者组在某些问题中,我们想要做的是从同一流中向许多客户端提供不同的消息子集。一个明显有用的例子是处理缓慢的消息:让N个不同的客户端接收流的不同部分来加快消息的处理。例如:如果有三个消费者A1、A2、A3和一个包含消息1、2、3、4、5、6、7的流,那么我们想要达到的是像下面这样分配消息。为了实现这一点,Redis使用了一...

2021-09-15 14:22:22 4818

原创 搜索中常见数据结构与算法探究(一)

1 前言ES现在已经被广泛的使用在日常的搜索中,Lucene作为它的内核值得我们深入研究,比如FST,下面就用两篇分享来介绍一些本文的主题:- 第一篇主要介绍数据结构和算法基础和分析方法,以及一些常用的典型的数据结构;- 第二篇主要介绍图论,以及自动机,KMP,FST等算法;下面开始第一篇2 引言2.1 提出问题2.1.1 案例一设有一组N个数而要确定其中第k个最大者,我们称之为选择问题。常规的解法如下:1)该问题的一种解法就是将这N个数读进一个数组中,在通过...

2021-09-15 14:21:02 347

原创 Flink技术实战分享和原理浅析

1 Flink是什么在当前的数据量激增的时代,各种业务场景都有大量的数据产生,对于这些不断产生的数据应该如何高效的处理,成为当前的所面临的问题。而相对传统的数据处理模式,流式数据处理有着更高的处理效率和成本控制能力。Flink在德语中的意思快速和敏捷,同时又以一只棕红色的松鼠作为项目的Logo。Apache Flink是一个支持高吞吐、低延迟、高性能的分布式处理框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规...

2021-09-15 14:19:10 1048

原创 讲讲Java中常用的锁(二)

1 前言在java中常用的锁(一)文章中,我们知道了锁的类型有很多,那么本文主要是聊一下公平锁及非公平锁以及它们在我们代码中的实践。2 定义2.1公平锁多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。- 优点:所有的线程都能得到资源,不会饿死在队列中。- 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。2.2非公平锁多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进...

2021-09-15 14:16:50 84

原创 讲讲Java反射机制

1 反射机制简介反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。上面这样子进行类对象的初始化,我们可以理解为「正」。而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射API进行反射调用:上面两段代码的执行结果,其实是完全一样的。但是其思路完全不一样,...

2021-09-15 14:15:03 505

原创 讲讲spring-kafka消费者模型源码解析

1 整体流程2 消费者启动2.1 容器启动2.1.1 consumer启动1)遍历每一个带有@KafkaListener注解的类或方法,经过一系列解析最终为其创建一个MessageListenerContainer,具体实现类为ConcurrentMessageListenerContainerKafkaListenerEndpointRegistry#registerListenerContainer:2)ConcurrentMessageListener...

2021-09-15 14:10:02 1282

原创 强哥讲讲volatile保证内存可见性

1 引言volatile关键字想必大家并不陌生,我们在进行多线程编程开发时经常遇到。使用volatile的一个关键目的是为了保证内存中共享变量的可见性。下文会从cpu指令和JMM内存模型角度探究,volatile是如何保证内存可见性的。2 CPU存储器层次结构简介我们大家都知道,cpu的运行速度是非常之快的,假如,cpu直接从硬盘读取和操作数据,会怎么样呢?那大家肯定会崩溃。因为,硬盘的运行速度是非常慢的相对于cpu来说。为了使cpu大量的时间用来计算而不是等待读取,出现了内存。但是随着...

2021-09-15 14:08:21 623

原创 讲讲innodb中MVCC实现原理

1 数据库事务1.1 从事物说起事物是一组逻辑上的操作,这组操作将执行与否将会保持一致,而在数据库层面,它是一个或多个数据库操作。下面将从事物的状态、条件以及隔离等问题展开(熟悉的读者可以直接略过~)1)事物的状态事物对应着一组操作,大致划分成以下五种状态:- Active(活动):此时事务对应的数据库操作正在执行过程中- Partially Committed(部分提交):当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的修改并未刷新到磁盘时- Fail...

2021-09-15 14:02:16 302

原创 一次简单的JAVA进程到线程资源使用率异常分析

1 前言导读开发&测试人员在应用运行&测试过程中会遇到以下常见问题在测试&调试过程中,应用会出现卡顿或接口响应失败问题,不知如何入手? 开发&测试人员在排查响应失败问题时发现CPU&内存异常性飙高,究竟是哪个进程?哪个线程? 针对进程&线程的异常资源使用,是否有具体的方法定位至代码层面,节约测试&开发时间?一般遇到此类资源使用异常类问题,很多人会采取重新部署或重启应用的方式解决,其实并没有解决当前应用的真实痛点,如...

2021-08-04 13:48:53 378

网上选课系统

改代码能够实现网上的选课系统,只作为参考

2012-12-24

空空如也

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

TA关注的人

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