自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java内存泄漏+性能优化+宕机+死锁定位问题的N种姿势

提到内存泄露,搞过C++的同事就笑了,在C++内存泄露排查很简单,用钩子函数勾住内存分配和释放函数malloc和free,统计哪些malloc的内存没有free,就可以找出内存泄露的源头。但在Java里问题复杂的多,主要因为Java在内存之上有层JVM管理内存。JVM先从操作系统申请大内存,接着自己管理这部分内存。所以Java程序的内存泄露分为两种:堆上内存泄露、堆外内存泄露,而堆外内存泄露又分为两种:Java使用堆外内存导致的内存泄露、Java程序使用C++导致的内存泄露。

2022-09-27 17:06:51 1316 1

原创 Redis 多线程网络模型全面揭秘

Redis 作为缓存系统的事实标准,它的底层原理值得开发者去深入学习,Redis 自 2009 年发布第一版之后,其单线程网络模型的选择在社区中从未停止过讨论,多年来一直有呼声希望 Redis 能引入多线程从而利用多核优势,但是作者 antirez 是一个追求大道至简的开发者,对 Redis 加入任何新功能都异常谨慎,所以在 Redis 初版发布的十年后才最终将 Redis 的核心网络模型改造成多线程模式,这期间甚至诞生了一些 Redis 多线程的替代项目。

2022-09-27 16:30:51 370

原创 一篇文章入门 Redis(万字长文干货)

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis 支持多种类型的数据结构,如 字符串(strings),散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) ,范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

2022-09-21 16:33:39 602

原创 认识MySQL和Redis的数据一致性问题

数据一致”一般指的是:缓存中有数据,缓存的数据值 = 数据库中的值。缓存中有数据,缓存的数据值 = 数据库中的值(需均为最新值,本文将“旧值的一致”归类为“不一致状态”)缓存中本没有数据,数据库中的值 = 最新值(有请求查询数据库时,会将数据写入缓存,则变为上面的“一致”状态)”数据不一致“:缓存的数据值 ≠ 数据库中的值;缓存或者数据库中存在旧值,导致其他线程读到旧数据。

2022-09-19 17:02:55 235

原创 Tendis(Redis)冷热混合存储怎么解决缓存击穿、雪崩、一致性3大难题

导语缓存由于高并发和高性能的特性,经常被用于提高数据库的性能。但是业务往往需要花费大量精力来维护缓存和数据库的一致性。由IEG技术运营部/存储与计算资源中心 & 腾讯云数据库团队联合打造的 TendisX 冷热混合存储, 使用 Redis 作为缓存, Tendisplus 作为后端持久化数据库,并且自动将热数据加载到缓存,冷数据从缓存侧淘汰。业务侧使用完全透明,无需考虑缓存不一致的问题,从而更方便业务开发。本文首先介绍由 IEG 技术运营部团队 & 腾讯云数据库团队开发的TendisX 冷热混合存储方案的

2022-09-19 11:03:22 1329

原创 Spring事务在多线程下保证原子性

实践发现,即使使用批量保存,接口耗时也高达一秒多,所以需要开启多线程来保存。现在的问题是,在开启多线程保存的情况下,如何保证数据的原子性。

2022-09-06 16:58:30 1255 2

原创 微信开源 PhxQueue:“三高“的分布式队列

解耦:防止引入过多的 API 给系统的稳定性带来风险;调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低调用方系统的响应能力。削峰和流控:消息生产者不会堵塞,突发消息缓存在队列中,消费者按照实际能力读取消息。复用:一次发布多方订阅。PhxQueue 目前在微信内部广泛支持微信支付、公众平台等多个重要业务,日均入队达千亿,分钟入队峰值达一亿。其设计出发点是高数据可靠性,且不失高可用和高吞吐,同时支持多种常见队列特性。同步刷盘,入队数据绝对不丢,自带内部实时对账出入队严格有序。

2022-09-06 15:36:34 203

转载 建设高并发系统的一些经验总结

作者:listenzhang,腾讯 PCG 后台开发工程师离开饿了么有一段时间了,在饿了么期间从2017年开始接手运单系统的开发和维护工作,从最早的日均百万单,到离开时的日均千万单,业务的快速发展再加上外卖业务的特点是业务量集中在午高峰和晚高峰两个高峰期,所以高峰期并发请求量也是水涨船高,每天都要面对高并发的挑战。拿运单系统来举例,日常午高峰核心查询服务的QPS在20万以上,Redis集群的QPS更是在百万级,数据库QPS也在10万级以上,TPS在2万以上。在这么大的流量下,主要的工作也是以围绕如何建设系统

2022-06-30 15:28:19 244

原创 高并发系统中库存热点的解决方案

本文讨论的场景是互联网业务中秒杀场景下热key的解决方案,秒杀场景不局限于电商活动,也包括:日常活动下发奖品的配额控制、春节的集卡瓜分现金、春晚的摇一摇抢红包等。更进一步的说,是探讨所有关于有热key的场景的一种解决方案。本文讨论的场景是互联网业务中秒杀场景下热key的解决方案,秒杀场景不局限于电商活动,也包括:日常活动下发奖品的配额控制、春节的集卡瓜分现金、春晚的摇一摇抢红包等。更进一步的说,是探讨所有关于有热key的场景的一种解决方案。以上图为例,解释下各个模块: 发货模块:先查询库存,有库存后给用

2022-06-28 16:58:36 1981

原创 看了这篇文章CAP你还不懂,我打你!

看完下面这些文字,保证你对CAP能理解的特别通透!!!关于 CAP 为何你读了那么多文章都还是搞不明白呢?因为 CAP 理论来自学术界,而解读 CAP 理论的人尝试用工程师的方式去阐述它,这本身就有了问题。CAP 本身基于状态,基于瞬态,是一个描述性的理论,它并不解决工程问题。但是,很多工程师却总是尝试为 CAP 做过多解读。比如,非要说 CAP 理论只能适合某某场景,非要说 CAP 理论里的一致性是非常强的一致性,把其和事务的一致性混为一谈。由于 CAP 是学术理论,并不是工程理论,它会舍弃很多现实世界的

2022-06-22 14:45:11 164

原创 带你掌握Mysql中的各种锁

基础能力:阅读这篇文章需要你对锁本身有一定的了解,同时使用过 MySQL 中的锁。开发多用户、数据库驱动的应用时,最大的一个难点就是既要保证并发性能,又要确保数据一致性。为此就有了锁机制。MySQL 在 server 层 和 存储引擎层 都运用了大量的锁,而理清楚各种锁的作用以及他们的加锁时机,不仅有利于我们在使用 MySQL 中避免不必要的死锁,同时可以让我们在业务层面去考虑 SQL 语句执行对生产环境可能带来的影响从而预防事故。接下来将从两个层面上去讲解 MySQL 中的锁,一个是 server 层,一

2022-06-15 15:47:11 2573 7

原创 spring循环依赖之三级缓存的深入理解

都知道Spring通过三级缓存来解决循环依赖的问题。但是是不是必须三级缓存才能解决,二级缓存不能解决吗?很多篇文章都说第二级缓存不能去掉,是因为创建代理时要用到,那第三级缓存可以去掉吗?要分析是不是可以去掉,就先过一遍Spring是如何通过三级缓存来解决循环依赖的。所谓的循环依赖,就是两个或则两个以上的bean互相依赖对方,最终形成闭环。比如“A对象依赖B对象,而B对象也依赖A对象”,或者“A对象依赖B对象,B对象依赖C对象,C对象依赖A对象”;类似以下代码:常规情况下,会出现以下情况:Spring解

2022-06-15 10:21:50 415

原创 Redis队列和专业MQ的对比和选型

大家好,我是 Jack。我经常听到很多人讨论,关于「把 Redis 当作队列来用是否合适」的问题。有些人表示赞成,他们认为 Redis 很轻量,用作队列很方便。也些人则反对,认为 Redis 会「丢」数据,最好还是用「专业」的队列中间件更稳妥。究竟哪种方案更好呢?这篇文章,我就和你聊一聊把 Redis 当作队列,究竟是否合适这个问题。我会从简单到复杂,一步步带你梳理其中的细节,把这个问题真正的讲清楚。看完这篇文章后,我希望你对这个问题你会有全新的认识。在文章的最后,我还会告诉你关于「技术选型」的思路,文章有

2022-06-14 17:02:48 2210 2

原创 微服务如何向Nacos进行注册及心跳检测?James带你从源码一步步深入分析

大家好, 我是James, 最近整理了一下客户端微服务向Nacos注册及心跳的源码分析, 希望对大家学习有帮助, 源码可以找我的助理要一下哈v: lzc1314592首先下载好Nacos的源码关于源码怎么导入到maven, 在预习资料有个文档,写的很清楚Nacos源码分析访问nacos启动业务服务然后再停掉一个服务发现变成1了如果客户端访问刚关闭的那台服务, 是不是会报错呢?有可能还会调到已停的服务, 怎么处理?其实就是做了一个服务降级的处理互联网线上一般对非核心非关键的

2021-02-02 12:23:10 4114 3

原创 <重要>James带你透彻分析三大代理模式

James带你透彻分析三大代理模式1.代理模式1.1.快速掌握静态代理1.2.JDK动态代理1.3.Cglib动态代理1.代理模式Java最经典的设计模式代理模式(Proxy), 在我们开发及框架源码中无处不在,其实说白了, 就是我们使用另外一种方式来访问A对象的方法, 其本质还是访问了A对象的方法, 只是对A对象方法访问的时候做了些扩展, 把A对象封装成代理对象AA, 即通过AA代理对象来访问目标对象. 这样就可以在A对象的基础上,实现其它的额外附加功能;AA对象也叫做代理对象, 在不动A对象的前.

2021-01-26 22:35:28 964 3

原创 Seata事务操作实战,快速搞定分布式事务

Seata如何结合Naocs完成事务操作呢?1,下载seata2,安装seata3,seata启动4,Seata如何实现事务控制?1,引入jar包2,proxy代理数据源配置3,核心配置拷贝4,新建yml文件1,下载seatahttps://github.com/seata/seata/releases或到James的网盘下载链接:https://pan.baidu.com/s/1-18nNRULIR-LwPPyRHsIOg提取码:l6r9注意: 先需要把nacos启动2,安装seataA

2021-01-20 21:18:43 2078 3

原创 为什么要学习源码?架构师告诉你原因

说起源码, 我相信大家都比较头疼, 有很多人面试也是坑在源码上, 那为什么要学习源码,我结合自己多年的源码阅读经验,一、James给大家总结几点:1、让个人技术快速成长:优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术,优秀的解决方案,熟读源码对猿们技术提升有很大帮助2、新技术学习能力:Java开源码框架的源码熟读后,若出现新的开源技术,能根据经验或官网资料快速掌握底层的实现,不怕技术更新迭代3、工作中解决问题能力:很多人开发过程中或线上遇到BUG, 首先

2021-01-14 11:57:50 5651 9

原创 Java工程师到底写简历才能有面试电话? 看完我写的内容再说

OK, 我们今天来聊一聊简历,从今年的金3银4到金9银10,这2段时间我收到了很多很多的简历每天人事根据招聘匹配度高的简历, 推荐到我这来, 我每天收到的Java简历至少有20封以上,但考虑到面试效率,90%以上的简历没看到20S钟就被PASS掉了, 为什么呢, 各种原因吧, 有的是排版, 有的简历内容随意, 20S钟之内没看到我想看的信息,各位小伙伴, 你们将简历投递给公司, 其实就跟你相亲一样, 简历是你给别人的唯一第一印象,所以,我今天从技术面试官的角度来给分享一下, 什么样的简历能触动面试官,并

2020-12-08 23:30:35 980 1

原创 mysql数据库架构和同步复制流程

在分布式系统里面,往往制约整个系统发展的瓶颈点就是数据库,所以数据库的架构和高可用以及数据库的切分都是我们值得花大力气去学习的。首先我们来说说数据库的架构。1、mysql主从架构,如图:这种架构基本上90%以上会采用的数据库架构。这种架构的优点:1、数据库架构简单2、维护方便缺点:1、master存在单点问题,不能停机维护2、读压力大slave过多的话,主从同步会影响master的性能2、Dual Master 复制架构上面的主从架构存在明显的单点master问题,master不能停

2020-05-29 12:01:30 1010

原创 带有@Transactional和@Async的循环依赖问题

今天我们来探讨一个有意思的spring源码问题,也是一个学生告诉了我现象我从源码里面找到了这个有意思的问题。首先我们看service层的代码案例,如下:@Service("transationServiceImpl")public class TransationServiceImpl implements TransationService { @Autowired Tr...

2020-04-29 16:59:04 6281 6

原创 spring事务中的超时时间很多人都不理解

在spring中如何使用事务是一个很大的问题,其中有一个我需要在这篇文章中着重讲解一下,就是spring事务中的超时时间问题,很多同学不知道如何才能是这个超时时间生效,导致在使用过程中出现各种各样的问题。1、使用mybatis框架来做数据库操作代码案例如下:@Transactional(propagation = Propagation.REQUIRED,timeout = 5) @...

2020-04-16 15:00:21 14738 2

原创 spring中动态数据源切换失效问题剖析

我们在使用spring中动态数据源的时候,往往在业务代码中需要指定数据源,在进行业务操作的时候就会去指定的数据源操作数据:代码如下数据源,两个数据源,ds1,ds2:@Bean public DataSource dynamicDataSource() { Map<Object, Object> targetDataSources = new ...

2020-01-16 11:03:36 5551 7

原创 如何在spring源码里面写注释并且能断点调试

热爱spring源码的同学,应该都希望在自己的spring源码jar包里面写点注释来加深对源码的理解,这篇博客主要就是告诉大家如何做到这点:1、下载spring源码我这里是下载的最新版本的spring源码,并且使用的是马云镜像,千万不要用GitHub下载,太慢了,慢得想死git clone --branch v5.1.3.RELEASE https://gitee.com...

2019-11-30 14:36:59 2950 1

原创 源码分析FactoryBean接口不为人知的秘密

FactoryBean接口在spring中是一个非常好用且容易被人忽略的接口。OK借助这个机会我们把它的秘密扒出来,让它落体出镜好吧。首先贴一个代码:import org.springframework.beans.factory.FactoryBean;public class FactoryBeanTest implements FactoryBean { private U...

2019-09-19 15:05:04 955 1

原创 ApplicationContextAware接口的setApplicationContext方法调用过程

我们都知道实现了ApplicationContextAware接口的类会被调用setApplicationContext方法,从而获取到spring容器的上下文。但是这个调用过程缺很少有人知道,现在博主通过源码分析带大家掌握这个调用过程。1、当我们启动spring容器的时候,我们执行到refresh()方法。其中我们进入prepareBeanFactory(beanFactory);去看看。...

2019-09-18 20:56:52 6179 1

原创 spring事务从底层掌握其实现原理

流程介绍主流程介绍众所周知,Spring事务采用AOP的方式实现,我们从TransactionAspectSupport这个类开始分析。获取事务的属性(@Transactional注解中的配置)加载配置中的TransactionManager.获取收集事务信息TransactionInfo执行目标方法出现异常,尝试处理。清理事务相关信息提交事务//1. 获取@Transac...

2019-09-16 14:25:36 2235

原创 Redis到底有没有ACID事务

要弄清楚 Redis 有没有事务,其实很简单,上 Redis 的官网查看文档,发现:Redis 确实是有事务,不过按照传统的事务定义 ACID 来看,Redis 是不是都具备了 ACID 的特性。ACID 指的是:原子性 一致性 隔离性 持久性我们将使用以上 Redis 事务的命令来检验是否 Redis 都具备了 ACID 的各个特征。1、原子性事务具备原子性指的是...

2019-08-29 17:45:23 4000 2

原创 Redis过期删除是如何做的?

当一个键处于过期的状态,其实在 Redis 中这个内存并不是实时就被从内存中进行摘除,而是 Redis 通过一定的机制去把一些处于过期键进行移除,进而达到内存的释放,那么当一个键处于过期,Redis 会在什么时候去删除?几时被删除存在三种可能性,这三种可能性也代表了 Redis 的三种不同的删除策略。定时删除:在设置键过去的时间同时,创建一个定时器,让定时器在键过期时间来临,立即执行对键的...

2019-08-29 17:39:30 1295

原创 零拷贝真的很重要!!!

零拷贝作为很多中间件和框架的核心知识,在很多场景有很多的应用,例如:JavaNIO、Netty底层的通信协议有用到零拷贝,Kafka之所以这么快也用到了零拷贝,RocktMQ存储的核心也有用到零拷贝,所以面试的时候,是经常出现的,是重点中的重点!一、IO的一些基本概念1.1、缓冲区缓冲区是所有I/O的基础,I/O讲的无非就是把数据移进或移出缓冲区;进程执行I/O操作,就是向操作系统发...

2019-08-29 17:33:55 2600

原创 count(1) 比 count(*) 效率高么?

MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的,我也姑且觉得对吧,那么没有自己研究一下究竟?如果我告诉你他们一样,你信么? 有 Where 条件的 count,会根据扫码结果count 一下所有的行数,其性能更依赖于你的 Where 条件,所以文章我们仅针对没有 Where 的情况进行说明。 MyISAM 引擎会把一个...

2019-07-05 14:34:09 578

原创 深入剖析序列化和反序列化底层实现原理

序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知!一、基本...

2019-06-25 17:01:55 473

原创 redis中RDB和AOF两种持久化方式的比较

1、RDB持久化机制就是我们俗称的备份,他可以在定期内对数据进行备份,将Redis服务器中的数据持久化到硬盘中;文件格式是:dump.rdb快照持久化通用的配置:RDB持久化的工作流程:Redis根据配置自己尝试生成RDB快照文件; fork一个子进程出来; 子进程尝试将数据写到临时的RDB快照文件中; 完成RDB快照文件的生成之后,就替换之前旧的快照文件;2、AO...

2019-06-25 16:11:52 1216

原创 Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?

正如其他面试题,问到“Redis和Memcached之间的区别?”或者“Dubbo和SpringCloud之间的区别?” 一样,相同领域技术之间进行比较也是一个经常面试的考点!一方面,考察了你对当前技术的了解程度,他适应的场景和不适应的场景,摸清楚你是否真正的用过,是否有“最佳实践”。你说你对技术了解的比较深入,问了几个比较有难度的问题,你都游刃有余,但是问到你为什么使用这个,而不是用另外一...

2019-06-25 15:56:28 2499

原创 OOM内存溢出实战不得不看的经典

各种OOM的溢出实战及对象、布局、访问、对存活判断及引用一、虚拟机中的对象我们JAVA编程中无时无刻都在操作创建对象,那么我们虚拟机在遇到new关键词创建对象的执行过程是怎样的?1、例如我们有一个User类首先检查是否存在这个User类,然后看是否有没有被加载过,如果没有加载JVM会先进行User加载。2、加载完成后我们会在堆中分配特定大小的内存进行分配。(1)...

2019-06-19 16:16:20 1758

原创 消息中间件如何确保消息100%投递成功及消息的幂等性设计

针对不同的业务场景和技术架构,关于如何保证消息中间件消息100%发送以及保证消息幂等性的方式有很多种。也并不能说某一种方案是错误的或者正确的,只有最适合当前业务的。即使,你自己的业务中没有处理过类似的问题,下边的解决方法你也是可以作为自己处理过程的一个参考,面试的时候,也可以按照下边的方式进行一定的描述。一、前言我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,...

2019-06-18 17:50:11 1255 2

原创 B+树算法在mysql中能存多少行数据?

在面试的时候,如果问到了B+树这个东西,或者问到了MySQL索引的底层实现,也希望大家能够进一步的发挥,和面试官探讨一下,为什么B+树一般都是3层左右,为什么3层的B+树可以存放2千万的数据,这个到底是怎么计算的,计算的过程大家是要好好消化理解的!面试的时候,你能答到这一点,绝对是一个加分项!一、InnoDB一棵B+树可以存放多少行数据?InnoDB一棵B+树可以存放多少行数据?这个问...

2019-06-18 13:20:30 6651 3

原创 从多线程角度分析QPS、TPS等基础概念

我们在面试的时候基本都会遇到多线程方面的问题,常见的数据库出现“toomanyconnection”如何解决,线程池中应该设置多少个线程才能满足系统的需求等等。本篇文章给大家总结一下如何简单的计算,到底需要多少个线程,也希望大家到时候问到多线程方面问题的时候, 你也能说一下下边的计算方式!另外,还有一些常见的关于CPU相关的知识点,QPS/TPS等基础概念,也是需要了解的!一、前言“线...

2019-06-18 13:05:51 1558

原创 双亲委派模型和破坏性双亲委派模型详解

从JVM的角度来看,只存在两种类加载器:启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-X bootclasspath参数指定的路径中的类库加载到内存中。 其他类加载器:由Java语言实现,继承自抽象类ClassLoader。如:扩展类加载器(Extension Clas...

2019-06-17 12:28:45 6831 4

原创 Docker(一):Docker入门教程

如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。本文详细解释介绍Docker入门相关内容,后期重点关注Docker在微服务体系中的使用。在了解Do...

2019-06-15 14:21:36 435

原创 MySQL 之 Explain 输出分析

MySQL 之 Explain 输出分析背景前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个。可能工作中实际使用的不多,但是不论的自己学习还是面试,都需要掌握的。Explain 可以使用在SELECT, DELETE, INSERT, REPLACE, and UPDATE语句中,执行的结果会在...

2019-06-12 11:41:11 384

空空如也

空空如也

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

TA关注的人

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