随笔分类 - Java
摘要:成规模后的业务系统,一般都会走到微服务拆分的阶段。虽然这种方式有各种弊端,但也有显而易见的好处。 先说好处: 业务按从属范围可以做到内聚较高,仅在边界处通过接口耦合 资源的管控更细腻,提升资源利用率 团队职责更明晰,成员技能更深入专注,进而更好的反馈业务价值 多业务线协作更顺畅,敏捷模式有一个良好的
阅读全文
摘要:在业务上,对于热点key的定义一般有如下特征: 访问频次较大 访问在时间维度有稠密稀疏等明显区别 key的数量规模可大可小 数据可能有一定的刷新需求 那什么场景下会存在这种热点key呢? 典型场景如: 缓存读: 首页 商品详情 一般打开应用或者小程序之类的,默认会跳转到首页,故而这个页面的数据日常流
阅读全文
摘要:高并发场景下,如果需要锁的存在,可以视对锁的需求来处理,比如仅做数值统计,条件翻转,严格串行,逻辑唯一,允许重试等。不同的情况有不同的处理方式。 数值统计&条件翻转 针对数值统计,可以依赖Atomic下的各种计数器来实现。但是,如果竞争线程非常多,竞争激烈的场合,还可以进一步使用比如LongAdde
阅读全文
摘要:Synchronized是jvm提供支持的锁,和Lock有很多区别。 针对Synchronized,jvm支持不同层次的实现。按竞争烈度来说,Synchronized会有偏向锁,轻量级锁,重量级锁等3种类型。 针对对象而言,在对象头上的Mark word上会存储锁信息(包括:偏向线程ID、偏向时间戳
阅读全文
摘要:因为之前使用mybatis,都是直接使用的mybatis-spring-boot-starter,通过这个starter模块间接引入的mybatis。目前使用的版本到了2.1.3,其使用的mybatis版本为3.5.5。 切换项目组后,使用了通用mapper,基于tk.mybatis模块间接依赖的m
阅读全文
摘要:spring通过一个容器的概念,引入父子容器结构,实现bean的隔离&继承结构。 这种模式在很多场合都有类似的设计,比如Java的classloader机制,OSGi的bundle机制等。 这种机制的优势,在于将对象的作用范围进行约束。在复杂环境下,可以通过限定作用范围使得有冲突的内容和谐共存。 接
阅读全文
摘要:作为常用的orm框架,mybatis承接了SQL的预编译,执行,响应结果映射等SQL处理的各个环节。在这里整理下这个框架的一些知识点,方便后续复习。 原生的mybatis初始化流程如下图所示: 在XMLConfigBuilder中针对xxxMapper.xml文件进行了初始化,转换成了MapperS
阅读全文
摘要:很多业务场景都需要防重复提交,比如提交订单,抢券,组团等场景。 在这里,主要陈述下一般的防重复提交方式。具体归类,会分为新增场景,更新场景。重复提交可以分为几种类型,比如: 短时间连续重复提交; 不定时间重复提交; 新增场景 新增场景无论是短时间连续重复提交还是不定时间重复提交,都是相似的解决方案。
阅读全文
摘要:一个秒杀系统的设计,涵盖若干要素。比如: 读写请求分离; 流量筛选; 读缓存; 写批量; 写串行; 预处理; 前端界面操作优化; dns优化; 自我保护; 每一个要素,都是解决一个具体的问题场景。 读写请求分离: 秒杀一般分为2个阶段,秒杀准备阶段,秒杀阶段。 在秒杀准备阶段,一般流量会逐渐上升,用
阅读全文
摘要:本文基于disruptor 3.4.2进行源码解读。 disruptor结构如下图所示: disruptor如何解决伪共享问题? 什么是伪共享? CPU从主存加载数据到工作内存时,是按缓存行的容量进行加载的。会按照空间临近的原则,加载变量所在缓存行的数据到工作内存。 当多个核心加载不同的变量处于同一
阅读全文
摘要:在springboot2.x集成log4j2时,始终无法关闭log4j2自身的日志输出。 已经做了如下配置: 在log4j2.xml的配置文件中,配置configuration的status属性为OFF; 确认系统所有地方无配置log4j2.debug; 如上配置都无法解决问题,只能从源码着手一探究
阅读全文
摘要:CPU的内存模型如下: 这种模式下,存在多核间缓存数据不一致的问题。为了解决这种问题,有2种硬件策略。 1.当一个CPU从主存读取缓存数据时,总线阻塞; 2.基于缓存一致性协议,当一个CPU读取到共享缓存时,如果某个CPU对共享缓存发生变更操作,会通知其它CPU缓存无效,触发其它CPU重新读主存。
阅读全文
摘要:在引入Spring的Validated时,需要声明如下bean: @Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(
阅读全文
摘要:对象空间分配流程如下: 针对这个流程,分别解释一下每一个选项的使用场景。 栈上分配: 栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态。 全局逃逸:一个对象的引用逃出了方法或者线程。 全局逃逸:一个对象的引用逃出了方法或者线程。 参数级逃逸:在方法调用过程中传递对象的引用到另一个方法。
阅读全文
摘要:cookie是什么? cookie是存储在浏览器中的纯文本,浏览器的安装目录会有专门的cookie文件夹存放各个域下设置的cookie。 cookie用途? 一般用于存储用户登录凭证,或者一些简单的业务信息。其容量有限,不适合存太多数据。 cookie如何使用? 如下所示,后端可以在response
阅读全文
摘要:在gradle中使用MyBatis Generator时,build.gradle配置如下: generatorConfig.xml文件的内容如下: 当引入扩展的mybatis generator的plugin时,要用mybatisGenerator,而不是compile。
阅读全文