- 博客(74)
- 资源 (2)
- 问答 (2)
- 收藏
- 关注

原创 Java 探针技术:java agent
在JVM中运行中,类是通过classLoader加载.class文件进行生成的。在类加载加载.class文件生成对应的类对象之前时,我们可以通过修改.class文件内容(就是字节码修改技术),达到修改类的目的。JDK提供了对字节码进行操作的一系列api,而使用这些api开发出的程序就可以称之为java agent。......
2022-06-13 18:20:43
9608
21

原创 攻破zookeeper选举流程(附带手写实现)
本文主要讲解zookeeper选举原理,然后手写zookeeper选举流程,手写版本更加精简,便于理解分布式中间件选举落地的实现。
2021-12-06 17:16:43
2390
6

原创 由源码深入Java类加载器(双亲委派模型)
JVM类加载器JVM主要有以下几种类加载器:引导类加载器主要加载JVM运行核心类库,位于JRE的lib目录下,如rt.jar中的类。扩展类加载器主要加载JVM中扩展类,位于JRE的ext目录下。应用程序类加载器主要负责加载ClassPath路径下的类,也就是业务类。自定义加载器负责加载用户自定义路径下的类。类加载器关系...
2021-07-16 17:06:25
21648
16
原创 应用启动:OOM command not allowed when used memory > ‘maxmemory‘
应用启动的时候出现报错:OOM command not allowed when used memory > ‘maxmemory‘根据报错信息,应该是redis内存不够导致的异常。
2023-08-04 09:40:55
3318
原创 Java开发必备技能:RocketMQ
官方文档可见:https://github.com/hiwei-zhang/rocketmq/tree/develop/docs/cnRocketMQ由以下这几个组件组成负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。生产者中,会把同一类Producer组成一个集合,叫做生产者组,这类Producer发送同一
2022-12-15 15:27:58
1794
原创 java开发必备技能:mysql
数据库性能取决于多种因素,例如表的结构、查询语句和服务器配置等。在数据库级别进行优化:如表结构的优化,存储引擎的选择,mysql的配置等。在硬件级别进行优化:如使用SSD硬盘,CPU和内存优化。在使用级别优化:优化sql语句,集群架构,读写分离。
2022-12-15 15:27:18
936
原创 Spring扩展点
如何在所有Bean创建完后做扩展?方式一Spring在容器刷新完成后会注册ContextRefreshedEvent。所以可以自定义事件监听器监听该事件进行扩展。监听器实现:@Componentpublic class ContextRefreshedEventListener implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEven
2022-05-01 12:30:00
328
4
原创 通过代码理解分布式事务:XA模式
什么是XA?看百科:XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准。Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持。XA协议采用两阶段提交方式来管理分布式事务。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。资源管理器(RM):就是一种存储数据的服务,例如Mysql和Oracle。事务管理器(TM):在分布式系统中,每个系统的有自己单独的本地事务,如何让这些事务组成一个完整的事务?这就是事务管
2022-04-20 18:05:16
1159
7
原创 zookeeper总结
什么是zookeeper?官方文档上这么解释zookeeper,它是一个分布式协调框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。文件系统数据结构:监听通知机制客户端注册监听它关心的任意节点,或者目录节点及递归子目录节点。如果注册的是对某个节点的监听,则当这个节点被删除,或者被修改时,对应的客户端将被通知如果注册的是对某个目录的监听,则当这个目录有子节点被创建,或者
2022-03-25 16:14:33
2076
1
原创 spring+springmvc+mybatis原理总结(附流程图)
本文主要分析spring、springmvc和mybatis架构原理,绘制多张流程图,便于理解ssm框架底层设计原理。
2022-03-22 19:42:47
1315
原创 手写限流框架:限流算法落地实现
项目描述本项目是基于Springboot开发的限流工具starter,开箱即用。提供限流兜底扩展点和业务异常处理扩展点,便于自定义降级逻辑。限流模式立即拒绝:采用滑动窗口算法,精准限流排队等待:采用漏桶算法,能设置超时时间,进行请求排队等待限流。使用方式打jar包到本地引入依赖 <dependency> <groupId>com.hiwei</groupId> <artifact
2022-03-12 15:43:31
526
原创 springboot starter如何在宿主应用启动完成后进行启动?
在微服务架构中,我们使用的spring cloud是非常依赖springboot的。许多中间间都有对starter的支持,有时这些starter是需要在业务应用启动完成后再进行加载启动的。例如nacos的client,需要在业务应用启动完成后再进行服务注册。springboot应用启动完成后会发布ServletWebServerInitializedEvent事件,ServletWebServerInitializedEvent继承了WebServerInitializedEventclass
2022-02-28 19:16:33
355
原创 mysql知识点总结
存储引擎MySQL中的存储引擎查看存储引擎:show engines;查看mysql文件存储位置show variables like ‘%dir%’;datadir下存储的是数据文件。Innodb和MyISAM比较建两张表:student和teacherstudent使用的引擎为Innodb,teacher使用MyISAM。create table student( id int(11) not null primary key, uname varchar(20),
2022-02-17 10:15:48
833
原创 深入理解JVM虚拟机
类加载器类加载器:引导类加载器 BootstrapLoader:负责加载支撑JVM运行的核心类库,例如rt.jar/charset.jar扩展类加载器ExtClassLoader:负责加载支撑JVM运行的扩展类库,jre/lib/ext目录下的jar应用类加载器AppClassLoader:负责加载classpath目录下的类,就是加载你自己写的类。自定义类加载器:加载注定路径下的类类加载流程:双亲委派机制:在JVM启动时,会由扩展类加载器加载一个单例的sun.misc.Launcher
2022-02-14 14:54:25
1288
2
转载 5分钟搞懂MySQL行转列
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里 MySQL行转列,对经常处理数据的同学们来说,一定是不陌生的,甚至是印象深刻,因为它大概率困扰过你,让你为之一愣~ 但当你看到本文后,这个问题就不在是问题,及时收藏,以后谁再问你这个问题,......
2022-01-13 16:40:29
939
原创 Redis持久化
Redis的持久化方式Redis的持久化有两种方式:RDB和AOF,redis默认采用的是RDB的方式。RDB在默认配置中,Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中。可以配置持久化策略:save N M,让redis在“N秒内至少有M个改动”才会触发一次rdb持久化操作。例如redis的默认策略有:save 900 1 -- 900秒内至少有一个改动save 300 10 -- 300秒内至少有10个改动save 60 10000 -- 60秒内至少
2021-11-05 21:45:00
30103
9
原创 Redis五种数据类型及使用场景
redis的数据类型redis主要支持五种数据类型:string、list、hash、set、zsetredis有很多命令,我们可以查看文档,也可以通过help查看命令:help @stringhelp @listhelp @hashhelp @sethelp @sorted_set例如执行:help @stringstring操作命令及使用场景string常用命令字符串常用操作SET key value; -- 存入一个字符串键值对MSET key1 value
2021-11-05 20:15:00
4182
10
原创 Tomcat是如何启动Spring项目的?
tomcat加载spring IOC流程tomcat在启动ServletContext容器的时候会发布ServletContextEvent事件。Spring就通过实现ServletContextListener接口,监听该事件来监听ServletContext的生命周期。web.xml配置spring IOC配置文件:Spring中ContextLoaderListener实现了ServletContextListener接口:对ServletContext启动监听:在initWebApp
2021-10-26 11:16:19
4960
原创 Spring的Aware机制到底是干什么的?
Aware接口源码分析Spring中定义了Aware接口,该接口并未定义方法。该接口更多的是一个标记的作用,具体方法由子类去定义和实现。Spring内置的许多类都实现了该接口:以ApplicationContextAware为例:ApplicationContextAware接口定义了一个设置应用上下文的方法。该接口的实现类实现该方法,可以做对上下文处理的逻辑。该aware还要对应一个BeanPostProcessor才能生效。Spring中内置了一个ApplicationContextAw
2021-10-19 10:57:28
9401
原创 再简单不过的雪花算法
雪花算法在分布式部署的情况下,生成唯一Id的生成显得很麻烦。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求,得益于twitter内部牛逼的技术,雪花算法流传至今并被广泛使用。它至少有如下几个特点:能满足高并发分布式系统环境下ID不重复基于时间戳,可以保证基本有序递增(有些业务场景对这个又要求)不依赖第三方的库或者中间件生成效率极高雪花算法原理组成:1bit符号位(0)+ 41bit时间戳 + 10bit机器号 + 12bit序列41bit时间戳,支持约69年。
2021-10-09 10:48:28
3382
原创 Spring监听器
监听器的使用定义事件public class DemoEvent extends ApplicationEvent { private String name; public DemoEvent(Object source, String name) { super(source); this.name = name; } public String getName() { return name; }
2021-09-30 17:42:45
3273
原创 50行代码手写线程池
JVM使用的线程模型是KLT(Kernel Level Thread)模型。KLT是内核级线程模型,线程的创建、阻塞、销毁等操作都是在内核空间进行的。所以在对线程进行操作的时候,要进行用户态和内核态的交换,这个交换是比较耗时。所以为了减少线程频繁创建销毁带来的开销,所以使用池化技术来解决这个问题。
2021-09-29 14:38:17
3143
原创 Java高并发累加器Striped64
原子类在多线程环境下,常用累加操作方式是使用原子类进行累加,例如AtomicInteger、AtomicLong。但是使用原子类在多线程高竞争的情况下,CAS会经常失败,并发效率会大大降低。因为CAS操作失败后要自旋再次进行替换,这样失败的线程就会大量消耗CPU资源。所以在高并发的场景下使用原子类累加器并不是很好的选择。Striped64Striped64是一种高并发累加器,有效解决了原子类累加的弊端。Striped64将线程竞争的操作分散开来,每个线程操作一个cell,而sum则等于base和所
2021-09-07 21:03:41
3493
原创 mysql事务
事务的特性(ACID)原子性(Atomicity)一个事务的操作要么全部成功,要么全部失败。例如事务内有两个操作:insert into student (id,name,age) values (1,'zhangsan',18);update student set age = 20 where id = 2;如果其中任意一条sql执行失败,则这两条sql都要失败,不能成功更新数据。一致性(Consistency)一致性,其实就是要保证结果是预期要达到的结果。而原子性、隔离性和持久化就
2021-06-24 11:32:22
3083
2
原创 docker安装mysql并使用
mysql安装拉取镜像docker pull mysql:5.7查看镜像:docker images;启动容器dodocker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7查看运行的容器:docker ps;进入容器docker exec -it 6002d9cd5075 /bin/bash;进入mysql:mysql -u root -p;选择dat
2021-06-15 16:24:56
3125
原创 详解字典树:trie
字典树又称前缀树,我们根据前缀可以快速查找出该前缀的单词。例如google的搜索:基本结构代码实现:class TrieNode{ public Character c; public boolean hasWord; public HashMap<Character,TrieNode> children = new HashMap<>(); public TrieNode(){ } public TrieNode(Cha
2021-05-28 10:17:51
3106
关于js字符串一直累加,无法重新赋值的问题
2017-11-11
QueryRunner query()为何返回多余空对象?
2017-11-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人