自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

天瑕的博客

你今天的日积月累, 早晚会成为别人的望尘莫及;

  • 博客(65)
  • 收藏
  • 关注

原创 较真儿学源码系列-ConcurrentHashMap(逐行源码带你分析作者思路)

你知道ConcurrentHashMap在Java 8中的实现是有bug的吗?而且还不止一处!

2020-09-10 18:53:59 1887 4

原创 较真儿学源码系列-AQS(逐行源码带你分析作者思路)

你知道ReentrantLock、Semaphore和Java中的阻塞队列是如何实现的吗?

2020-09-10 18:53:40 2016 2

原创 在线文档生成:Swagger

现在的项目开发都是前后端分离,前端和后端是两拨人在开发,所以这就涉及到前后端人员的接口交互了。如果使用自己维护的接口文档或口口相传的话,很容易出现接口更新不及时的问题。这个时候就需要像Swagger这样的在线文档生成框架出马了。更新接口信息并重新部署后,接口文档也会随之更新,同时Swagger也支持在线的接口调试功能。

2023-09-30 14:13:29 589

原创 MySQL分批插入/更新数据

由上可以看到,代码简化了很多(上面的goodsSkuBO2MerchantDOList方法只是将BO转成DO,和分组逻辑没有关系)。在我们的日常开发中,经常会使用到批量insert/update的语句来实现相关的业务功能。上面BATCH_NUMBER的值是50,意味着当修改商品的数量大于50的时候,会以50个数据为一批,分批的执行;而如果修改商品的数量不大于50的时候,就直接一次执行就够了。上面是我们自己手写的分批代码,而如果每个方法都这么写,也未免太过于繁琐了。

2023-09-27 23:42:09 1246

原创 设计模式之策略模式

假如说现在需要实现个方法,获取订单商品的价格。因为订单类型的不同,计算价格的方式也会有所不同。//获取子单//获取子单商品//实物订单//卡券订单//会员订单case VIP:default:实物订单的商品取原价,卡券订单的商品取原价*1.1,会员订单的商品取原价*0.9。上面只是一个简单实现的demo,计算价格的代码只有一行。而如果计算订单商品价格的逻辑比较复杂的话,这个方法将会变得异常臃肿,而且也不利于扩展。

2023-09-27 19:44:10 616

原创 较真儿学源码系列-PowerJob MapReduce源码分析

MapReduce是一种编程模型,以及在集群上使用并行、分布式算法处理和生成大数据集的相关实现。一个MapReduce程序由一个map过程和reduce方法组成,map过程执行过滤和排序(例如按名字将学生分成不同的队列,每个名字一个队列),reduce方法执行聚合操作(例如计算每个队列中的学生人数,得出姓名的频率)。“MapReduce系统”(也称为“基础设施”或“框架”)通过调度分布式服务器、并行运行各种任务、管理系统中各部分之间的所有通信和数据传输以及提供冗余和容错机制来协调处理过程。

2023-09-27 10:15:09 632 1

原创 较真儿学源码系列-PowerJob时间轮源码分析

你知道任务调度框架是如何实现延迟执行任务的吗?

2023-09-26 17:29:41 670

原创 较真儿学源码系列-PowerJob启动流程源码分析

其中介绍了PowerJob的功能特点,以及与其他调度框架的对比,这里就不再赘述了。以上是PowerJob的架构图,取自官网。可以看出,PowerJob是典型的客户端/服务端交互的架构(但是在PowerJob中却没有一般分布式中间件会有的注册中心)。本文就从启动流程出发,来一起探究下PowerJob在启动阶段中都做了些什么动作。

2023-09-26 15:41:27 1333

原创 企业级购物车实现思路

之前有幸在公司的项目中完成了购物车模块的从0到1以及之后的优化工作。而在这之前我在网上查询相关资料的时候,发现要不就是一些最简单的入门实现,要不就是实现得不够完善、没有考虑实际。所以在这里我想把我具体的实现分享出来,供大家参考(注:本文不会涉及到具体的代码细节,只是一个大概的实现思路)。 因为用户退出app后再打开,还是能看到自己对购物车最新的修改内容,所以实际上每一次用户对购物车的操作都是需要请求到后端进行落库的(在我这里的实现中,商品的选中状态是由前端自己保存的)。很自然而然地就会想到可以

2022-07-14 16:04:27 1904 2

原创 较真儿学源码系列-HashSet(逐行源码带你分析作者思路)

HashSet是如何实现元素去重的?

2022-07-09 02:46:46 348 1

原创 较真儿学源码系列-InheritableThreadLocal(逐行源码带你分析作者思路)

ThreadLocal无法实现父子线程变量的共享?来看看InheritableThreadLocal

2022-05-30 10:59:21 479

原创 较真儿学源码系列-MyBatis整合Spring核心流程源码分析

在我们使用MyBatis时,大部分情况下都不是单独使用的,都是需要和Spring进行集成后再使用。那么下面就来看下MyBatis是如何与Spring进行集成的(我之前写过对MyBatis源码进行分析的文章《较真儿学源码系列-MyBatis核心流程源码分析》,建议看一下,因为我下面的分析都是基于此之上再进行分析的)。

2022-05-20 22:39:09 491

原创 设计模式之责任链模式

“当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。”1 简介通过责任链模式,你可以为某个请求创建一个对象链。每个对象依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象。链中的每个对象扮演处理器,并且有一个后继对象(successor)。如果它可以处理请求,就进行处理;否则把请求转发给后继者。通过责任链模式,我们可以将一个复杂的功能拆分成多个子模块(前提是这些子模块的逻辑高度统一),每个子模块...

2022-05-11 16:24:28 365

原创 较真儿学源码系列-MyBatis核心流程源码分析

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置,并将原始类型、接口和Java POJO映射到数据库的记录中。现在国内的开发环境不知道从什么时候开始传出一种风气,不管开发出什么框架,都要往大而全的方向写,或者说是自己搞个生态,重复造轮子(可能是国内竞争压力大,导致越来越卷)。而MyBatis那种大道至简的源码设计风格,是非常能切中我的点的。

2022-05-08 11:39:25 620

原创 Java反射工具:Reflections

反射作为Java的高级特性之一,通过它,我们可以在程序的运行期间动态地去操作类的属性或方法。相比于直接调用,反射调用的执行速度会偏慢,所以不建议在常规的业务代码中使用。但是因其灵活性和扩展性比较高,往往会被用来作为封装框架或组件的底层技术之一。通过Java本身的反射代码来进行开发的话,往往会比较繁琐(这里就不举例子了,我看着那些反射代码就头疼...)。而且如果考虑不周的话(例如包路径的问题),可能本地跑的反射代码能正常运行,等部署到测试环境就不能运行了。本着不重复造轮子的...

2022-05-01 03:18:09 2738

原创 关于关联商品数据与商品主数据之间的一致性问题的一些思考

在最近的工作中遇到了一个问题。就是关于商品主数据和关联商品的数据一致性问题。比方说现在有一个商品主数据spuA。同时现在有一个促销套包的需求,套包里面会添加商品。如果这次这个套包里添加的商品是spuA的话,那么在前端展示的促销套包里面的商品的状态应该怎么取呢(商品名称/价格/上下架等等信息)?因为这是个普遍性问题,所有需要保证一致性的、添加商品数据的需求都会存在这个问题,所以我想单独提出来,写出我的思考和最终的解决办法。1 主动查询第一种方案是促销套包里面不存商品的信.........

2022-04-29 12:43:21 930

原创 如何优雅地记录操作日志?

如果操作日志上的动态参数很简单的话、通过业务方法上的参数即可完成拼接,那么确实可以使用上面的语法规则来进行快捷操作。但是很多的情况下是需要自己写一些复杂的逻辑来进行拼接的,这个时候就可以使用自定义函数的功能。/*** 日志记录自定义函数* 注:实现类必须定义成Spring Bean的形式** @since 2022年04月23日 11:27**//*** 是否在目标方法前执行*/}/*** 方法名* 注:需要保证全局唯一,建议加上项目名前缀*//*** 自定义函数*/

2022-04-27 02:36:22 4382 6

原创 MyBatis分页插件PageHelper自定义分页逻辑实现

同时目前仅支持MySQL单表的分页操作,对于多表连接的分页需求,我这里暂时是没有自定义实现的,会退化成默认的追加limit子句的方式来实现(如果一定要实现,是否可以考虑使用视图View来实现?在看了看PageHelper源码中相关的实现后发现,PageHelper的分页逻辑是写在了AbstractHelperDialect类中,而不同的数据库分页实现是通过继承实现抽象方法的方式来实现的。上面是后台打印的日志,因为我这里的user表的主键是id字段,所以可以看到是能成功分页出来的。,感兴趣的可以查看。

2020-11-29 15:02:35 5169 7

原创 较真儿学源码系列-Spring MVC核心流程源码分析

Spring MVC核心流程源码分析

2020-10-24 22:38:56 462

原创 较真儿学源码系列-Spring Cloud Netflix Eureka核心流程源码分析

Spring Cloud Netflix Eureka核心流程源码分析

2020-10-24 04:48:26 560

原创 较真儿学源码系列-Spring Boot自动装配核心流程源码分析

Spring Boot自动装配核心流程源码分析

2020-10-13 23:04:50 648 1

原创 较真儿学源码系列-Spring事务管理核心流程源码分析

Spring事务管理核心流程源码分析

2020-10-13 21:36:50 575

原创 较真儿学源码系列-Spring AOP核心流程源码分析

Spring AOP核心流程源码分析

2020-10-10 18:39:28 660 1

原创 较真儿学源码系列-Spring IoC核心流程源码分析

Spring IoC核心流程源码分析

2020-10-08 16:30:19 723

原创 较真儿学源码系列-ScheduledThreadPoolExecutor(逐行源码带你分析作者思路)

你知道定时线程池是如何实现延迟执行和周期执行的吗?

2020-09-26 14:54:55 1652 1

原创 较真儿学源码系列-ThreadLocal(逐行源码带你分析作者思路)

你真的以为ThreadLocal的实现很简单吗?

2020-09-16 22:36:56 761

原创 较真儿学源码系列-ThreadPoolExecutor(逐行源码带你分析作者思路)

面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?

2020-09-10 18:54:10 2433 1

原创 较真儿学源码系列-ArrayList(逐行源码带你分析作者思路)

ArrayList你真懂?说说foreach与iterator时remove的区别

2020-09-10 08:57:53 781

原创 较真儿学源码系列-Netty核心流程源码分析

因为NIO的类库和API比较繁琐,使用起来比较麻烦,开发的工作量和难度都非常大,例如客户端面临断连重连、网络闪断、心跳处理、半包读写、网络拥塞和异常流的处理等等。所以Netty对Java自带的NIO API进行了良好的封装,解决了上述问题。且Netty拥有高性能、吞吐量更高、延迟更低、减少资源消耗、零拷贝直接内存等优点。所以Netty可以很方便地实现出一个网络通信系统,比如聊天服务器或弹幕系统(我曾经使用Netty实现过一个简易聊天室的demo,感兴趣的话可以查看《Netty实现简易聊天室的功能》)。

2020-08-14 21:19:07 2487 1

原创 MySQL MVCC底层原理详解

MySQL MVCC底层原理详解

2020-07-25 05:46:44 22176 29

原创 较真儿学源码系列-HashMap(逐行源码带你分析作者思路)

你是否想过互联网公司一面为什么总爱问集合?聊聊经典数据结构HashMap

2020-07-16 15:24:14 1396 1

原创 synchronized锁的升级过程

synchronized锁的升级过程

2020-07-15 23:06:23 5831

原创 Netty实现简易聊天室的功能

使用Netty来实现一个聊天室是很容易的,当有客户端连接服务端的时候,在服务端的channelActive方法里面即可感应到。这里的解决方案是发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4位是数据的长度,应用层处理时可以根据长度来判断每条数据的开始和结束。同理,channelInactive是该客户端断开服务端时会回调的方法,在里面给其他客户端发一条“下线了”的信息即可。如果数据长度不够length,就等待下一次数据过来,取数据的时候也只取length长度的数据。

2020-05-05 22:02:03 2529

原创 Netty实现心跳检测机制

Netty实现心跳检测机制

2020-05-05 17:11:15 1321

原创 BIO & NIO & AIO

BIO & NIO & AIO

2020-05-02 18:09:27 573

原创 RabbitMQ实现的模拟订单库存上下游服务可靠性投递(延时检查方案)

模拟一个下订单成功,然后库存减1的业务场景,以上是流程图。除了RabbitMQ自身的可靠性投递之外,该方案会在30秒后发送一条延时检查的消息,判断消息有没有成功入库,如果没有,则会重新发起一次消息,做二次确认,避免因网络抖动导致消息投递失败的情况。GitHub源码:​​​​​​​。

2020-04-24 17:30:03 874

原创 自定义类加载器以及打破双亲委派模型

自定义类加载器以及打破双亲委派模型

2020-04-08 17:05:15 3237

原创 HotSpot垃圾收集器概述

如果说垃圾收集算法(标记-清除算法、复制算法、标记-整理算法)是内存回收的方法论,垃圾收集器就是内存回收的具体实现(以下垃圾收集器介绍仅限于HotSpot虚拟机,截止到Java 12)。

2020-04-08 15:25:17 567

原创 JVM内存分区

JVM内存分区

2020-04-08 15:17:14 627

原创 MySQL查询优化

MySQL查询优化

2020-04-06 18:30:05 1016

空空如也

空空如也

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

TA关注的人

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