- 博客(86)
- 资源 (2)
- 收藏
- 关注
原创 妈妈再也不用担心我搞不懂——log4j/logback/log4j2原理了
本文深入浅出地介绍log4j、logback、log4j2的核心原理,通俗易懂。
2022-12-02 15:11:18
874
转载 使用JVM工具:HSDB查看动态代理生成的代理类
利用JVM工具:HSDB查看动态代理类对象的实现:既可以看jdk生成的动态代理对象,也可以查看cglib生成的动态代理对象。
2022-09-28 21:01:31
678
原创 idea配置代码自动格式以避免被代码检测工具扫出格式问题
通常公司的代码检测工具会对代码的格式进行多维度的限制,而这些限制可以通过在idea的Code Style中进行配置,并通过Reformat Code一键格式化,idea针对各种场景的配置项很多,可以根据代码检测工具检测出的具体场景寻找对应的配置,一键解决代码格式问题。
2022-03-01 15:56:26
858
原创 学习Flink,看这篇就够了
大数据计算分为离线计算和实时计算,其中离线计算就是我们通常说的批计算,代表技术是Hadoop MapReduce、Hive等;实时计算也被称作流计算,代表技术是Storm、Spark Streaming、Flink等。本文系统地介绍了流式计算的相关知识,并着重介绍了Flink的实现原理细节,便于大家快速地理解和掌握流式计算,并基于Flink完成业务开发。1、流式计算和批处理批处理在大数据世界有着悠久的历史。批处理主要操作大容量的静态数据集,并在计算过程完成后返回结果。所以批处理模式中使用的数据集通常
2021-10-29 16:42:03
1470
原创 Java读写文件
private List<String> readListFromFile() { List<String> list = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader("/tmp/list.txt"))) { String tmpStr; while ((tmpStr = .
2021-08-19 09:55:35
264
原创 基于aop的注解对方法调用前后打日志
注解:@Target({METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MethodLog { /** * 请求是否打日志 * @return */ boolean reqLog() default true; /** * 返回是否打日志 * @return */ boolean respLog() default true;}
2021-08-18 22:25:34
356
原创 领域驱动设计之我见
前言2004年,Eric Evans 发表了《Domain-Driven Design –Tackling Complexity in the Heart of Software 》(领域驱动设计)这本书,简称Evans DDD,书里对领域驱动做了开创性的理论阐述。它为我们提供了设计软件的一个全新视角,同时也给开发者留下了一大难题:如何将领域驱动设计付诸实践?Vaughn Vernon的《实现领域驱动设计》则分别从战略和战术层面详尽地讨论了如何实践DDD,其中包含了大量的最佳实践、设计准则和对一些问
2021-04-25 11:59:41
445
1
原创 dbunit实现原理及最佳实践
在使用dbunit写单元测试时,强烈建议先熟悉其底层的实现原理,否则可能导致测试数据库中的数据被清空的风险(尽管测试数据不如线上数据重要,但如果大量的测试数据被清空,导致测试环境不可用,数据恢复起来还是很头疼的!!)。参考博客1简单介绍了dbunit的实现原理:第一步:事先把数据表里的数据以XML的格式导出来;第二步:运行每一个测试之前先把当前数据表里的数据清空;第三步:把XML里的数据再导进数据表;第四步:数据表回到了单测前的状态。由此可见,在单测的第二步中,会将数据表里的数据清空。如果你
2020-10-13 17:13:50
2419
转载 秒杀系统+页面静态化+CSI SSI ESI
1、https://www.cnblogs.com/jifeng/p/5264268.html 淘宝秒杀系统详解2、https://www.mayiwenku.com/p-1104910.html高访问量系统的静态化架构3、https://phl.iteye.com/blog/2022733动态缓存技术之CSI,SSI,ESI
2020-09-28 00:28:57
405
转载 ThreadLocal原理简介
ThreadLocal的原理每个Thread内部维护着一个ThreadLocalMap,它是TheadLocal的一个内部类,如下为部分代码:static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */
2020-09-27 11:55:40
396
转载 Mysql学习之order by的工作原理
在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。查询语句为:select city,name,age from t where city='杭州' order by name limit 1000 ;全字段排序为避免全表扫描,我们需要在 city 字段加上索引。通常情况下,这个语句执行流程如下所示 : 初始化 sort_buffer,确定放入 name、city、
2020-09-26 11:59:16
434
转载 Redis HyperLogLog 算法原理即内部数据结构
找到两篇不错的介绍hyperloglog的博客,推荐如下:https://www.jianshu.com/p/55defda6dcd2 探索HyperLogLog算法(含Java实现)https://zhuanlan.zhihu.com/p/43426875深度探索 Redis HyperLogLog 内部数据结构
2020-09-26 11:40:11
263
原创 数据库分库分表平滑扩容方案
背景参考博客1给出了一种所谓的平滑帅气的秒级扩容的架构方案,但个人却认为,这个看似没有什么问题的方案在实际中几乎没什么用处,业界也几乎不会用这种方案来进行扩容(分库分表)。为了便于说明这一点,本文先简单回顾下该方案,然后分析该方案为什么没有用,最后给出两种业界广泛使用的分库分表的平滑扩容方案。双主扩容方案回顾如图所示,假设当前用户库user分布在两个实例上,ip0和ip1,服务层通过用户标识uid取模的方式进行寻库路由,模2余0的访问ip0上的user库,模2余1的访问ip1上的user库。
2020-09-26 00:11:35
2199
原创 七种垃圾回收器
推荐阅读博客:1、https://www.cnblogs.com/oldtrafford/p/6883796.htmlG1垃圾收集器入门-原创译文2、https://www.jianshu.com/p/548c67aa1bc0G1从入门到放弃(一)3、https://www.jianshu.com/p/870abddaba41G1垃圾收集器之RSet4、https://www.jianshu.com/p/0a5b26691b77CMS和G1的回收过程5、https://blog...
2020-09-10 18:06:40
607
原创 什么?一对多场景下的exists子查询比join连表查询快这么多?
两张表连表查询可以使用join、exists和in等方式,其中exists和in都属于依赖子查询。参考博客1给出了三种方式使用场景。本文记录一次将join查询转换成exists查询后,性能得到了20倍以上的提升。现有收货单(delivery_order)和收货明细(delivery_sku)两张表。很明显,一个收货单对应多个收货明细。现在有一个需求是根据商品名称或skuId模糊匹配查询包含该sku的收货单列表。通常基于join方式的查询语句为:select dOrder.* fro
2020-09-09 23:42:33
1990
原创 缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题
对于高并发的业务场景,常用的技术手段包括黑白名单、限流防刷、熔断降级、兜底、隔离、多级缓存(客户端、CDN、NGINX、内存缓存、分布式缓存)等等。这些手段相互结合,才能应对高并发场景下的各种细分场景。本文总结了缓存方案需要考虑的几个问题。第一,关于缓存穿透,是指大量访问缓存和数据库中都不存在的数据。对此,可以考虑使用参考博客1和2中提到的两种方案:缓存空对象(对应key数量有限、key重复请求概率较高的场景)和布隆过滤器(对应key数量有限、key重复请求概率较高的场景和key各不相同、key重复请求
2020-09-08 00:37:43
1004
转载 4+1视图
即用例视图或场景视图、逻辑视图、实现视图或开发视图、部署视图或物理视图、过程视图或处理视图,详见:https://zhuanlan.zhihu.com/p/112531852?utm_source=wechat_session&utm_medium=social&utm_oi=1168468442910011392...
2020-09-06 14:22:55
410
原创 MySQL数据表之间字符集不同连表查询报错
ALTER table table_name COLLATE=utf8mb4_general_ci;ALTER TABLE table_name convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;to be continue...
2020-09-02 18:52:31
1913
原创 偏向锁与hashcode能共存吗?
我们都知道,Java对象头的结构如下:内容 说明 备注 Mark Word 存储对象的Mark Word信息 - Class Metadata Address 存储指向对象存储类型的指针 - Array Length 数组的长度 只有数组对象有该属性 其中,在32位机器下,Mark Word的存储结构如下:锁状态 23 bits 2 bits 4 bits 1 bit 2 bits 轻量级锁 指向
2020-08-29 23:36:57
4377
8
原创 nohup command > out.file 2>&1 & 命令详解
参考博客:1、https://blog.csdn.net/longgeaisisi/article/details/905196902>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别2、https://www.cnblogs.com/kcxg/p/11076461.htmlLinux里的2>&1究竟是什么3、https://www.cnblogs.com/jianlilistu/p/9...
2020-08-29 10:15:23
2890
原创 微服务下rpc调用的客户端和服务端实现原理
一个端口对应一个服务的情况(客户端每个rpc client对应一个连接池,服务端每个服务对应一个线程池):图中红色竖线代表rpc调用的客户端stub和服务端skeleton,每个rpc服务对应一个端口。客户端每个服务对应一个连接池,服务端每个服务对应一个线程池,用于响应客户端的请求。通常情况下,客户端和服务端是长连接。单端口多服务场景下,默认配置的情况(客户端每个rpc client对应一个连接池,服务端一个端口下的所有服务共用一个线程池):单端口多服务是指rpc调用的服务端多个服.
2020-08-27 22:02:33
1625
原创 multi-paxos、raft和zab协议的核心区别
Google Chubby的作者Mike Burrows曾说:“这个世界上只有一种一致性算法,那就是Paxos,其它算法都是残次品。”由此可见,实际上raft、zab等一致性算法都是在paxos的基础上通过增加或者调整一些限制条件演进而来的。本文就是结合自己的理解,来分析这些算法在演进过程中所做的取舍。本文不打算再具体介绍每种算法的过程,如果不熟悉的可以先阅读文末的参考资料。《从Paxos到ZooKeeper分布式一致性原理与实践》这本书参考资料:1、《从Paxos到ZooKeepe..
2020-08-23 10:45:15
3310
4
原创 jvm之safepoint、safeRegion和OopMap
前情说明本博客只是对文末的参考博客进行一个简单的汇总整理,不能算原创,但无奈csdn没有“整理”这种类型,因而还是挂成了原创。将这些零散的博客整理到一起有两方面的考虑:一方面是方便自己以后回顾,另一方面也方便大家进行系统性地学习。正文safepointJVM在很多场景下使用到safepoint,最常见的场景就是GC的时候。对一个Java线程来说,它要么处在safepoint,要么不在safepoint。Garbage collection pauses Code deoptimizat
2020-08-09 17:32:55
766
1
原创 MySQL生成毫秒级别的时间戳
REPLACE(unix_timestamp(current_timestamp(3)),'.','')执行如下指令:select current_timestamp(3);将得到如下结果:2020-08-08 12:09:42.192执行如下指令:select unix_timestamp(current_timestamp(3))将得到如下结果:1596859992.347执行如下指令:select REPLACE(unix_timestamp(curre.
2020-08-08 12:15:16
9621
1
原创 java中断机制深入分析之Thread源码跟踪
Thread.interrupt()源码中有这样一句注释:Just to set the interrupt flag。如果说Thread.interrupt()方法只是修改了中断标记_interrupted的值,那么已经放弃cpu、处于阻塞状态的thread线程如何能感知到这个变量已经被改变,从而立即抛出InterruptedException呢?真相只有一个,那就是这个注释是错的!!!
2020-08-02 21:49:38
792
1
原创 Unsafe类park和unpark方法源码深入分析(mutex+cond)
转发一张经典的mutex和condition配合使用的图:参考博客:1、http://blog.sina.com.cn/s/blog_967817f20101bsf0.html
2020-07-18 11:36:22
3102
1
转载 如果你们的系统 CPU 突然飙升且 GC 频繁,如何排查
转载自:https://maimai.cn/article/detail?fid=1339344060&efid=JunjWu4-ReMYOR4mnJeiCQ
2020-07-18 11:34:11
362
原创 JDK字符串存储机制及String#intern方法深入研究
在jdk7或jdk8中执行如下代码:public static void main(String[] args) { System.out.println("第一组对比:"); System.out.println("======"); String s1 = "1" + new String("2"); String s2 =...
2020-02-24 23:28:20
767
5
原创 IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
参考博客:1、https://blog.csdn.net/jbboy/article/details/46828917MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)2、https://www.cnblogs.com/moss_tan_jun/p/6909565.html MySQL auto_increment的...
2020-02-15 17:26:55
2595
11
原创 Java反序列化源码深入追踪
众所周知,Java 原生的序列化方法可以分为两种:实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。 实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。实际上,Externalizable接口继承自Seria...
2020-02-08 21:40:15
970
原创 利用Code39字体将文本转换为code39条形码--Java版
在项目开发过程中,遇到一个需求,需要将大量商品信息存储到excel中,供用户下载。其中商品的upc字段需要是条形码,以方便用户用扫码枪扫描。常见的方案是将upc转换为条形码的图片。但在项目中发现, 当商品的数量为数千时,会因为文件太大而无法下载。考虑到可以在客户端安装一些条码字体,从而在服务端就无须生成条形码图片,即使商品数量为数千,其下载文件也很小。利用Code128字体将...
2020-01-05 21:42:32
2252
3
原创 tsl和cas
TSL是Test and Set Lock的缩写,是CPU提供的一个原子指令,其工作如下所述:它将一个存储器字读到一个寄存器中,然后在该内存地址上存一个非零值。读数和写数操作保证是不可分割的——即该指令结束之前其他处理机均不允许访问该存储器字。执行TSL指令的CPU将锁住内存总线(实际是锁缓存)以禁止其他CPU在本指令结束之前访问内存。操作系统的Mutex就是基于TSL指令实现的。CAS是Co...
2019-12-06 18:49:00
1829
原创 JAVA ClassLoader双亲委派机制细节研究
我们都知道,Java类都是靠ClassLoader来加载的,而类加载器也是java类,因而java类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个加载器正是BootstrapClassLoader。由于它不是Java类,因此它不需要被别人加载,而嵌套在Java虚拟机内核里面,也就是JVM启动的时候Bootstrap就已经启动,它是用C++写的二进制代码(不是字节码),它...
2019-11-25 21:11:44
423
原创 ElasticSearch之index type mapping
生活中的数据总体上可以分为两种:结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和音频、视频信息等。...
2019-11-14 23:27:48
1024
转载 ElasticSearch倒排索引
一、倒排索引倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。以文档为例,通过文档id索引文档中出现的单词叫正排索引,而通过单词反向索引包含该单词的文档叫做倒排索引。倒排索引的样子:Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Ter...
2019-11-14 23:17:09
884
原创 常见的保障盘点结果准确性的方法和盘点差异的处理方法
前言盘点,即通过实物清点结果和账面库存进行对比,发现两者差异并及时调整该差异,以保证库存的实时准确性,并追溯差异产生的原因。这里的准确性包括数量的准确性、存放位置的准确性、存货质量的准确性等。盘点的目的之一是保证库存准确性,但不恰当的盘点方法反而会导致库存变得不准确。另外,当盘点出现差异时,恰当的处理方法可以帮助发现库存管理中潜在的问题,从而优化库存管理。本文将介绍常见的保障盘点结果准确性的常...
2019-11-13 15:21:06
7672
转载 Spring如何解决循环依赖问题
在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的。这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。本文主要针对这个问题,从源码的角度对其实现原理进行讲解。1. 过程演示关于Spring bean的创建,其本质上还是一个对象的创建,既然是对象,读者朋友一...
2019-11-12 10:38:36
361
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人