自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Just Do It!

努力到无能为力,拼搏到感动自己

  • 博客(530)
  • 资源 (2)
  • 收藏
  • 关注

原创 Spring AOP 实现日志记录功能

最近项目中需要记录日志,跟大家想的一样 ,利用spring aop去实现,之前也参考了一些代码,自己实现了一套设计,供大家参考。之前看到网上很多是基于切面类Aspect去实现了,在切面类中定义before after around等逻辑以及要拦截等方法。本文利用注解实现了一套可以扩展等日志记录模块。1. 定义注解@Target(ElementType.METHOD)@Retention(Rete...

2018-02-12 12:00:36 26493 8

原创 数据统计分析中Treemap 应用实战(排序以及查找离指定key最近的key)

1. 应用场景按天统计的逻辑利用hashmap进行存储,另外一篇文章已经提到。现在的问题是查询的交易记录表,如果当天没有交易记录,流量余额就是0,这个是不对的,应该是最近一笔交易记录时的流量余额。1.必须有序2.能够查询最近的一个key此时hashmap不能满足要求,试试treemap,map有序的首选。查询了一下api,竟然支持,我利用的是lowerKey方法Map.Entry<K,V&g...

2018-01-30 19:14:02 1629 1

原创 六边形架构落地代码分析

前言学习过DDD的朋友们都知道核心有个六边形架构,对于研发人员来说,理解之后如何落地很重要,talk is cheap,show me the code。从网上看到一个

2021-06-03 10:26:27 997 3

原创 Clean Architecture

两个价值维度对于每个软件系统,我们都对以通过行为和架构两个维度来休现它的实际价值。软件研发人员应该确保自己的系统在这两个维度上的实际价值都能长时间维持在很高的状态。不幸的是,他们往往只关注一个维度,而忽视了另外一个维度。更不幸的是,他们常常关注的还是错误的维度,这导致了系统的价值最终趋降为零。行为价值软件系统的行为是其最直观的价值维度。程序员的工作就是让机器按照某种指定方式运转,给系统的使用者创造或者提高利润。大部分程序员认为这就是他们的全部工作。他们的工作是且仅是:按照需求文档编写代码,并

2021-05-31 15:16:12 376

原创 DDD课程学习思考

领域驱动设计软件复杂度成因:规模:分解结构:边界变化:顺应变化方向隔离业务复杂度与技术复杂度;业务与技术是正交的。如果不用DDD,我们基本是数据建模,然后数据驱动设计。数据仅仅提供信息,实体是协作关系。 事务模型和贫血脚本根据模块划分的架构,对变化响应能力不足。全局分析阶段统一语言领域和子领域根据业务流程,梳理领域和子领域架构映射阶段识别BC,限界上下文,每一个BC其实就是一个业务单元。...

2021-05-27 13:28:14 1931 1

转载 架构思维第四篇

什么是技术架构系统架构 = 解决特定问题 + 要素 + 连接,结合这个公式,给技术架构下一个定义:技术架构 = 解决业务上的技术问题 + 技术方案 + 技术组件高并发技术架构本质问题有限的资源处理大量的请求系统性思考根据我们的思维,我们可以大致从以下几个角度来思考: 资源能力强弱:之前资源处理能力弱,能不能变强呢? 资源少的问题:能不能增加资源呢? 请求多的问题:能不能减少请求呢? 处理速度:如果能处理得更快,处理的请求就会更多。 注.

2021-05-27 10:08:44 164

转载 架构思维第三篇

技术架构-高扩展可扩展的意思是在面对变化时,用最少的代价去实现,平时我们听得最多的是面向抽象(接口)编程,如果只是把这里的抽象理解成接口,那么就有些狭隘了,抽象是通式通法,而接口只是其中一个,所以在谈可扩展实现之前一定要讲清楚可扩展的本质是什么,连本质都不知道,怎么提出系统性解决方案。扩展本质扩展的本质就是占位符,凡是可以表达变化的就是占位符。应对扩展的方法先给出应对可扩展的方法:规范、识别、注册、使用,这 4 点都是从上面可推导出来的,下面一一进行详细说明。 规...

2021-05-26 14:59:49 157

转载 架构思维第二篇

业务架构业务架构的特性,通过特性基本上就知道业务架构的大体框架。笔者通过 x、y 数轴加以说明,因为业务要体现出业务流程的流动性和业务的层次性,下面就说明这两个特性: 业务的流动性:其实这是业务生命周期的体现,从产生、拥用、使用可以看出业务的流动,这是横向的。 业务的层次性:笔者一般习惯用场景层、产品功能层、领域模型层、依赖层来画业务架构图,这是纵向的。场景层依赖下面的产品功能层,多个场景很有可能对应一个产品功能,产品的功能又是由领域模型来支撑的。 业务架...

2021-05-26 14:03:00 243 1

原创 架构思维第一篇

定义与实现解耦,运行时加载实现代表性实现方式就是java里面的SPI机制。比如mysql的驱动mysql-connector-java里面有个MATA-INF/services目录,里面定义具体驱动类,这些驱动类都实现Driver类接口。如下图所示:驱动加载类如下:系统的可扩展性可以遵循标准、识别、注册、运行总的法则去演化不同的具体的实现,可以根据实际的场景选择合适的方法,不再是 SPI,思维就会打开很多。如 Spring 通过 PostProcessor 开放了用户自定..

2021-05-26 11:21:28 379 2

原创 TMF2.0技术揭秘

面临的问题如何快速响应需求,加速发布周期----------建立全链路视角的需求管理机制(需求评估成本高,传递效率低等问题) 如何能为新小业务提供快速支撑,降低准入门槛----------降低准入门槛(平台可以裁剪,快速验证新小业务,POC) 是否足够开放,使得业务方能做到自助式扩展-------------业务与平台分离 新需求是否已经在其他事业部有可复用资产等------------资产可复用互联网系统是按领域服务建设的分布式架构。...

2021-05-22 09:43:52 601

原创 Spring boot starter 应用及原理

什么是spring boot starterSpring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增。在传统Maven项目中通常将一些层、组件拆分为模块来管理,以便相互依赖复用,在Spring Boot项目中我们则可以创建自定义Spring Boot Starter来达成该目的。使用案例java代码都是自动配置逻辑,前三个都配置在spring.factories文件中,spring boot会扫描jar包中的spring.factories文件进行调用执

2021-05-19 15:50:20 269

原创 Caffeine缓存性能算法&布隆过滤器

算法优化缓存最重要的是命中率,我们知道,普通的缓存主要基于以下三种算法淘汰旧数据:FIFO 先进先出 LRU 最久未使用 LFU 最少使用频率以上三种算法都有缺点,比如先进先出算法没有考虑使用频率;LRU也没有正确考虑使用频率;LFU的频率计算不平均,比如一个热点影片刚上映几天,点击量很高,后来持续走低,但是以为头几天的点击量,导致频率很高,根据策略无法淘汰,也不完全科学。主要问题:算法优化,新的热点数据可能无法缓存,热点数据计算有瑕疵 频率标记占用空间优化如何优化呢?.

2021-05-17 13:56:44 697 1

原创 系统架构演化史

原始时代-单机服务一台服务器上面部署服务和数据库,原始时代。石器时代-部署多个服务随着用户量的增加,需要提升系统处理能力,为了保证数据一致性,所以需要扩充服务,如下图:兵器时代-读写分离随着业务的继续增加,再扩容服务无法提高性能,因为数据库成为了瓶颈。如何处理呢?考虑到数据的读取场景比较多,耗费资源,我们把读写进行分离。于是就有了mysql读写分离架构。一台slave负责读操作,一台master负责写操作,通过bin log异步同步数据。salve可以水平扩展。再..

2021-05-15 15:24:11 399

原创 软考高级信息系统项目管理师真题学习笔记

在CMMI连续式模型中,“技术解决方案”过程域属于()过程组。A过程管理 B工程 C项目管理 D 支持企业应用集成中,()超越了数据和系统,由一系列基于标准的、统一数据格式的工作流组成A应用集成 B功能集成 C过程集成 D表示集成功能api集成(应用集成,控制集成,方法集成)业务逻辑层上对应用系统进行集成表示集成把用户界面作为公共的集成点门户集成比如将内部信息系统的新闻等发布到互联网上过程集成超越了数据和系统,由一系列基于标准的,统一数据格式的工作流组成,必须...

2021-05-07 20:03:53 858

原创 软考高级信息系统项目管理师

1.PV、EV、AC、SPI、CPIPV:计划EV:挣值AC:实际成本进度偏差=EV-PV成本偏差-EV-AC 差值越大叶子正向SPI=EV/PV 越大越正向CPI=EV/AChttp://www.cnitpm.com/pm1/77566.html

2021-04-01 09:22:07 481

原创 OceanBase存储引擎核心-LSM Tree VS B-tree

1.什么是LSM TreeLSM Tree是一种数据结构,全称是Log Structure Merged Tree,顾名思义,基于日志结构的、可以合并的树。通过定义,我们发现三个关键点:基于日志结构 支持合并 树结构适用场景:写入量比较大的时候,为什么呢?因为LSM Tree是顺序写,避免IO寻址操作,节省时间。很多的其他NoSQL数据库核心也是这种数据结构,主要包括Cassandra,BigTable,RocksDB等。SSTablesLSM Tree持久化磁盘利用Sort.

2021-03-09 13:15:14 1133 1

原创 我们为什么采用TiDB代替MySQL

背景我们的系统最初采用mysql作为后台数据库,随着数据量的增加,采用业界主流的分库分表方案。但是,随之而来的问题是,增加了应用的复杂度,不利于多维度的数据查询,性能将来也面临挑战。所以,我们考虑采用TiDB,因为Tidb是分布式数据库,支持二级索引,能够解决多维度查询问题,并且性能很强。本文,我会介绍我们为什么选择tidb和我们的业务场景,以及tidb如何解决我们的 问题。为什么是TiDB最初,我们采用mysql作为后端数据库,随着数据量剧增,我们采用分库分表的方案,但是分库分表的方案

2021-03-08 11:20:48 4216 2

原创 彻底搞明白大数据量下Mysql的分页优化

1.背景大家都知道分页,那么我们这里肯定讨论的不是一般的情况,一般的情况我们利用limit分页,或者java代码内存分页都可以解决。如果数据量非常大,如何解决分页呢?比如下面的SQL。select * from user where type=0 order by id limit 1000000,100上面的sql需要查询100条数据,但是是从第100W条开始,mysql会需要遍历跳过前面的100W条,然后从100W条开始,获取100条记录返回,101,102,103......很明显,

2021-03-02 14:32:32 361 1

原创 彻底搞明白JDK的Future机制

什么是Future接口Future是java.util.concurrent.Future,是Java提供的接口,可以用来做异步执行的状态获取,它避免了异步任务在调用者那里阻塞等待,而是让调用者可以迅速得到一个Future对象,后续可以通过Future的方法来获取执行结果。一个实例代码如下:public class Test { public static void main(String[] args) throws ExecutionException, InterruptedEx

2021-03-01 17:22:35 937 8

原创 MySQL在实际应用中的规范(表定义、SQL、索引等)

统一规范存储引擎: 请统一使用innodb存储引擎,特殊的数据库引擎必须通过DBA的评审。字符集: 统一使用utf8字符集。这个要从应用程序、服务器、数据库的表、字段等全部统一起来。注意:MySQL中的utf8mb4字符集,才是真正的utf8,请用这个。作用范围:不要在MySQL存储大对象,比如图片、音乐等;不要用MySQL做Gis运算、全文检索;不使用存储过程、触发器、函数、外键,避免破坏数据库的性能和扩展性。使用上限:每个MySQL实例,数据库不要超过50个; 单数据库容量,...

2021-02-25 16:20:48 411

原创 彻底搞明白JDK 1.8 Lambda 表达式

Lambda表达式为什么背景Java是面向对象语言,所以java对行为的封装都是基于对象。什么意思,简单说,我们要定义个行为,那么需要一个函数,只有函数就行了吗?在java里面不行,因为java是面向对象的语言,所以我们需要定义对象,看下面的代码:public interface ActionListener {void actionPerformed(ActionEvent e);}最早接触过java swing编程的老程序员肯定不陌生,定义一个按钮触发时间,每当时间发生时,

2021-02-24 17:29:48 2051 5

原创 JDK 8 的optional类

什么是Optional类NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。尽量避免在程序中直接调用Optiona

2021-02-23 16:56:36 8503 6

原创 分库分表之后如何通过非分片键操作

场景今天看到一个场景,比如一个表,表名字是award_use_risk,作用是记录奖品使用的记录,用作风控。表结构如下:这个表,只是分库,没有分表,db分成4个库,分别是db0-db4。我的第一反应是根据terminal no或者prize guid,具体看业务逻辑进行分表操作,这样增加、修改、删除都可以通过分片算法定位到哪个库。后来看到业务场景里面,需要定时删除前一天的风控数据,这种情况下,条件里面只有时间,没有分片键,如何定位每个库呢?梳理一下:根据prize guid进行分

2021-02-19 11:19:15 1946

原创 Mybatis 中的$和#

1.区别#{}是预编译处理,${}是字符串替换。Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。2.特殊情况在涉及表名的时候,必须用$符号,否则报错,如下:在order by 后面的字段名字也必须用$,如果用#,语法不报错,但是排序不生效,如下:排序不生效情况:...

2021-02-18 18:06:56 324 1

原创 log4j2 提升系统性能

什么是log4j2使用方式log4j2最好的地方就是异步日志模式,所以在这里我们就要进行升级改造.日志接口(slf4j) slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback) 日志实现(log4j、logback、log4j2) log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4..

2021-01-29 20:04:13 527

原创 JVM OOM日志分析

最近项目出现OOM,复习一下知识:首先,jvm增加参数,打印printGCdetails的日志 运行过程中,观察gc日志gc日志分析如下:2019-03-28T18:02:49.809+0800: 3.175: [GC (Allocation Failure) [ParaNew: 65536K->7435K(76288K)] 65536K->7451K(251392K), 0.0132004 secs] [Times: user=0.00 sys=0.02, real=0.0.

2021-01-21 20:50:34 1387

原创 到底什么是JWT技术?

什么是JWT全称为JSON web token,是一个json对象,用于系统间身份验证。主要包括三部分组成:[header].[payload].[signature]上面三部分用.分割。我们来看每一部分的具体内容:header部分header部分用于描述签名的算法,也可以包括content type。是一个json对象,并且用BASE64处理。一个简单的header例子如下: { "typ":"JWT", "alg":"HS256" }typ字段告诉我们类

2021-01-12 17:20:29 4922

原创 HTTP 1.0 vs HTTP 1.1 vs HTTP 2.0

HTTP 1.0 vs 1.1我们先看1.1相比于1.0做了哪些改进:支持代理和Host报文头:1.0没有要求host header,但是可以添加。1.1支持,便于路由和代理 支持持久化链接:在同一个Http链接上传输多个报文,1.0要求每个请求/响应必须创建一个新的链接 支持缓存:1.0仅仅支持If-Modified-Since header,1.1增加了entity trag和If-Unmodified-Since, If-Match, If-None-Match 等条件请求头 100状.

2021-01-11 16:52:15 417

原创 Java中的闭包

背景方法是一堆声明和业务逻辑代码,返回结果给调用者。方法也可以执行特定的逻辑,不返回任何职给调用者。方法能够复用代码,但是java里面的方法必须属于某个类。在看闭包之前,我们先复习一下lamada表达式。lamada表达式是函数式接口的实例。lamda表达式实现了唯一的抽象方法,也就是实现了函数式接口。如果函数式接口有多个抽象方法定义,就无法用lamada表达式实现多个方法,如下:函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单.

2021-01-07 17:29:12 25088 14

转载 关于Socket粘包、半包问题的解决方法

背景在 Java 语言中,传统的 Socket 编程分为两种实现方式,这两种实现方式也对应着两种不同的传输层协议:TCP 协议和 UDP 协议。但作为互联网中最常用的传输层协议 TCP,在使用时却会导致粘包和半包问题。TCP协议传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793[1]定义。TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信...

2021-01-06 11:12:51 571

原创 什么是单页面应用(SPA)和多页面应用(MPA)

背景最初我们的应用都是多页面应用,多页面应用就是每次客户单请求都返回一个新的页面。在互联网初期,这个问题并没有带来很差的用户体验,但是随着移动互联网的发展以及用户的体验,开发者开始考虑,为什么我们每次只更改了页面的一部分数据,却要更新整个页面呢?所有的反思促使了技术的进步。我们是不是可以第一次加载全部的页面内容,以后的更新,仅仅更新变化的数据,答案是可以的,这就是单页面应用SPA。下图是总体上比较单页面应用和多页面应用的流程:从上图可以看到:多页面应用:每次请求服务端都.

2021-01-05 15:13:37 1590

原创 什么是PWA技术?

1.PWA背景为了说明白PWA,我们先看下面的两个概念:Native APP:需要用户下载安装,哪怕使用一次 需要升级,发布需要审核 开发成本相对较高Web网页:无需下载软件,直接浏览器浏览 手机进入不方便,需要记录地址或者收藏网址 没有网络就没有相应,不具备离线能力 无法推送通知,无法调用底层接口如何在二者之间寻找一个平衡呢?这就是PWA技术诞生的原因。2.什么是PWAPWA是一个渐进式web应用,随后加上App manifest和service worker实.

2020-12-18 17:38:20 5627 3

原创 一次搞明白什么是MVC、MVP、MVVM?

1.前言三个框架的共同目的:为了将业务和视图的实现代码分离,从而使同一个程序可以使用不同的表现形式。MVC = Model-View-ControllerMVP = Model-View-PresenterMVVM = Model-View-ViewModel都有Model和View层。Model 为模型层,主要管理业务模型的数据和行为;View 为展示层,其职责就是管理用户界面。三个架构模式目的都是为了解耦 Model 和 View,主要不同点就在于三者实现解耦的方案不同。2.MV

2020-12-17 14:34:03 855

原创 Mysql覆盖索引与回表查询

1.什么是覆盖索引和回表查询首先,我们看看mysql的索引类型,mysql包括两种索引类型,聚集索引和非聚集索引:聚集索引(主键索引): 聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。 聚集索引的叶子节点称为数据页,聚集索引的这个特性决定了索引组织表中的数据也是索引的一部分。辅助索引(二级索引): 非主键索引,叶子节点=键值+书签。Innodb存储引擎的书签就是相应行数据的主键索引值。...

2020-12-10 17:20:03 1044

原创 一张图分析架构中的缓存设计

今天从掘金网站看到一张高并发系统中的缓存设计图,如下:图片来源:缓存仅仅是使用Redis?看看高并发系统缓存体系架构(缓存体系架构一)(共6篇,后续不断更新) (juejin.cn)针对这张图,写一下我对缓存的思考:首先,分析一下系统中缓存的位置都有哪些,常见的缓存位置包括:1.浏览器页面缓存2.路由网关可以有缓存,进行限流等操作3.应用级别缓存,主要是业务数据,常见的redis、memorycache等4.持久层框架缓存,比如hibernate,mybatis都有缓存.

2020-12-03 21:33:18 885

原创 BitMap思想分析

1.什么是bitmap我们知道很多常见的存储结构,数组、链表、散列表等容器。那么BitMap是什么呢?我们先一起看看,再分析为什么需要bitmap。我们知道一个int占据4个字节,32个bit,比如我存储一个int数据,值为8,那么存储结构如下:00000000 00000000 00000000 00100000一共32位。如果我们申请一个int类型的数组,比如 new int[32],总计占用内存32*32bit,需要大量的内存空间,有没有可以优化的方法呢?现假如我们用i..

2020-11-25 11:37:58 439

转载 性能测试工具比较loadrunner、jmeter和locust

2020-10-10 11:45:30 785

转载 一文读懂什么是进程、线程、协程

目录进程 线程 任务调度 进程与线程的区别 多线程与多核 一对一模型 多对一模型 多对多模型 查看进程与线程 线程的生命周期 协程 协程的目的 协程的特点 协程的原理 协程和线程的比较 进程  我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。  进程是一个具有一定独立功能的程序在一个数.

2020-10-09 20:29:55 493

原创 如何利用微信登陆自己的网站

https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html理解如下:这个默认显示的二维码其实是个固定的链接地址 扫描之后,发送请求到微信开放平台,获取code 取得code之后,再加上之前在微信开放平台注册的appid和appsecret,一起发送请求获取access token 获取access token之后,就可以调用微信接口获取用户信息了,包括昵称、照片等等另.

2020-06-18 16:26:58 3024

原创 Mac OS 安装Homebrew,亲测有效,网上其他的都不靠谱

今天需要按照homebrew,网上搜了一大堆,都过时了,亲自看了一下,共享给大家,免得浪费时间。第一步:按照xcode,这个简单,app store里面就有第二步: 利用网上的命令/usr/bin/ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)根本无法安装,一直报错443,我打开网址看看https://raw.githubusercontent.com/H..

2020-05-15 11:44:29 1505 5

Spring AMQP 集成完整代码,可运行

Spring AMQP实例 以及Spring 配置文件动态注入属性使用实战

2015-02-04

java排序算法

排序算法的java和c实现,有思路有代码,值得学习!!!

2012-04-15

空空如也

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

TA关注的人

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