自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 资源 (1)
  • 收藏
  • 关注

原创 Golang pprof的使用+一个性能调优的小例子

目录基本知识CPU分析页面查看实战问题描述分析过程Golang提供了性能分析大杀器 pprof,主要分为两种应用场景,一种是对于脚本程序,可以通过在代码里引入性能分析库来进行分析;另外一种就是今天的重点:普通web服务型应用,启动的时候同步配置好debug端口,就可以在应用运行中,随时对其进行性能分析。基本知识CPU分析查看30s内CPU的使用情况go tool pprof http://localhost:{debugport}/debug/pprof/profile?seconds=30执

2022-05-22 19:40:59 340

原创 RocketMQ搭建环境+跟随别人找bug(一)

RocketMQ搭建环境+跟随别人找bug(一)1.RocketMQ整体结构2.搭建RocketMQ本地调试环境3.复现bug4.怎么改这个系列是中间件源码阅读和找bug的第一篇~1.RocketMQ整体结构RocketMQ是阿里开源的消息队列,Java语言编写,比较好调试,作为从源码分析中间件的第一个~    整体比较清晰简单,传统消息队列的producer,consumer,broker,以及独有的nameserver。    nameserver 顾

2021-11-27 20:59:04 412

原创 Java跨线程传递数据

Java跨线程传递数据应用场景解决思路代码分析JVM中工具阿里开源应用场景     对于单服务来说,比如一个普通的商城的服务,有一个接口返回商品的信息,针对不同的国家/地区可能有不同的搜索结果,需要根据入参识别所属国家,并将这个国家信息传递到下游接口使用,我们首先会想到用Java中提供的threadlocal类来存储线程私有的变量,在入口处识别国家信息放入threadlocal,在后续的使用中直接从threadlocal中获取即可。(本质上是通过线程持有的threadlocalMap

2021-05-23 16:10:45 954 2

原创 MySQL中like查询是否会使用索引

MySQL中like查询使用索引explain查看执行计划实验过程Like 不走索引的优化explain查看执行计划首先介绍一下mysql explain的各项内容:序号名称含义备注1id查询的IDID相同从上往下执行,ID不同,越大越先执行2select_type查询类型SIMPLE 简单查询 PRIMARY 最外层的查询Union SUBQUERY 子查询。还有很多类型可以看官方文档 https://dev.mysql.com/doc/refman/5.6

2021-02-24 15:53:51 2760

翻译 提高编程水平的秘籍

提高编程水平的秘籍总览练习阶段(3-8周的认真coding)对初学者来说,学习知识最重要的是关注细节残酷的秘密何时进入下一阶段拐点(2-4周,保持好心态)在剩余的生命中,不断超越极限。web开发的两个拐点拐点后的结果拐点中学到的技能如何快速有效的通过拐点?怎么知道啥时候度过了拐点?原文总览    在编程学习曲线中,存在一个拐点,在拐点之后,你会发现一切都与之前不同,比起向其他人借力,自我驱动是更为有效的,通往拐点的学习曲线十分陡峭,但是一旦成功通过,会大大增强你的

2021-01-23 18:29:41 188

原创 Mockito&PowerMockito的原理与使用

Mockito&PowerMockito的原理与使用单元测试简介Java web项目单元测试JUnitSpring-TestMockito简单对象Mock对于复杂对象Mock(对象内部存在对其他bean的依赖)PowerMockitomock静态方法单元测试的编写提示Mock原理mockito的原理PowerMockito原理总结参考文献单元测试简介    写单元测试应该是每个初级程序员都很厌烦还不能跳过的一个大坑,理想的状态下,项目的单元测试应该至少覆盖

2021-01-10 16:52:26 2980

原创 优雅的在Java程序中打印日志

优雅的在Java程序中打印日志问题来源第一部分:常用的日志框架Log4j & Log4j 2Logback第二部分:SLF4J第三部分:日志滚动及其原理日志滚动配置日志滚动原理问题来源问题来源:来源于一次agent机器的磁盘空间报警,追查的过程中发现是日志的锅(业务使用的过程中不规范,我们本身没有兜底的日志策略,错误日志打印的太多,撑死了磁盘)兜底策略——限制日志大小上限,采用滚动写日志的方法解决这个问题第一部分:常用的日志框架Log4j & Log4j 2这两个项目都是apac

2020-09-07 22:59:56 960

原创 MySQL并行复制策略详解

  之前提到过,当备库执行大事务的时候可能会造成主从延迟,除此之外,当从库的binlog执行能力小于主库的时候,也会造成延迟。所以我们需要尽可能的让从库的执行采用并发的方式。  在主库上,事务之间通过各种锁来控制并发执行的过程,在从库上,官方5.6版本之前,MySQL只支持单线程复制。由此在主库并发高、TPS高时就会出现严重的主备延迟问题。如果需要采用多线程进行复制,则要最重要的是解决如何分发任务的问题。采用轮询方式无法严格控制worker的执行次序(也就是被CPU调度的顺序),可能会发生数据不一致的问题

2020-06-14 16:13:08 348

原创 MySQL高可用机制分析

  主从复制的过程如下:    主库执行事务记录binlog,然后将binlog发送到从库,最后从库执行这个binlog。  主从延迟时间可以在从库上使用show slave status进行查询    主从延迟的主要原因:    1. 从库机器的性能本来就比主库差    2. 备库压力过大    3. 存在大事务  主备切换可靠性优先策略执行过程:    1. 判断备库B现在的seconds_behind_master,如果小于某个值(比如5秒)继续下一步,否则持续重试这一步;    2

2020-06-06 21:34:49 147

原创 MySQL主从一致原理

MySQL主从一致原理MySQL主从同步过程binlog日志格式参考文献MySQL主从同步过程  一般MySQL的备库会设置成read-only,以避免发生数据不一致等情况,注意这个read-only对于超级用户无效(binlog可以正常执行),事务日志同步的过程如下:在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。在备库B上执行start slave命令,这时候备库会启动两个线程,分别为io

2020-05-30 19:46:56 262

原创 MySQL如何保证数据不丢

MySQL如何保证数据不丢Binlog写入机制Redo log写入机制组提交技术Binlog的格式Binlog写入机制  事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。系统给binlog cache分配了一片内存,每个线程一个,参数 binlog_cache_size用于控制单个线程内binlog cache所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。  Binlog的写入有两个阶段:  1. write,

2020-05-23 09:38:35 214

原创 MySQL数据库临时提高性能的方法

MySQL数据库临时提高性能的方法短连接风暴慢查询问题参考文献短连接风暴  连接数量超过max_connections时,新来的连接会被拒绝。这时有一些临时解决办法(注意这些办法都是有损的)kill掉那些占用连接但未进行事务操作的线程,注意如果数据库端主动断开连接,客户端是不能立刻感知的。让数据库建立连接时跳过权限验证阶段,重启数据库,并使用–skip-grant-tables参数启动,注意这样对于存在外网IP的数据库是十分危险的慢查询问题索引没设计好  这时可以用online DDL增加

2020-05-13 09:34:28 148

原创 MySQL锁与间隙锁

  首先MySQL引入间隙锁是为了解决幻读的问题。间隙锁之间并不产生冲突,但间隙锁与插入数据之间会产生冲突。间隙锁的引入,可能会导致同样的语句锁住更大的范围,影响并发度。MySQL加锁的规则十分复杂并且随着版本更新进行变动,整体的加锁规则如下,包含了两个“原则”、两个“优化”和一个“bug”(所有都是在可重复读的隔离级别)  原则1:加锁的基本单位是next-key lock,next-key lock是前开后闭区间。  原则2:查找过程中访问到的对象才会加锁。  优化1:索引上的等值查询,给唯一索引

2020-05-11 10:06:28 474 2

原创 MySQL查询何时会被阻塞

MySQL查询何时会被阻塞由于没有拿到MDL读锁  可以通过show processlist命令查看线程状态为:Waiting for table metadata lock,这时需要找到锁住这个表的线程,通过select blocking_pid from sys.schema_table_lock_waits,然后kill掉对应的线程即可。被flush阻塞  这时show proce...

2020-05-06 10:34:36 688

原创 MySQL中如何优雅的随机取出数据

MySQL中如何优雅的随机取出数据方法一方法二参考文献  很多时候可能会涉及到随机从数据表中取出几条记录,例如单词APP锁屏显示单词这种,这个功能的实现方法有很多方法一  通过MySQL的order by rand()来实现。  如:select word from words order by rand() limit 3;使用explain对语句进行解析,可以看到Using tempo...

2020-04-25 09:33:15 2552 1

原创 MySQL order by工作机制

  当使用order by对查询结果进行排序时,MySQL会给每个线程分配一块儿内存sort_buffer用于排序,在使用索引的情况下,整个的排序过程如下所述:  1. 初始化sort_buffer,确定放入结果中所需的字段;  2. 从索引中找到第一个满足条件主键id;  3. 到主键id索引取出整行,取所需字段的值,存入sort_buffer中;  4. 从索引中取下一个记录的主键id...

2020-04-24 10:38:14 243

原创 MySQL日志与索引QA

  首先再明确一下MySQL的两阶段提交过程,如下图所示:  如果在时刻1 数据库宕机,则将事务回滚  如果在时刻2 数据库宕机,则如果binlog 已经完整写好,则提交事务;否则回滚事务。  Binlog存在固定的完整格式,statement格式的binlog,最后会有COMMIT;row格式的binlog,最后会有一个XID event,除此之外,还有check sum来进行内容校验。而...

2020-04-23 09:48:18 134

原创 MySQL count(*)详解

MySQL count(*)详解count实现原理不同count的性能区别参考文献count实现原理  与其他的功能类似,count(*)的实现方式也与MySQL存储引擎紧密相关,MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;而InnoDB引擎每次都需要把数据一行一行地从引擎里面读出来,然后累积计数,因为InnoDB存在MVCC机制,所...

2020-04-22 09:26:08 2186

原创 MySQL表空间回收

MySQL表空间回收表空间分析数据删除流程online与inplace的区别optimize table、analyze table和alter table这三种方式重建表的区别参考文献表空间分析  表删掉了一半的数据,表文件的大小还是没变,这背后的原因是什么呢?  首先本文的全部分析依赖于InnoDB存储引擎,一个InnoDB表包含两部分,即:表结构定义和数据。表数据既可以存在共享表空间里...

2020-04-21 09:56:50 506

原创 MySQL抖动原因分析

MySQL抖动原因分析数据库抖动定义InnoDB刷脏页控制策略参考文献数据库抖动定义  一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短,这样的情况我们一般称为数据库抖动。  我们知道,与操作系统概念类似,当内存数据页与磁盘数据页内容不一致的时候,则将内存数据页称为脏页,将脏页写回磁盘的过程称为flush...

2020-04-20 09:46:55 1101

原创 MySQL索引选择问题

  在进行数据查询的时候,MySQL优化器会自动为查询语句选择合适的索引,索引选择的正确与否对MySQL的执行速度有很大影响。使用explain语句可以查询得到执行计划的详细内容,而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的CPU资源越少,当然除了扫描行数之外也有其他...

2020-04-18 10:10:05 223

原创 MySQL普通索引与唯一索引

MySQL普通索引与唯一索引查询语句性能分析更新语句性能分析change buffer总结参考文献  当我们需要在一个唯一字段上建立索引时,究竟是建立普通索引还是唯一索引的性能更好呢?这时需要从两个角度考虑查询语句性能分析  对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。  对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的...

2020-04-17 10:50:59 327

原创 MySQL MVCC机制详解

MySQL MVCC机制详解MVCC分析参考文献MVCC分析  MySQL默认的事务隔离级别是可重复读,在事务开始时获得一致性视图,但更新数据时需要拿到行锁,如果与其他事务出现冲突需要进行等待,等待后获得锁再进行更新操作时读到的值是最新值还是创建一致性视图时的值呢?下面我们通过一个实验来验证。  下面为一张表的创建语句:mysql> CREATE TABLE `t` ( `id`...

2020-04-16 10:12:55 242

原创 MySQL行锁及其性能优化

MySQL行锁及其性能优化行锁死锁与死锁检测参考文献行锁  行锁针对数据表中行记录的锁,需要存储引擎支持,MyISAM不支持,InooDB支持, 在InnoDB事务中,行锁在需要时才加上,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,所以如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放,以减少对性能的损耗。死锁与死锁检测  MySQL中处理死锁有两...

2020-04-15 09:24:02 603

原创 MySQL全局锁和表锁

MySQL全局锁和表锁全局锁表锁参考文献全局锁  对整个数据库加锁,语句为:Flush tables with read lock (FTWRL),加锁之后不可以进行增删改,也不能做DDL,是一个整库只读的状态,一般只有在做全库逻辑备份时才需要全局锁。可以看到,如果采用这种方式对库加锁的话,虽然保证了一致性,但十分影响业务。所以,应该尽量少采用这种方法,在数据的隔离级别中,可重复读也保证了在一...

2020-04-14 09:56:33 132

原创 MySQL索引

MySQL索引索引概念索引覆盖最左前缀索引下推参考文献索引概念  索引的概念如同书籍中的目录,是为了提高数据的读写效率,在MySQL中,索引是在存储引擎层面实现的。索引之所以可以加快读写速度是因为数据模型的优秀,常见的用于索引的数据模型有三种:哈希表、有序数组、搜索树。  哈希表将数据按照K-V的模式存储,整体是无序的,所以只适用于等值查找,无法进行MySQL中常见的区域查找,常用于Memc...

2020-04-11 11:26:48 77

原创 MySQL事务隔离

MySQL事务隔离基础知识实现事务启动长事务参考文献基础知识  事务简单来说,就是保证一组数据库操作要么全部成功,要么全部失败。MySQL中,在引擎层实现事务支持,其中InnoDB支持事务,MyISAM不支持事务。在InnoDB中提供四种隔离级别从低到高为:读未提交、读已提交、可重复读、串行。随着隔离级别的提高,事务执行的效率会降低。不同数据库的默认隔离级别并不相同,Oracle默认的隔离级别...

2020-04-10 08:48:25 85

原创 MySQL的Redo log与binlog

MySQL的Redo log与binlogRedo logbinlog总结Redo log  又称为重做日志。我们知道数据库中更新数据需要访问磁盘IO并精确找到所在的行进行操作,这一过程耗时较长,对于用户来说体验很差,MySQL采用Redo log的方式对此进行了优化,将更新操作先记录在Redo log中,然后等到合适的时机再将操作刷到磁盘中去。这种优化又称为WLA:Write-Ahead L...

2020-04-09 09:32:21 107

原创 MySQL基础架构

MySQL基础架构总体介绍模块介绍连接器查询缓存分析器优化执行器参考文献总体介绍    MySQL基础的架构图如下图所示,主要分为Server和存储引擎两部分。其中Server部分负责大部分核心功能,实现跨存储引擎的存储过程等,此外,常见的内置函数也都在Server的部分负责实现。而存储引擎的部分负责数据存储与提取,是可插拔的,常见的存储引擎包括Inno...

2020-04-08 10:47:41 113

原创 Java 线程状态blocked 和 waiting 的区别

Java 线程状态blocked 和 waiting 的区别BLOCKED状态WAINTING状态TIME_WAINTING状态BLOCKED状态线程处于BLOCKED状态的场景。当前线程在等待一个monitor lock,比如等待执行synchronized代码块或者使用synchronized标记的方法。在synchronized块中循环调用Object类型的wait方法下面展示一些...

2020-03-16 11:47:18 1061

原创 IDEA生成Java doc

在tools中选择 generate Javadoc,然后如下配置,即可生成 UTF-8 -charset UTF-8 -windowtitle "test"

2020-03-16 11:36:47 73

原创 Java 动态代理详解

在Java中,可以采用如下的方式进行动态代理 先定义一个接口A 再定义一个它的实现 继续定义一个代理类,主要注意其实现InvocationHandler 在main中可以这样进行实现: 执行结果如下:所以问题来了:为什么可以将这个这个ProxyA的实例给绑定a进行强制转换呢?它究竟是个啥? 其实是动态生成了一个...

2019-10-08 09:58:18 136

原创 Java try/catch的实现原理与性能

首先,try/catch怎么写呢?如下图所示: 那么try catch到底在JVM底层是如何实现的呢? 首先明确一个概念,在Java中如果不发生异常的话,try/catch其实不会造成任何性能损失。这是如何做到的呢首先,在Java文件编译成为字节码之后,其实正常流程与异常处理部分是分开来的,如下图所示: ...

2019-05-06 13:56:40 5064

原创 JVM 编译

Java宣称自己是write once, run everywhere.那这是如何做到的呢?大部分人都会回答说是通过编译成为class文件然后运行JVM上,那么是所有的情况下都这样吗?自然有例外,其实总的来说,编译在JVM代表三个不同的操作。前端编译,指的是.java文件变为.class的过程 JIT编译,指的是将热点字节码编译为机器码的过程(方法级) AOT编译,指的是直接将Java...

2019-05-06 13:52:33 319

原创 Java 协程

协程是啥? 我们都知道,线程是CPU调度的基本单位,但是到底设置多少个线程是很难决定的,并且如果一个线程陷入了IO等待的话,会降低整个系统的吞吐量。在Java中,每个线程对应JVM以及操作系统的一个轻量级线程。因为stack的容量是有限的,所以不可能一直生成很多个线程。 协程的本质上其实还是和上面的方法一样,只不过他的核心点在于调度那块由他来负责解决,遇到阻塞操作,...

2019-04-29 17:15:33 1327

原创 求一个二进制串mod 3的余数

求一个二进制串mod 3的余数 这是某BAT公司技术面三面的一道代码题目,没做出来,现在整理一波 首先,第一个思路是将这个二进制串转换为十进制,然后再进行计算,但是这个肯定不是面试官想要的答案,对于很长的二进制串不能转换为十进制数字。 下面讲第二个思路,状态机(其实可用于求mod任何数的情况) 整个状态机分为三个状态,0,1,2,分别代...

2019-04-22 13:23:52 1879

原创 Redis 的设计与实现——(七)Redis持久化机制

RDB持久化 由于Redis是内存数据库,所以当数据库down的时候,所有数据都会丢失,为了防止数据的丢失,我们采用RDB将数据库状态保存为文件。首先生成RDB文件的命令有两个:SAVE 和 BGSAVE SAVE命令会阻塞Redis服务器,直到RDB文件创建完成 BGSAVE则不阻塞服务器,创建一个子进程进行保存 RDB文件生成后,...

2019-04-16 17:34:14 117

原创 Redis 的设计与实现——之(六)Redis数据库的实现与过期机制

Redis服务器的数据库实现~redisServer 在启动的时候默认启动16个数据库,每个redisClient有自己连接的db,记录在redisClient的db属性里,客户端可以切换自己链接的db.不难理解,其实每个db都有一个dic字典,保存key与value,我们的set也是将key与value设置到里面,删除、更新同理。在对键进行访问时,会维护lru、更新dirty值等信息如下...

2019-04-16 17:32:14 328

原创 原 Redis 的设计与实现——数据结构实现之(五)Redis对象

对象 Redis并没有直接用上面的几种数据结构实现kv数据库,而是将他们组合成为不同对象。Key对象与value对象。对象的数据结构定义如下:(zset为有序集合)下面是对象类型与实现的关系:字符串对象——String当为小于32位的整数时(因为ptr*是四个字节)存储为int 当为小于32字节的字符串时:embstr(浮点数也是保存为字符串) 当大于3...

2019-04-15 21:25:04 114

原创 Redis 的设计与实现——数据结构实现之(四)压缩列表

Ziplist 是Redis中对于少量列表项的实现用于hash和list的实现,是由连续的内存块组成的数据结构,主要是为了节约内存,没有一个struct:其中每个节点的entry的值为:其中previous_entry_length用于保存前一个节点的长度,当前一个结点长度在254之内,则该属性只有一个字节,否则该属性由5个字节组成,其中第一个字节为0XFE。这个属性当然是为了从后...

2019-04-15 21:21:35 128

8puzzle-testing.zip

8-puzzle,测试代码,用于学习Coursera,进行相关的测试与验证。Coursera是免费大型公开在线课程项目,由美国斯坦福大学两名计算机科学教授创办。旨在同世界顶尖大学合作,在线提供免费的网络公开课程。Coursera的首批合作院校包括斯坦福大学等

2020-05-13

空空如也

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

TA关注的人

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