自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

帝都的雁的博客

腹中无墨,笔下乱文

  • 博客(222)
  • 资源 (9)
  • 收藏
  • 关注

原创 Kafka工作原理

kafka是一个以日志形式存储消息的消息中间件,以高吞吐而闻名。一、生产者producer1.ack模式前提:kafka的服务器broker是个集群1.1 ack = 0生产者只管投递,并不关注kafka服务器broker是否接收到消息。缺点:可能会出现消息丢失。1.2 ack = 1生产者投递消息后,broker副本的leader接收到消息,在本地持久化后,就返回生产者消息发送成功;然后开启线程向其它follower同步这条...

2021-11-08 16:23:28 2785 2

原创 借鉴秒杀思想设计直播抽奖,将50QPS提升至4W

一、前言先谈谈秒杀的设计思路秒杀业务设计大致分为三块:前端、网关和后端。前端需要动静分离,可以采用第三方文件服务器获取静态资源,减轻CDN带宽压力,提升访问秒杀页面的用户体验。秒杀业务大致都是异步完成,所以需要前端轮训秒杀的请求结果。网关需要对请求进行限流(分布式锁)、保护或者IP黑白名单控制,防止单用户短时间多次请求。后端采用数据库的sql where 库存>0来防止库存超卖,为了减少数据库访问压力,也需要在redis中生成对应库存数量的令牌桶供请求获取(或者在redis记录库

2021-10-08 16:12:27 954 2

原创 mysql事务隔离级别以及MVCC的底层原理

源于蚂蚁课堂的学习,点击这里查看(老余很给力)有猿友私信聊天说搞不明白事务隔离级别到底是什么意思,但面试又不可避免,只能死记硬背。但资深的面试官不讲武德,直接询问事务隔离级别底层原理,怎么办?来骗?来忽悠经验丰富的面试官?这好吗?这不好。我劝这些猿友,耗子尾汁,脚踏实地研究技术,不要搞窝里斗。本文帝都的雁为大家详细介绍一下mysql底层保证数据安全的原理。一、锁的分类万变不离其宗,锁是一个抽象的概念,按照不同的角度有不同的划分。1、以性能划分乐观锁:当线程获取不到...

2020-11-28 14:38:28 693 1

原创 mysql定位和优化慢查询的方案

源于蚂蚁课堂的学习,点击这里查看(老余很给力)是否遇到过这样的场景:因为一条sql查询耗时太长,降低用户体验;或者面对sql结合业务,不知道怎么写才能更高效地输出结果?今天帝都的雁为大家分享一下如何在千万级的数据量下输出高效的sql语句。(PS:需要有mysql执行流程原理的理论基础,可参考我的另一篇博文《mysql查询和修改的底层原理》)一、数据结构Mysql之所以可以快速地吞吐,很大程度上依赖于其底层的数据结构--B+树。首先我们先了解一下几种索引可选择的数据结构。...

2020-11-19 15:15:43 901

原创 mysql查询和修改的底层原理

源于蚂蚁课堂的学习,点击这里查看(老余很给力)Mysql作为主流数据库,有着强大的数据存储交互功能,成为当下程序猿必备的技能点。很多小伙伴可能对其了解仅限于sql的运用,但对其内部底层如何将数据存储和取出任然一知半解。本文,帝都的雁分享一下自己了解的mysql的底层原理。(PS:属于进阶知识,要对mysql的索引底层数据结构、存储引擎有一定概念)一、通讯方式Mysql采用半双工通讯。通讯方式分为单工、半双工和全双工。单工:请求方和接收方传输方向是单向的,比如遥控器。...

2020-11-12 10:22:52 2560 1

原创 解读spring中@Value 如何将配置转自定义的bean

着急寻求解决方式的猿友先看这块将转化类放入转化工厂属性注入代码改进下面谈下具体spring是怎么做的熟悉springbean生命周期的猿友应该明白,红框中的方法栈都是bean生命周期的执行路径(这里不做阐述,感兴趣的猿友可以翻阅我往期博客,里面有做源码解读介绍),我们从生命周期的属性赋值开始剖析源码。

2023-08-10 15:50:37 640

原创 cglib实战代理

看小伙如何使用动态代理,以一抵十

2022-08-17 16:41:26 394 1

原创 ArrayList高并发可能遇到的ConcurrentModificationException

一、原代码// 需求背景:多条件判断,获取所有条件,根据优先级排序,执行校验// 内存中存放了一个自定义的condition对象的列表(ArrayList)List<Condition> conditionList = LocalCache.getConditionList();// 根据Condition中的order进行优先级排序conditionList.sort(Comparator.comparingInt(Condition::order));// 遍历condi

2022-05-01 21:12:56 835

原创 蹭个勋章,顺便分享下近期对知识的回顾

有道云笔记

2021-10-24 13:46:06 129

原创 threadlocal实战动态数据源

一、思路配置多个数据源。 将多个数据源放入map,map放入动态数据源,设定动态数据源的默认数据源。 sqlSessionFactory中设定动态数据源。 动态数据源从threadLocal中获取目标数据源的名称,进而切换数据源。 通过aop切入方法,并约定好方法命名(注意this会使aop失效),来区分读和写。 前置通知中,读操作,threadLocal中放入读数据源的key;写操作,threadLocal中放入写数据源的key。 后置通知中,清空threadLocal,防止内存泄漏。

2021-10-09 15:46:38 1009

原创 基于Nginx实现无损发布

一、原理Nginx的nginx_upstream_check_module可以向服务端发送心跳探活。在服务启动后,服务的内存中放置一状态200,Nginx请求接口获得这个状态,认为服务可用,会继续为其转发流量。当发布服务时,我们再启动脚本中向服务发布一个put请求,修改服务内存的状态为503,Nginx检测到后,认为这台服务故障,不会为其转发流量。我们在脚本中sleep一段时间,用于处理未完成的请求,之后kill进程,重新编译启动。启动后内存的值又变为了200,Nginx心跳探活发现服

2021-10-09 11:44:44 688

原创 揭秘https的加密传输过程

对比HTTP的明文传输,HTTPS采用加密。那么,为什么要加密?防止信息泄露,加密的数据被截取后,是无法直接阅读的。对称加密算法加密和解密都使用同一个密钥。网站向客户端传递秘钥,之后,二者之间通讯使用密钥加密、解密。对称加密算法的漏洞客户端向网站索要密钥时,这个密钥可能被别人获得,从而解密出交互的信息。非对称加密算法有一组钥匙,公钥和私钥。公钥可以解开私钥的加密,私钥可以解开公钥的加密,算法耗时很长。网站向客户端传递公钥,之后,网站向客户端发送的数据使用私钥加密;客

2021-09-30 14:58:38 315

原创 Java定位CPU飙升之jstack

大型互联网项目中,为了保证服务稳定,会引入各种监控和告警。其中CPU和内存的监控可谓重中之重。那么当产生服务器CPU告警后,如何定位原因呢?首先我们需要通过top列出进程列表,shift+p来按照cpu排序。可以看到排名第一的是23798这个进程,我们再通过top -Hp 进程号 来查看这个进程下所有的线程情况,同样shift+p来按照cpu排序排名第一的线程是24037,使用printf '%x\n' 24037 将线程号转为16进制。通过jstack 进程号 > file..

2021-07-26 15:13:43 260

原创 链路追踪技术的原理

1.链路跟踪技术1.1 链路追踪背景微服务系统中,随着业务的发展,系统逐渐庞大,服务间调用关系的复杂度也会水涨船高。一个HTTP请求可能涉及多个不同的微服务来处理,返回最后的结果。在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,此时,链路监控尤为重要。1.2 设计原理基于代理技术监控请求。在服务接收请求、返回响应的外层做拦截,监控每个链路节点。traceId: 请求链路全局唯一id spanId:单个节点id parentId:上级节点id2.S

2021-06-24 17:36:55 2307

原创 Apollo的原理设计

1.分布式配置中心和Apollo1.1 什么是分布式配置中心?项目中配置文件比较繁杂,不同环境的不同配置修改相对频繁,每次发布可能涉及修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做到自动更新配置文件信息,解决以上问题。1.2 什么是Apollo?Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务...

2021-06-21 14:06:42 275

原创 @Async带来的循环依赖问题

需要用的springBean的生命周期和AOP的源码知识,迷茫的猿友可以自行上网查阅。spring解决了单例的循环依赖,但当循环依赖的bean中出现@Async时,就会抛出异常

2021-06-01 20:08:35 2208

原创 less和grep的常用方式

less1. 直接查看文件less catalina.out查看文件后,若文件过大,打通过以下命令滚动文件:j 下一行k 上一行f 向下滚动一屏幕b 向上滚动一屏幕g 定位到文档头部G 定位到文档最尾部q 退出less模式less -N catalina.out 行号2. 查找内容/keyword  向下查找n 向下匹配下一处匹配文本N 向上匹配下一处匹配文本?keyword  向上查找n 向上匹配下一处匹配文

2021-05-07 11:37:55 1791

原创 @TableField(exist = false)的功能

@TableField(exist = false) 申明此字段不在数据库存在,但代码中需要用到它,通知Mybatis-plus在做写库操作是忽略它。

2021-04-30 10:18:34 1717

原创 maven编译不运行测试用例的方式

mvn clean install-DskipTests不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。mvn clean install -Dmaven.test.skip=true。不执行测试用例,也不编译测试用例类。

2021-04-21 15:24:50 806

原创 XXL-job

为了解耦,我们往往会采用定时任务去做一些补偿或者耗时的操作。传统项目中定时任务会耦合在业务项目中,要知道定时任务底层依赖于死循环,大量的定时任务会导致业务系统卡死奔溃。所以有必要将定时任务和业务项目剥离出来,各司其职。浏览对比知名组件,xxl-job口碑好评如潮,所以记录下学习xxl-job的过程。(ps:尊重原创,附上xxl地址:https://www.xuxueli.com/xxl-job/)一、工作机制xxl-job类似于微服务的注册中心。它提供两个角色:任务调度中心和执行器。.

2021-02-26 17:56:36 534 1

原创 MDC的注意事项

​为了方便定位问题,相信很多猿友​都干过这件事:使用过滤器拦截请求,然后生成一个请求ID(唯一标识,如UUID),并将其放入ThreadLocal中。然后在执行业务代码时,通过日志将核心的信息或参数输出,同时输出threadLocal中记录的请求ID。这样一来,本次请求出现异常后,我们可以根据请求id查询日志,读取请求的整个过程,从而快速从庞大的日志文件中获取我们感兴趣的​信息。​log4j提供了MDC,本质上也是使用ThreadLocal进行保存​。而且使用的是InheritableT...

2021-01-27 15:54:46 1096

原创 不容错过的Java高级面试题

又到跨年之际,想必在这一年技术成长颇多的猿友们为备战金三银四而蠢蠢欲动了吧。工欲善其事必先利其器。停止无病呻吟和眼高手低,脚踏实地地狂刷面试题,offer拿到手软不再是空谈。帝都的雁为大家汇总本人在今次找工作中遇到的面试题,希望可以帮到猿友。(PS:博主本次找工作参加面试的知名企业有:有快手/字节/阿里/滴滴/boss直聘/携程/猎聘/好未来/京东/美团/当当,最终也如愿进入其中一家大厂;面试题基于Java全栈,参照个人简历的技术栈由浅至深询问。故建议猿友们在简历上写自己hold得住的技能,切莫画蛇添.

2020-12-30 15:45:05 6754 7

原创 想要在springboot启动后马上做些事情?源码告诉你怎么实现

话不多说,直接上源码。(springboot的启动源码不再过多阐述了哈,感兴趣的朋友可以自行查看源码或查看我的了一篇博文《springboot2.0启动原理源码剖析》)public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null;.

2020-12-24 09:23:49 387 2

原创 mybatis的同参数名称的覆盖问题(foreach)

遇到个奇怪的问题。mapper.xml中是这么写的<if test="statusList != null"> AND STATUS IN <foreach collection="statusList" separator="," open="(" close=")" item="status" index="index"> #{status ,jdbcType=TINYINT} </foreach></if><if t.

2020-12-18 13:46:51 1053

原创 被解刨的JVM

作为java应用程序的基层员工,JVM总是默默无闻地辛苦工作。年近尾声,年度评优工作开始进展。往年都是框架、并发等员工当选,咱不能总让老实人吃亏。综合解剖一下JVM,看看它做了哪些了不起的事情。(主要针对java内存结构做分析)一、类加载过程Java应用程序是不能直接运行的,需要通过java complier进行编译,将其转为class字节码文件,然后交由不同环境的JVM进行运行。那么,JVM到底是干什么的呢?它如何做到存放或创建实例对象的?又是如何进行对象内存回收?别着急,我们先看看这位员工.

2020-12-17 16:51:15 264

原创 一些常见的算法或编程题

线程死锁package live.yanxiaohui.test.day20201202;/** * @Description 线程死锁 * @CSDN https://blog.csdn.net/yxh13521338301 * @Author: yanxh<br> * @Date 2020-12-02 08:41<br> * @Version 1.0<br> */public class Dead { public static vo

2020-12-02 09:55:55 219

原创 Redisson的分布式锁

最近想使用redisson的分布式锁去替换系统中的redis分布式锁从而解决续期问题,查看了源码,发现其原理还是比较容易理解的。一、Maven配置 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.4</version> </dependency>..

2020-11-04 16:21:16 2591

原创 sql += ““,这样写字符串为什么不合适?

源于蚂蚁课堂的学习,点击这里查看(老余很给力)字符串算是所有语言的共性了,Java的字符串提供了两种拼接工具,StringBuilder和StringBuffer。但实际开发中,还是有很多猿友喜欢这样去拼接字符串。比如,写一个案例:public class Test { public static void main(String[] args) { String a = "a"; a += "b"; a += "c"; }...

2020-10-27 10:00:31 971 2

原创 Java8 stream流,list转Map

key重复,value转集合Map<Long, List<Object>> map = list.stream().collect(Collectors.toMap(Object::getId, a -> new ArrayList<>(Arrays.asList(a)), (a1, a2) -> { a1.addAll(a2); return a1; }));key重复,value覆盖Map<Lo..

2020-10-26 09:16:15 743

原创 关于Java类加载的回忆

源于蚂蚁课堂的学习,点击这里查看(老余很给力)Java底层是由C++去编写的,而C/C++由是封装汇编指令,进而转为二进制被计算机识别。所以当我们作为Java开发者,写好Java代码后,是需要进过JavaComplier进行编译生成class字节码文件,然后由类加载器将字节码文件加载至Java虚拟机内存中进行使用,JVM通过调用C的指令转汇编,从而使得代码生效。本文将简单聊聊博主对Java类加载机制相关知识的理解。一、Class字节码生成原理这对于大多数开发者而已,应该耳熟能详,...

2020-10-22 10:05:49 284 1

原创 通俗易懂的Mybatis工作原理

作为半自动的ORM框架,Mybatis被越来越多的企业接受。搞清楚它的工作原理以及底层实现,对于开发者可事半功倍。很多文章都是使用大批量的源码流程去分析原理。对于有源码阅读功底的开发者,也许还能招架住,但还是不直观。我以前的很多文章都是这么做的,后来有朋友私信建议说,这些文章类似于个人笔记,只能自己阅读,不利于分享,所以,本文将尝试采用通俗易懂的白话文带领大家认识一下Mybatis的工作原理。(PS:大家可以设想,如果自己在开发Mybatis,该如何设计好Mybatis的功能呢?)一...

2020-10-15 17:40:41 5125 3

原创 万恶503

遇到问题不可怕,可怕的是问题来源广泛,不知从何下手,相信从事研发的小伙伴都会感同身受。前段时间一直被503 service temporarily unavailable这个错误搞得焦头烂额,很多用户吐槽,操作页面不定时会弹出这个503的nginx错误,查询tomcat日志,没有异常信息,查询我们自己的nginx(注意:后面还有一个外部的nginx)日志,也未见异常。可是复现起来也有些难度,毕竟开发和测试环境都正常,只有生产环境不定时踩雷,为调试增加难度。昨夜加班处理时,为了排查到底是to.

2020-10-13 15:39:55 393 2

原创 JDK定时线程池源码解读

最近在研究线程池的底层原理时,忽然想起来之前遇到的一个面试题:“你可以自己手写一个可定时的线程池吗?” 转念一想,spring的定时任务不就是干这个的吗?所以当时想的是采用Timer的方式去处理,面试官不是很满意,反问:“Timer的底层有了解过吗?”场面陷入尴尬,犹豫了一会儿,只能红着脸败下阵来。JDK自带的线程池有四种,大家耳熟能详。其中固定长度、缓存以及单例的实现方案对比定时线程池较为简单,大家可以自行研究。本文主要分享记录帝都的雁在研究定时线程池源码时的一些思路和理解。分享之前,需.

2020-09-24 15:11:44 304 1

原创 分布式锁

随着业务的升级和用户量的飙升,单一节点的系统几乎很难维持这么庞大的数据请求交互。为此,足智多谋的程序猿们发明了分布式架构。使得请求通过负载均衡或其他策略降低单台服务器的访问压力,但随着系统的分解,很多分布式的问题也随之浮出水面,比如分布式事务、分布式锁等等。本文,将为大家介绍一些主流的分布式锁。(PS:需要有Redis和zk的API基础,本文不做案例展示,只分析原理)一、分布式锁概念锁的概念相信大家耳濡目染(我的前几篇博文中有相关介绍),它能确保单一JVM在高并发情况下的线程安全性。比.

2020-09-17 15:06:17 150

原创 AQS的傀儡之Lock锁

源于蚂蚁课堂的学习,点击这里查看(老余很给力) Java锁的武林纷争中,存在两大阵营。分别是以Synchronized为首的Java内置关键字对象,自动维护锁的持有和释放,还有就是以Lock锁为代表的Java自定义锁。在之前的博文中,帝都的雁已为大家介绍了Synchronized派系的渊源,本文则重点聊聊Lock锁的那些花边新闻。 Lock锁,是Java并发包下的一个类,其API的使用功能在本文不做介绍,感兴趣的读者可自行阅读源码或查阅相关资料。本文重点介绍Lo...

2020-09-10 10:47:40 429

原创 实战解决生产环境OOM的问题

需要先来一波小小的吐槽,OOM真特么坑爹啊!!!各种原因都有可能导致OOM!!而且如果根据程序抛出的异常来定位问题,无异于大海捞针!!为了帮助大家避免弯路,分享一下自己处理OOM的过程和心得。怀着开机混底薪的轻松心疼走进办公室沏了一杯茶,打开CSDN浏览大家的佳作。突然钉钉中出现很多吐槽的声音,原来运营同事陆陆续续接到很多用户的投诉,反应系统卡慢甚至503问题。妈的,愉快的一天从接到BUG开始走向结束。远程连接服务器查询Tomcat日志,吃惊的发现出现大量OOM的异常信息,...

2020-09-02 17:27:01 757

原创 Synchronized的花花肠子

对于久经沙场的Java老手来说,锁的概念一定如雷贯耳。毕竟,在打赢并发和多线程的战役中,锁可谓举足轻重。伴随技术领域的推进,系统架构逐渐演变为微服务,锁的范围超脱单个JVM的管理,分布式锁开始替代传统JVM锁,崭露头角。凭借自身的灵活和高逼格的技术栈,收到大家的一致追捧。但由浅入深,JVM锁不意味着过时与淘汰,相反,它在众多业务中还是那么不可替代。JVM锁的家族中,Synchronized一骑红尘,广为流传。本文,帝都的雁就来为读者盘点Synchronized的那些花花肠子。(PS:需要有Java对...

2020-08-21 16:57:52 298

原创 volatile与JMM的那些恩怨情仇

源于蚂蚁课堂的学习,点击这里查看(老余很给力)一、前言谈起volatile,想必大家最多的影响无非其三大特性:线程可见性、防止指令重排序以及不能保证原子性。当然,初学者对于这些特性多数只能做到死记硬背,应付面试。工作中对于其真正的原理及实现方式,可能甚至还达不到一知半解。而若要对volatile的原理娓娓道来,需要先引入它的老冤家JMM了。二、JMMJMM(Java Memory Model),即Java内存模型。其主要是按照CPU的工作方式,将内存空间模型化。如下图:...

2020-08-12 16:16:56 415

原创 线程安全的天选之子ThreadLocal

源于蚂蚁课堂的学习,点击这里查看(老余很给力)一、前言 物欲横流的信息时代下,性能和效率是产品在百花齐放中脱颖而出的致胜法宝。作为软件研发人员,在物理硬件固定的情形中,如何确保程序高效吞吐赫然是必备的看家本领。而提升效率就会涉及老生常谈的多线程处理,那么对于这种高效手段需要注意的线程安全问题,相比很多猿友一定耳濡目染了,今天帝都的雁为大家带来一种线程安全的技术手--ThreadLocal。(PS:需要有JVM垃圾回收、强引用、软引用、弱引用以及虚引用等相关理论基础)二、用...

2020-08-07 15:58:21 178

原创 为什么对研发情有独钟

相信很多猿仔都和我一样,学到知识总想着在实际工作中快速用到,这样就算暴露处理错误,也方便我们加深对知识的理解。 不才,年初想着使用策略+模板方法的设计模式去重构我们项目中臃肿的代码,上去就是一通撸。经过自测之后,满意地露出了淫荡的笑容...然而,之后的工作时间中,总会有一些匪夷所思的数据出现,比如,短信接收者吐槽不是他的数据,为何他收到短信;再者,数据不一致等现象。 仔细检查代码,也没发现我这惊为天人的代码逻辑有何不妥之处,而且自己反复测试还是没有问题复现,故想着莫非用户...

2020-07-28 16:19:10 663

jvm详解(调优参数等).doc

jvm详解

2020-06-04

JVM调优实战.doc

JVM调优实战

2020-06-04

java反汇编指令.doc

java反汇编指令

2020-06-04

史上最全的四级地址库.sql

史上最全中国四级地址sql

2020-05-11

ZooInspector.zip

zookeeper连接工具(java语言编写), 使用说明:双击 ZooInspector/build/zookeeper-dev-ZooInspector.jar即可

2020-05-07

nginx_check.sh

lvs+keepalived+nginx整合时,所需要的配置文件及其对应的心跳脚本

2020-04-30

keepalived.conf

lvs+keepalived+nginx整合时,所需要的配置文件及其对应的心跳脚本

2020-04-30

RabbitMQ.xmind

初步学习rabbitmq,对其下载配置,学习使用进行一个粗粒度的记载

2019-07-29

lodop使用手册11111111111111111

lodop开源使用手册,里面有详细的接口使用介绍以及购买权限说明

2019-03-13

空空如也

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

TA关注的人

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