- 博客(302)
- 资源 (3)
- 收藏
- 关注
原创 统计可重复列表中的TOP N
方案1:HashMap统计 + 全排序方案2:HashMap统计 + 最小堆(优先队列)方案3:Java Stream API完整示例代码关键点总结方案4:并行流处理(Parallel Stream)方案5:桶排序(Bucket Sort)方案6:快速选择(Quickselect)算法方案7:Guava库的MultiSet(第三方依赖)二、方案对比总表三、总结建议这种统计top值的情况场景使用的不少,面试过程中也有聊到过这类问题,在这详细介绍一下思路和方案全排序适合数据量小的场景,代码简单但效率低。
2025-03-21 20:32:55
966
原创 库存扣减解决方案
库存恢复的核心挑战在于数据一致性并发控制和业务状态联动基础场景:幂等性 + 状态机 + 数据库锁。高并发场景:异步队列 + 缓存双删 + 库存分段。分布式场景:TCC/Saga + 消息队列 + 分布式锁。复杂业务场景:Binlog 监听 + 动态路由 + 事务日志。通过监控恢复失败率、库存准确率和系统吞吐量,持续优化方案,可有效提升系统的可靠性和用户体验。三、通用问题1. 分布式事务一致性问题:扣减库存与订单创建需跨服务保持一致。解决方案TCC 模式。
2025-03-21 09:12:29
438
原创 第九章:收银台
我们在这主要来聊一聊线上收银台,说起线上收银台大家应该都很熟悉了。我们日常从电商平台买东西,都会使用到这个线上收银台的。我们来回顾一下整个电商购物的过程,来看一下收银台在这个过程中是一个什么角色。选品–>加购物车–>结算页–>收银台–>支付成功–>发货–>物流–>签收收银台的工作过程分几部分1、收单2、拉起收银台3、收银台内部完成支付4、订单支付结果通知整个工作流程按上述顺序完成整个付款的动作。
2024-10-17 16:49:10
436
原创 第八章:支付核心
搭建一套支付系统,那我们需要搭建很多的相关系统,比如前面说的用户管理的、商户管理的、支付通道的。支付单:用户核身通过后提交的支付行为、在收银台支付的时候用户可以有多次支付行为,每次都会有一个新的支付单。支付单:用户核身通过后提交的支付行为、在收银台支付的时候用户可以有多次支付行为,每次都会有一个新的支付单。账单:记录实际的交易账户变化,每一笔应付多少钱、实付多少钱、是否需要退款、是否账平等。账单:记录实际的交易账户变化,每一笔应付多少钱、实付多少钱、是否需要退款、是否账平等。
2024-10-17 15:44:02
509
原创 系统开发心得
系统设计方向业务数据【监控】 转化率 场景 这是一个老生常谈的东西,但是真的是不能没有,而且做的越完善,业务就越安全数据状态流转预警全链路数据一致性对账系统日志分析,自动预警可对照、可回滚、可监控RPC要做好监控、降级、容灾,全链路分析合理设置链路超时、重试,序列化方式推荐都统一使用一种接口服务支持幂等,尤其是异步消费场景要重点关注缓存要考虑缓存击穿和数据同步日志类功能可以支持降级,降低磁盘压力做好功能内聚设计,保证业务功能独立自治,迭代更新风险可控代码开发方向主流程只做
2024-10-16 14:14:15
1010
原创 第七章:支付通道管理
支付通道是支持交易过程中多方之间信息传递和验证,以实现交易资金流动的路径。它可以通过不同的维度进行分类:根据用途:分为出款通道、入款通道、鉴权通道。出款通道主要用于提现、发工资、退款等场景;入款通道则应用于网上支付、扣款、信用卡代扣等;鉴权通道主要用于验证信息是否正确,如账户实名认证、银行卡绑定等。根据支持对象:分为对公支付、对私支付。对公支付用于企业账户支付,而对私支付则用于个人账户支付。根据支持形式:分为卡基支付、账基支付。
2024-10-16 11:01:09
845
原创 第六章:商户管理
首先,商户身份标记是商户管理的起点,它如同商户的数字身份证,确保每个商户在平台上的唯一性和可识别性。它要求平台在收集、处理商户信息的同时,也要不断提升服务的个性化、安全性和合规性,从而构建一个既高效又安全的商户生态体系。企业基本信息是商户画像的核心部分,包括企业名称、注册地址、经营范围等,这些信息为平台提供了商户的基本背景,有助于平台对商户进行全面的了解和评估。业务身份标记则进一步细化了商户在平台上的业务角色和定位,它帮助平台更准确地理解商户的业务需求,从而提供更加个性化的服务和支持。
2024-10-16 10:59:49
951
原创 第五章:用户管理
绑定银行卡、花呗、白条等多样化的可支付工具,为用户提供了便捷的支付选择,同时也要求平台具备高度的安全管理能力,以保护用户的资金安全,防范欺诈风险。最后,授权协议的管理,涉及支付、代扣等敏感操作,是用户权益保护的重要一环。明确、透明的协议内容,加上用户主动授权的机制,确保了用户在享受服务的同时,对自身权益有充分的知晓和控制权。综上所述,用户管理是一个多维度、深层次的系统工程,它要求平台在收集、处理用户信息的同时,也要不断提升服务的个性化、安全性和便捷性,从而构建一个既高效又安全的用户生态体系。
2024-10-14 17:55:29
656
原创 第四章 全局唯一ID生成
在前面的章节中,我们已经深入了解了支付系统的构建,涉及到了订单、支付单、账单等多个核心组件。解答:这个说的也就是随机率的问题,如果我们的数据随机率足够大,那理论上来说一般是不会出现分布不均的问题,那么这个时候,实际就是看后面几位随机数全局上怎么保证随机率的问题。因此,全局唯一ID多为19位的现象,主要源于雪花算法在分布式系统中的广泛应用及其生成的ID特性。从前几章的介绍我们知道,要搭建一个支付系统中有订单、支付单、账单等等会使用到很多的单号,那我们单号怎么生成呢。这个问题的解决方式有很多种。
2024-10-14 17:52:59
1090
原创 带你玩转MapStruct
MapStruct是一个Java注释处理器,用于自动生成类型安全的Java Bean映射器,主要用于解决数据模型之间不通用的情况。MapStruct通过注释来指定数据映射的细节和规则,然后自动生成对应的Java Bean映射器代码,从而简化对象转换过程,节省开发时间和减少错误。MapStruct在Java文件编译成class字节码文件的过程中,实现了转换方法的预处理,即提前编译好文件,这样的好处1、生成的代码是类型安全的,因为它使用了Java编译器的类型检查机制。。
2024-10-11 14:42:56
1439
原创 第三章 三方支付
第三方支付是指具备一定实力和信誉保障的独立机构,持有央行颁发的第三方支付牌照,通过与各大银行签约,提供与银行支付结算系统接口对接的网络支付模式。在交易过程中,买方使用第三方平台账户支付货款,第三方通知卖家货款到账并要求发货;买方确认收货后,第三方再将款项转至卖家账户。第三方支付的优势包括安全性高、支付成本低、使用方便以及提供支付担保等。然而,它也存在一些缺点,如虚拟支付层需依赖实际支付方式、银行卡信息暴露风险、法律地位不明确、资金寄存风险等。。
2024-09-11 22:38:54
988
原创 第二章 支付的一方、二方、三方、四方
指买方、卖方直接进行资金转移,如现金交易,是点对点直接交易过程。这是最古老原始的交易方式,随着社会的发展,我们日常生活中使用的频率在逐渐的降低。示例:我们小时候拿着一分钱去买雪糕一样。
2024-09-11 16:46:12
1622
原创 第一章 什么是支付
既然我们要开始了支付,那什么是支付呢?我想广大读者应该在自己的心里有一番计较。下面我从现在常见的互联网支付的背景下来聊一下。什么是支付本章主要是讲述了一些支付相关的概念信息,我个人认为了解这些信息是很重要的,了解这些信息可以让我们有一个初步的认知,这些认知会不断的在实际的相关工作中进行实践验证,概念信息指导后续实践,实践不断反哺并完善概念认知体系。
2024-09-10 20:22:36
1051
原创 Spring jdbc:initialize-database分析
起因在使用内存数据库H2写数据库操作的单元测试的时候,因使用jdbc:initialize-database 来初始化数据库结构。现状spring-jdbc :3.1.1.RELEASE <jdbc:initialize-database data-source="dataSource" ignore-failures="NONE"> <jdbc:script location="classpath:initdata/info.sql"/> </jdbc:in
2021-03-31 21:20:49
807
原创 springboot 单元测试怎么写
本文基于springboot版本1.4+ 推荐使用mock完全单节点测试和全链路测试我们的单元测试是系统质量保证的重要一环,需要引起重视。但是由于目前分布式系统相互直接依赖繁杂 ,如果实际按业务数据来跑单元测试,那很难遵循单元测试的 AIR 原则【 Automatic(自动化)、Independent(独立性)、Repeatable(可重复)】 ,因而我们会引入mock来辅助完成单元测试。另一方面单元测试分为两部分 一个是单个最小单元的测试,另一种是单个系统内部全链路的测试。本文主要描述如果写全链路测试
2021-03-26 14:38:45
1406
原创 org.springframework.test.context.junit4.SpringJUnit4ClassRunner
spring 的单元测试是如何复用容器的1、创建runner执行器此时初始化的TestContextManager 中并没有上下文容器信息org.springframework.test.context.junit4.SpringJUnit4ClassRunner#createTestContextManager public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { super(claz
2021-03-24 15:03:09
2108
原创 单元测试-junit
脱离开发工具使用junit运行一个测试类import org.junit.runner.JUnitCore;import org.junit.runners.BlockJUnit4ClassRunner;import org.junit.runners.model.InitializationError;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;public class JunitExample
2021-03-23 20:05:57
368
1
原创 cannot have an existing value
写单元测试遇到下面的问题BaseTest 中的producer 已经存在值了再次被赋值导致系统异常org.springframework.beans.factory.BeanCreationException:Could not inject field: protected mq.producer.Producer BaseTest.producer; nested exception is java.lang.IllegalStateException: The field protected
2021-03-19 17:32:32
905
原创 aop bean增强
主要的两个类org.springframework.aop.framework.AbstractAdvisingBeanPostProcessororg.springframework.aop.framework.autoproxy.AbstractAutoProxyCreatorAOP下的实现类org.springframework.validation.beanvalidation.MethodValidationPostProcessororg.springframework.beans.f
2021-03-17 17:48:49
273
原创 org.springframework.aop.config.ConfigBeanDefinitionParser#parse
org.springframework.aop.config.ConfigBeanDefinitionParserpublic BeanDefinition parse(Element element, ParserContext parserContext) {1、 CompositeComponentDefinition compositeDef =new CompositeComponentDefinition(element.getTagName(), parserContext.extra
2021-03-16 20:33:59
157
原创 spring容器分析
org.springframework.context.Lifecycle 声明周期org.springframework.beans.factory.Aware 资源导入org.springframework.beans.factory.BeanFactory 对象读取org.springframework.core.AliasRegistry 对象注册 org.springframework.core.io.ResourceLoader 资源加载org.springframework.cor
2021-03-10 10:14:38
218
1
原创 maven-resource 打包资源管理
背景当我们做一些服务封装的时候,可能会使用到SPI相关的一些能力,当我们打包的时候可能需要指定需要打包那些资源文件,这个时候我们就会用到resource样例包结构src/main/resources/propsMETA-INFxxx.xmlxml配置 <build> <resources> <resource> <directory>src/main/resour
2021-03-02 14:24:39
261
原创 修改单例属性引发的血案
背景最近接触的一些系统中遇到一个问题,一个交易的服务对外提供了支付和退款两种能力,但是发现运行时交易的服务走了退款。原因是spring容器管理的一个对象service 属性运行时被改变,导致上下流程对不上的问题,多业务链路并发时引发运行时属性错乱,导致 支付和退款行为混淆下面是大体代码样例。记录下问题原因样例1、定义一个核心支付服务public interface CoreService { public BaseResult trade(TradeParam tradeParam);
2021-02-25 17:58:22
559
原创 AOP--入坑源头
1、AOP实现了一部分数据转换和加解密相关的工作,发现历史项目一堆都是around ,职责分工不是很合理,代码优化过程中入坑,目前还在扑腾,暂未出坑以下为初期的一个实验,基于spring-boot的几个不同的版本 。等以后有了结论之后再一点点完善2.4.2-------------doAround--start-------------before-------------doAfterReturning-------------doAfter-------------doAroun.
2021-02-09 18:32:42
136
原创 AOP aspectj idea 笔记
1、 idea专业版本 (非专业版不支持aspectj)2、创建个maven项目加入如下依赖 plugin尤其重要 ,需要运行编译后版本,才能发现生效<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.6</version></dependen...
2021-02-09 17:57:17
273
1
原创 fastjson定制序列化插件
背景在日常的开发过程中,对象序列化成JSON字符串的能力是很常用的,但是在实际使用过程中,或多或少的会有一些定制化的诉求,常规一些的序列化支持 fastjson提供了现成的序列化信息,直接指定使用即可 参考类 com.jd.fastjson.serializer.SerializerFeature。我的实际使用诉求是在序列化的过程中完成数据的脱敏工作,以保障诸如手机号 邮箱之类信息不被泄露,以下推荐两个可定制序列化插件 ,可以完成在序列化过程中针对key和value的定制处理。针对key的定制处理c
2020-10-30 10:08:54
445
原创 gson 反序列化后整形变浮点问题
public static void main(String[] args) { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("yyyy-MM-dd HH:mm:ss"); builder.registerTypeAdapter(new TypeToken<Map<String,Object>>(){}.getType(),new MapTypeAdapt
2020-07-23 21:12:11
1999
2
原创 idea 运行编译 提示找不到类问题记录
springboot项目 mvn clean install 打包正常application run的时候一直报各种类找不到,Idea清理缓存 重启 重新clone代码 都不能解决问题 ,推荐如图maven ->runner->Delegate IDE build/run actions to Maven 选中 将构建和运行委托给maven去执行 这样能避免因为idea的各种与maven编译运行的冲突 导致的各种乱七八糟的问题 均以maven为准就对了...
2020-07-20 15:33:17
4265
1
原创 基于docker环境构建nginx代理java项目操作手册
基于docker容器,把最常规的nginx+java的部署环境迁移到容器中的操作手册
2020-05-02 17:12:50
1140
3
原创 java项目docker云化入门
目录01 创建java项目1、指定pom父文件和依赖2、系统启动类3、API服务类02 开始处理dockefile03 打包构建镜像1、安装docker,初学者就直接用yum 一键安装即可2、打包3、检查当前服务器镜像4、启动docker镜像 并访问对应地址01 创建java项目从spring官网快速开始找一份样例代码即可,代码样例如下:1、指定...
2020-04-26 22:53:30
442
原创 大话分布式服务——初识分布式服务
初识分布式服务目录初识分布式服务简介正文创业期发展期成熟期后记简介 大家好,我们开始第一章 初识分布式服务正文 本文以初识为题,旨在初步介绍分布式服务的相关信息,给读者一个初步的印象。那么怎么来解读分布式服务呢?分布式服务是计算机系统服务中的一种概念,那什么算是分布式服务呢,这个要从软件系模式起源来介绍了。 一个成熟的...
2020-04-21 00:22:05
307
原创 大流量放大镜下看缓存击穿事件
缓存击穿这个词语在很多程序开发者来讲是再熟悉不过了。当下互联网大流量的环境下,缓存几乎可以说是在当前软件开发应用中必不可少的一点了。先简单介绍下业务场景,在渠道引流的过程中,下放引流利益点声明,引流之后针对完成任务的有效用户进行之前承诺利益点的发放,承诺有效期自然周有效。以此引流拉新业务为目标,程序上分为四大模块,分别是承诺声明利益点的展示模块、千人千面实时分析模块、分析结果业务管理模块、...
2020-04-18 17:02:36
296
原创 idea 重写对象toString 转成json
在生成 toString的页面 进入设置-》模板-》新增模板然后toString的时候使用新增的模板就行了记录处理模板如下public java.lang.String toString() {final java.lang.StringBuilder sb = new java.lang.StringBuilder("{");#set ($i = 0)#f...
2019-08-01 18:01:15
1373
原创 tomcat如何支持web应用引发的思考
此文属于基于现有工作经验的一个思考 ,纯属YY设想,无实际源码实现参考依据思考命题tomcat是如何支持一个web系统启动并且正常提供服务的现状我们开发一个web系统,然后部署到tomcat容器中,就可以正常提供服务了,比如Hellow Word我们访问http://localhost:80/ 就可以看到了,这就是一个最简单的web服务思考1、不管是从系统日志还是从访问地址上看,我们...
2019-05-09 17:21:42
183
原创 系统熔断
最近看这方面的信息 简单了解了下 写下随笔背景介绍基于服务拆分之后,各类远程调用横行的年代, 我们很容易出现的系统层级情况就是一个业务支撑需要N多服务,简单说下,图网上有的是就不贴了。假设有三层应用调用 A-B-C ,A对外提供列表服务,需要N个B和M个C,同时B也需要X个C,我们假设一个调用链路中的某个C系统故障 ,那A或者B 调用C时 就会被hold住,从而无法正常响应, 以此为例 A机...
2019-05-09 16:24:52
954
原创 RateLimiter 笔记
关于谷歌的RateLimiter限流的使用工具类记录package org.limit.example;import com.google.common.util.concurrent.RateLimiter;import java.util.concurrent.ConcurrentHashMap;/** * @Title: RateLimiterUtil * @Package...
2019-04-12 14:31:07
837
原创 mysql
SQL优化业务型优化:多表连接拆分为单表分表:取决表的业务是否支持水平拆分、表的大小、表的访问量(QPS+TPS)分库:表的大小、分表的梳理、表的总访问量(QPS+TPS)数据库拆分技术型优化在原SQL基础上,修改索引改造SQL结构增加表冗余字优化SQL步骤:分析现有业务指标和sql执行计划。改写sql写法或者调整索引。反复执行这两部。将where子句中查
2019-04-11 16:27:03
180
原创 sun.misc.Unsafe 笔记
858 /** 859 * Atomically update Java variable to <tt>x</tt> if it is currently 860 * holding <tt>expected</tt>. 861 * @return <tt>true...
2019-04-11 16:25:26
193
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人