自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 认真聊聊并发编程的10个坑!

对于从事后端开发的同学来说,并发编程肯定再熟悉不过了。说实话,在java中并发编程是一大难点,至少我是这么认为的。不光理解起来比较费劲,使用起来更容易踩坑。不信,让继续往下面看。今天重点跟大家一起聊聊并发编程的10个坑,希望对你有帮助。

2025-11-19 21:42:29 526

原创 京东一面:MySQL 主备延迟有哪些坑?主备切换策略

高可用性(high availability,缩写 HA),指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用性通常通过提高系统的容错能力来实现。MySQL 的高可用是如何实现的呢?首先,我们来看张图过程:开始时,处理流程主要是场景一客户端读、写,访问的是主库主库通过某种机制,将数据实时同步给备库当主库突然发生故障(如:磁盘损坏等),无法正常响应客户端的请求。此时会自动主备切换,进入场景二客户端读写,访问的是备库(此时备库升级为新主库)看似天衣无缝,那是不是可以高枕无忧了呢???

2025-11-19 21:41:12 773

原创 深入浅出Nacos!

Nacos 是阿里巴巴开源的一款优秀的中间件,在分布式微服务场景下用的非常多。英文全称,其中 Na 是 naming 的缩写,注册中心;co为 configuration 的缩写, 配置中心;不管是配置中心还是注册中心本质都是围着。Nacos 分为服务端和客户端,这一点不要含糊。Nacos Server 使用 Java 语言编写,提供了服务注册发现和服务配置功能;对外提供了 SDK 接入以及HTTP RESTful 开放接口,SDK 接入和 RESTful 接口的功能是一致的。

2025-11-19 21:39:38 566

原创 原来你是这样的 IO 模型!

听见 IO 模型有些同学就开始背八股文了,Java 常见 IO 模型有:同步阻塞 BIO同步非阻塞 NIO异步非阻塞 AIO今天跟大家一起重温下这些知识点。

2025-11-19 21:38:00 747

原创 面试高频:一致性hash算法!

简单的阐述了下一致性hash,如果有不对的地方大家可以留言指正,任何技术都不会十全十美,一致性Hash算法也是有一些潜在隐患的,如果Hash环上的节点数量非常庞大或者更新频繁时,检索性能会比较低下,而且整个分布式缓存需要一个路由服务来做负载均衡,一旦路由服务挂了,整个缓存也就不可用了,还要考虑做高可用。不过话说回来,只要是能解决问题的都是好技术,有点副作用还是可以忍受的。

2025-11-19 21:37:00 861

原创 几行代码搞定RPC服务注册和发现!

在日常的工作或者学习编码过程中,我们一定要习惯面向接口编程,这样做有助于增强代码可扩展性。服务注册register/*** 注册服务信息* @param serviceInfo 待注册的服务* @throws Exception 异常*/服务向注册中心注册,注册的内容定义一个类来封装。/*** 服务名称*//*** ip 地址*//*** 端口号*//*** class 对象*/> clazz;/*** bean 对象*/

2025-11-18 22:09:35 667

原创 高并发场景:红包雨背后的设计与实现!

我们通常称 Redis 为内存数据库 , 不同于传统的关系数据库,为了提供了更高的性能,更快的写入速度,在设计和实现层面做了一些平衡,并不能完全支持事务的 ACID。Redis 的事务具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。

2025-11-18 21:49:42 396

原创 一次线上事故,我顿悟了异步的精髓!

学习需要一层一层递进的思考。第一层:什么场景下需要异步大量写操作占用了过多的资源,影响了系统的正常运行;写操作异步后,不影响主流程,允许适当延迟;第二层:异步的外功心法本文提到了四种异步方式:线程池模式本地内存 + 定时任务MQ 模式Agent 服务 + MQ 模式它们的共同特点是:将写操作命令存储在一个池子后,立刻响应给前端,减少写动作的耗时。任务服务异步从池子里获取任务后执行。第三层:异步的本质在笔者看来,异步是更细粒度的使用系统资源的一种方式。

2025-11-18 21:48:22 232

原创 服务端注册,开始进入深水区了!

在日常的工作或者学习编码过程中,我们一定要习惯面向接口编程,这样做有助于增强代码可扩展性。服务注册register/*** 注册服务信息* @param serviceInterfaceInfo 待注册的服务(接口)信息* @throws Exception 异常*/服务向注册中心注册,注册的内容定义一个类来封装。@Data/*** 服务名(接口全限定名)*//*** 实例 id,每个服务实例不一样*//*** 服务实例 ip 地址,每个实例不一样*//**

2025-11-18 21:47:20 345

原创 SpringCloud Alibaba实战(8:使用OpenFeign服务调用)

Feign是一种声明式、模板化的HTTP客户端。使用Feign,可以做到声明式调用。尽管Feign目前已经不再迭代,处于维护状态,但是Feign仍然是目前使用最广泛的远程调用框架之一。在SpringCloud Alibaba的生态体系内,有另一个应用广泛的远程服务调用框架Dubbo,在后面我们会接触到。Feign是在RestTemplate 和 Ribbon的基础上进一步封装,使用RestTemplate实现Http调用,使用Ribbon实现负载均衡。接下来,我们开始学习Feign的使用,非常简单。

2025-07-15 21:52:25 754

原创 SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

在微服务的体系里,注册中心是最重要的组件之一,我们来简单了解一下什么是注册中心。注册中心和DNS类似,大家想一想,我们平时访问百度,是访问 www.baidu.com ,还是直接访问ip地址呢?注册中心就承担了这样一个“名单”的角色,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。注册中心的作用就是服务的注册和服务的发现。

2025-07-15 21:52:02 885

原创 SpringCloud Alibaba实战(6:nacos-server服务搭建)

Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。Nacos英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。Nacos 无缝支持一些主流的开源生态,使用Nacos,可以简化服务发现、配置管理、服务治理及管理。

2025-07-15 21:51:18 962

原创 SpringCloud Alibaba实战(5:子模块基本业务开发)

在上一节里,我们搭建了一个微服务项目的整体架构,并进行了版本控制。接下来我们进一步来完善架构,引入SpringBoot等开发框架,来支撑具体业务的开发。

2025-07-14 21:58:55 983

原创 SpringCloud Alibaba实战(4:基本开发框架搭建)

在上一节,我们已经完成了项目的整体技术架构设计和具体的数据库设计,接下来,我们搭建整体的开发框架。开发工具选用Idea。开发工具只是为了提高效率,如果不习惯Idea的话,STS使用起来也是OK的。

2025-07-14 21:58:17 607

原创 SpringCloud Alibaba实战(3:存储设计与基础架构设计)

我们首先看一下SpringCloud 官方的一些组件,有些组件不再维护升级,有些新的组件重新承担起相应的责任。我们要做的实例的一个粗略的架构图如下,接下来,我们会围绕SpringCloud/SpringCloud Alibaba的体系来进行我们的项目实战。虽然在微服务的理论中,没有对数据库定强制性的规范,但一般,服务拆分之后,数据库也会对应的拆分。在上一章中,我们已经完成了基本业务流程的梳理和服务模块的划分,接下来,开始设计数据存储。这种结合业务来进行拆分的方式是数据库拆分中的垂直拆分。

2025-07-14 21:57:58 252

原创 SpringCloud Alibaba实战(2:电商系统业务分析)

选用了很常见的电商业务来进行SpringCloud Alibaba的实战。当然,因为仅仅是为了学习SpringCloud Alibaba,所以对业务进行了大幅度简化,这里只取一个精简版的用户下单业务。

2025-07-14 21:57:17 421

原创 SpingCloud Alibaba实战(1:微服务与SpringCloud Alibaba)

微服务可谓是这几年比较热门的技术,从2017开始逐渐爆火,逐渐大大小小的公司纷纷将微服务技术引入并在实际业务中落地。微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出:微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理 (例如Docker)技术,服务可以用不同的编程语言与数据库等。

2025-07-14 21:57:00 737

原创 十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩

先从缓存击穿开始。一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。缓存击穿会增大数据库的负载,我们看看怎么缓解。缓存穿透:缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在一样。缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。缓存穿透可能会使后端存储负载加大,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。自身业务代码问题恶意攻击,爬虫造成空命中我们来看看如何解决。

2025-07-14 21:56:43 857

原创 Redis破障之路(四)Jedis基本使用

在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端。在Java语言体系下,有三个常用的Redis客户端JedisRedissonLettuce。三者各有特点,各有适用的场景。Jedis:Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;

2025-07-14 21:56:27 491

原创 Redis破障之路(三)Redis单线程架构

首先要明白,Redis的单线程指的是执行命令时的单线程。Redis客户端与服务端的模型可以简化成下图,每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。我们说的单线程就是在第二步执行命令,一条命令从从客户端达到服务端不会立刻被执行,而是会进入一个队列中等待,每次只会有一条指令被选中执行。发送命令、返回结果、命令排队这些就不是那么简单了,例如Redis使用了I/O多路复用技术来解决I/O的问题。

2025-07-14 21:56:04 820

原创 Redis破障之路(二)Redis安装和基本数据结构

ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。intset(整数集合):当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。

2025-07-14 21:55:44 846

原创 Redis破障之路(一)强大的Redis

Redis[1]是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利。

2025-07-14 21:55:23 817

原创 五分钟搞懂MySQL索引下推

索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。

2025-07-12 22:07:19 1000

原创 深入学习MySQL(4)InnoDB存储结构

这一节本来计划开始索引的学习,但是在InnoDB存储引擎的索引里,存在一些数据存储结构的概念,这一节先了解一下InnodDB的逻辑存储结构,为索引的学习打好基础。从InnoDB存储引擎的存储结构看,所有数据都被逻辑地放在一个空间中,称之为表空间(tablespace)、区(extent)、页(page)组成,页在一些文档中也被称之为块(block)。

2025-07-12 22:07:04 971

原创 深入学习MySQL(3)日志文件详解

错误日志文件对MySQL的启动、运行、关闭过程进行了记录,是定位MySQL问题的第一把钥匙。

2025-07-12 22:06:42 870

原创 深入学习MySQL(2)存储引擎盘点

在前面我们了解了server层调用存储引擎层接口来完成sql的执行,使用存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。。MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。其中最常用的3种,InnoDB、MyISAM、Memory,MySQL5.5.8以后,默认存储引擎为InnoDB。

2025-07-12 22:06:17 559

原创 深入学习MySQL(1)MySQL逻辑架构

深入学习MySQL,从概览MySQL逻辑架构开始。首先来看一下MySQL的逻辑架构图:值得一提的是在MySQL8.0中取消了查询缓存,大概的理由是查询缓存存在严重的可伸缩性问题,并且很容易成为严重的瓶颈缓存,将缓存移动到客户端能收获更好的性能。通过一条查询语句的执行过程,来了解一些关键的部件:复制代码。

2025-07-12 22:05:16 638

原创 JVM进阶之路(十四)类加载器和类加载机制

在上一章里,我们已经学习了类加载的过程,我们知道在加载阶段需要”通过一个类的全限定名来获取描述该类的二进制字节流“,而来完成这个工作的就是类加载器(Class Loader)。

2025-07-12 22:05:00 934

原创 JVM进阶之路(十三)类加载过程

通过前面的学习,我们了解了Class文件的结构,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。接下来,我们开始学习JVM的类加载。

2025-07-11 21:38:16 640

原创 JVM进阶之路(十二)字节码指令

接下来,我们进一步学习字节码的相关指令。首先我们来看一个简单的程序:复制代码编译运行,使用JDK自带的javap我们来找找相加指令在哪里:对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表 float,d代表double,a代表reference。

2025-07-11 21:37:39 534

原创 JVM进阶之路(十一)Class文件结构

Java虚拟机和Class文件是Java实现系统无关性的基石。Class文件是JVM实现语言无关性的基石。Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。每一个 Class 文件对应于一个如下所示的 ClassFile 结构体:复制代码简单看一下各项的含义:由于 Class 文件结构没有任何分隔符,所以无论是每个数据项的的顺序还是数量,都是严格限定的,哪个字节代表什么含义,长度多少,先后顺序如何,都是不允许改变的。接下来我们来具体学习每项的含义。

2025-07-11 21:37:04 985

原创 JVM进阶之路(十)JVM调优总结

6、为了验证自己的猜想,于是准备登录后台去测试下,结果在测试的过程中发现到处订单的按钮前端居然没有做点击后按钮置灰交互事件,结果按钮可以一直点,因为导出订单数据本来就非常慢,使用的人员可能发现点击后很久后页面都没反应,结果就一直点,结果就大量的请求进入到后台,堆内存产生了大量的订单对象和EXCEL对象,而且方法执行非常慢,导致这一段时间内这些对象都无法被回收,所以最终导致内存溢出。解决方式除了调整本地内存大小之外,也可以在出现此异常时进行捕获,手动触发GC(System.gc())。

2025-07-11 21:36:39 999

原创 JVM进阶之路(九)性能监控工具-可视化工具篇

在前面已经学习了JVM性能监控的命令行工具,接下来学习JVM性能监控的命令行工具,通过可视化工具可以更直观地监控JVM性能、处理JVM相关问题。

2025-07-11 21:35:54 1136

原创 JVM进阶之路(八)性能监控工具-命令行篇

定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。

2025-07-11 21:35:24 585

原创 JVM进阶之路(七)垃圾收集器盘点

在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法。接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的实现。

2025-07-06 08:00:00 818

原创 JVM进阶之路(六)垃圾收集理论和算法

在前面我们了解了虚拟机如何判断对象可回收,接下来我们了解Java虚拟机垃圾收集的一些理论和算法。

2025-07-05 09:15:00 961

原创 JVM进阶之路(五)垃圾回收概述和对象回收判定

垃圾收集(Garbage Collection,简称GC)简单说,就是要干三件事:哪些内存需要回收?什么时候回收?如何回收?在Java的内存区域中:程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,所以这几个区域的内存回收是确定的,随着方法结束或者线程结束,内存自然回收。

2025-07-05 09:00:00 547

原创 JVM进阶之路(四)直面内存溢出和内存泄漏

在Java中,和内存相关的问题主要有两种,和。

2025-07-05 08:45:00 861

原创 JVM进阶之路(三)探究虚拟机对象

例如在64位的HotSpot虚拟机中,如对象未被同步锁锁定的状态下,Mark Word的64个比特存储空间中的31个比特用于存储对象哈希码,4个比特用于存储对象分代年龄,2个比特用于存储锁标志位,在其他状态(轻量级锁、重量级锁、偏向锁)下对象的存储内容变化如图示。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。

2025-07-05 08:30:00 566

原创 JVM进阶之路(二)Java内存区域

考虑到HotSpot未来的发展,在JDK 6的 时候HotSpot开发团队就有放弃永久代,逐步改为采用本地内存(Native Memory)来实现方法区的计划了,到了JDK 7的HotSpot,已经把原本放在永久代的字符串常量池、静态变量等移出,而到了 JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Meta-space)来代替,把JDK 7中永久代还剩余的内容(主要是类型信息)全部移到元空间中。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。

2025-07-05 08:15:00 544

空空如也

空空如也

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

TA关注的人

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