自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 资源 (2)
  • 收藏
  • 关注

原创 妈妈再也不用担心我搞不懂——log4j/logback/log4j2原理了

本文深入浅出地介绍log4j、logback、log4j2的核心原理,通俗易懂。

2022-12-02 15:11:18 633 1

转载 使用JVM工具:HSDB查看动态代理生成的代理类

利用JVM工具:HSDB查看动态代理类对象的实现:既可以看jdk生成的动态代理对象,也可以查看cglib生成的动态代理对象。

2022-09-28 21:01:31 536

原创 mac环境下java、maven、git、rsa等配置

mac环境下java研发相关环境配置教程

2022-03-10 23:28:50 816

原创 idea配置代码自动格式以避免被代码检测工具扫出格式问题

通常公司的代码检测工具会对代码的格式进行多维度的限制,而这些限制可以通过在idea的Code Style中进行配置,并通过Reformat Code一键格式化,idea针对各种场景的配置项很多,可以根据代码检测工具检测出的具体场景寻找对应的配置,一键解决代码格式问题。

2022-03-01 15:56:26 659

原创 学习Flink,看这篇就够了

大数据计算分为离线计算和实时计算,其中离线计算就是我们通常说的批计算,代表技术是Hadoop MapReduce、Hive等;实时计算也被称作流计算,代表技术是Storm、Spark Streaming、Flink等。本文系统地介绍了流式计算的相关知识,并着重介绍了Flink的实现原理细节,便于大家快速地理解和掌握流式计算,并基于Flink完成业务开发。1、流式计算和批处理批处理在大数据世界有着悠久的历史。批处理主要操作大容量的静态数据集,并在计算过程完成后返回结果。所以批处理模式中使用的数据集通常

2021-10-29 16:42:03 1272

原创 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 199

原创 基于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 282

原创 领域驱动设计之我见

前言2004年,Eric Evans 发表了《Domain-Driven Design –Tackling Complexity in the Heart of Software 》(领域驱动设计)这本书,简称Evans DDD,书里对领域驱动做了开创性的理论阐述。它为我们提供了设计软件的一个全新视角,同时也给开发者留下了一大难题:如何将领域驱动设计付诸实践?Vaughn Vernon的《实现领域驱动设计》则分别从战略和战术层面详尽地讨论了如何实践DDD,其中包含了大量的最佳实践、设计准则和对一些问

2021-04-25 11:59:41 332 1

原创 dbunit实现原理及最佳实践

在使用dbunit写单元测试时,强烈建议先熟悉其底层的实现原理,否则可能导致测试数据库中的数据被清空的风险(尽管测试数据不如线上数据重要,但如果大量的测试数据被清空,导致测试环境不可用,数据恢复起来还是很头疼的!!)。参考博客1简单介绍了dbunit的实现原理:第一步:事先把数据表里的数据以XML的格式导出来;第二步:运行每一个测试之前先把当前数据表里的数据清空;第三步:把XML里的数据再导进数据表;第四步:数据表回到了单测前的状态。由此可见,在单测的第二步中,会将数据表里的数据清空。如果你

2020-10-13 17:13:50 2096

原创 java web请求执行流程

一图胜千言:

2020-09-29 10:59:24 535

转载 秒杀系统+页面静态化+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 348

转载 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 334

原创 Redis五种数据结构的底层编码

每种类型的对象都至少使用了两种不同的编码:

2020-09-26 17:35:28 565

转载 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 355

转载 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 204

原创 数据库分库分表平滑扩容方案

背景参考博客1给出了一种所谓的平滑帅气的秒级扩容的架构方案,但个人却认为,这个看似没有什么问题的方案在实际中几乎没什么用处,业界也几乎不会用这种方案来进行扩容(分库分表)。为了便于说明这一点,本文先简单回顾下该方案,然后分析该方案为什么没有用,最后给出两种业界广泛使用的分库分表的平滑扩容方案。双主扩容方案回顾如图所示,假设当前用户库user分布在两个实例上,ip0和ip1,服务层通过用户标识uid取模的方式进行寻库路由,模2余0的访问ip0上的user库,模2余1的访问ip1上的user库。

2020-09-26 00:11:35 1967

原创 七种垃圾回收器

推荐阅读博客: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 522

原创 什么?一对多场景下的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 1671

原创 缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题

对于高并发的业务场景,常用的技术手段包括黑白名单、限流防刷、熔断降级、兜底、隔离、多级缓存(客户端、CDN、NGINX、内存缓存、分布式缓存)等等。这些手段相互结合,才能应对高并发场景下的各种细分场景。本文总结了缓存方案需要考虑的几个问题。第一,关于缓存穿透,是指大量访问缓存和数据库中都不存在的数据。对此,可以考虑使用参考博客1和2中提到的两种方案:缓存空对象(对应key数量有限、key重复请求概率较高的场景)和布隆过滤器(对应key数量有限、key重复请求概率较高的场景和key各不相同、key重复请求

2020-09-08 00:37:43 866

转载 4+1视图

即用例视图或场景视图、逻辑视图、实现视图或开发视图、部署视图或物理视图、过程视图或处理视图,详见:https://zhuanlan.zhihu.com/p/112531852?utm_source=wechat_session&utm_medium=social&utm_oi=1168468442910011392...

2020-09-06 14:22:55 320

原创 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 1546

原创 偏向锁与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 4106 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 2549

原创 微服务下rpc调用的客户端和服务端实现原理

一个端口对应一个服务的情况(客户端每个rpc client对应一个连接池,服务端每个服务对应一个线程池):图中红色竖线代表rpc调用的客户端stub和服务端skeleton,每个rpc服务对应一个端口。客户端每个服务对应一个连接池,服务端每个服务对应一个线程池,用于响应客户端的请求。通常情况下,客户端和服务端是长连接。单端口多服务场景下,默认配置的情况(客户端每个rpc client对应一个连接池,服务端一个端口下的所有服务共用一个线程池):单端口多服务是指rpc调用的服务端多个服.

2020-08-27 22:02:33 1438

原创 multi-paxos、raft和zab协议的核心区别

Google Chubby的作者Mike Burrows曾说:“这个世界上只有一种一致性算法,那就是Paxos,其它算法都是残次品。”由此可见,实际上raft、zab等一致性算法都是在paxos的基础上通过增加或者调整一些限制条件演进而来的。本文就是结合自己的理解,来分析这些算法在演进过程中所做的取舍。本文不打算再具体介绍每种算法的过程,如果不熟悉的可以先阅读文末的参考资料。《从Paxos到ZooKeeper分布式一致性原理与实践》这本书参考资料:1、《从Paxos到ZooKeepe..

2020-08-23 10:45:15 3125 4

原创 jvm之safepoint、safeRegion和OopMap

前情说明本博客只是对文末的参考博客进行一个简单的汇总整理,不能算原创,但无奈csdn没有“整理”这种类型,因而还是挂成了原创。将这些零散的博客整理到一起有两方面的考虑:一方面是方便自己以后回顾,另一方面也方便大家进行系统性地学习。正文safepointJVM在很多场景下使用到safepoint,最常见的场景就是GC的时候。对一个Java线程来说,它要么处在safepoint,要么不在safepoint。Garbage collection pauses Code deoptimizat

2020-08-09 17:32:55 673 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 9063 1

原创 java中断机制深入分析之Thread源码跟踪

一、Thread.stop() VS Thread.interrupt()在jdk1.0时代,要终止一个Java线程,可以使用Thread提供的stop()和destroy()等方法,但这些方法在jdk1.4之后就已经不推荐使用了,原因是这些方法会强行关闭当前线程,并解锁当前线程已经持有的所有监视器(互斥锁、共享锁),这会导致被这些监视器保护的数据对象处于不一致的状态,其它线程可以查看到这些不一致状态的数据对象,从而导致各种不可预知的错误。在jdk1.4引入了另外一种结束线程的方式——中断。简单来说

2020-08-02 21:49:38 651 1

原创 Unsafe类park和unpark方法源码深入分析(mutex+cond)

转发一张经典的mutex和condition配合使用的图:参考博客:1、http://blog.sina.com.cn/s/blog_967817f20101bsf0.html

2020-07-18 11:36:22 2788 1

转载 如果你们的系统 CPU 突然飙升且 GC 频繁,如何排查

转载自:https://maimai.cn/article/detail?fid=1339344060&efid=JunjWu4-ReMYOR4mnJeiCQ

2020-07-18 11:34:11 260

原创 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 629 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 2411 11

原创 Java反序列化源码深入追踪

众所周知,Java 原生的序列化方法可以分为两种:实现 Serializable 接口:可以自定义 writeObject、readObject、writeReplace、readResolve 方法,会通过反射调用。 实现 Externalizable 接口:需要实现 writeExternal 和 readExternal 方法。实际上,Externalizable接口继承自Seria...

2020-02-08 21:40:15 846

原创 利用Code39字体将文本转换为code39条形码--Java版

在项目开发过程中,遇到一个需求,需要将大量商品信息存储到excel中,供用户下载。其中商品的upc字段需要是条形码,以方便用户用扫码枪扫描。常见的方案是将upc转换为条形码的图片。但在项目中发现, 当商品的数量为数千时,会因为文件太大而无法下载。考虑到可以在客户端安装一些条码字体,从而在服务端就无须生成条形码图片,即使商品数量为数千,其下载文件也很小。利用Code128字体将...

2020-01-05 21:42:32 1992 3

原创 tsl和cas

TSL是Test and Set Lock的缩写,是CPU提供的一个原子指令,其工作如下所述:它将一个存储器字读到一个寄存器中,然后在该内存地址上存一个非零值。读数和写数操作保证是不可分割的——即该指令结束之前其他处理机均不允许访问该存储器字。执行TSL指令的CPU将锁住内存总线(实际是锁缓存)以禁止其他CPU在本指令结束之前访问内存。操作系统的Mutex就是基于TSL指令实现的。CAS是Co...

2019-12-06 18:49:00 1507

原创 JAVA ClassLoader双亲委派机制细节研究

我们都知道,Java类都是靠ClassLoader来加载的,而类加载器也是java类,因而java类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这个加载器正是BootstrapClassLoader。由于它不是Java类,因此它不需要被别人加载,而嵌套在Java虚拟机内核里面,也就是JVM启动的时候Bootstrap就已经启动,它是用C++写的二进制代码(不是字节码),它...

2019-11-25 21:11:44 358

原创 ElasticSearch之index type mapping

生活中的数据总体上可以分为两种:结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和音频、视频信息等。...

2019-11-14 23:27:48 891

转载 ElasticSearch倒排索引

一、倒排索引倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。以文档为例,通过文档id索引文档中出现的单词叫正排索引,而通过单词反向索引包含该单词的文档叫做倒排索引。倒排索引的样子:Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Ter...

2019-11-14 23:17:09 729

原创 常见的保障盘点结果准确性的方法和盘点差异的处理方法

前言盘点,即通过实物清点结果和账面库存进行对比,发现两者差异并及时调整该差异,以保证库存的实时准确性,并追溯差异产生的原因。这里的准确性包括数量的准确性、存放位置的准确性、存货质量的准确性等。盘点的目的之一是保证库存准确性,但不恰当的盘点方法反而会导致库存变得不准确。另外,当盘点出现差异时,恰当的处理方法可以帮助发现库存管理中潜在的问题,从而优化库存管理。本文将介绍常见的保障盘点结果准确性的常...

2019-11-13 15:21:06 6920

转载 Spring如何解决循环依赖问题

在关于Spring的面试中,我们经常会被问到一个问题,就是Spring是如何解决循环依赖的问题的。这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。本文主要针对这个问题,从源码的角度对其实现原理进行讲解。1. 过程演示关于Spring bean的创建,其本质上还是一个对象的创建,既然是对象,读者朋友一...

2019-11-12 10:38:36 314

现代,RC.多尔夫.pdf 答案

现代控制系统答案,可以作为学习过程中的一个辅助参考

2012-03-12

vc6.0中出现Error_spawning_cl.exe_错误的解决办法

下载的vc6.0不能使用,尤其是免安装版的,其实是因为参数路径设置得不对,本文档交你如何改路径

2012-03-12

空空如也

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

TA关注的人

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