聚合系统设计-批付交易中的“双批次ID设计(or双批次号设计)” // 双批次ID设计:在复杂业务场景下构建清晰、可维护的应用系统
本文将聚焦于聚合支付系统商户API批量付款场景,深入剖析双批次ID设计方案如何从程序设计合理性和系统性能优化两个核心维度带来显著优势。通过双批次ID设计,实现在复杂业务场景下构建清晰、可维护的应用系统。
1. 业务场景与核心挑战
聚合支付系统的商户批付API接口,业务场景通常是这样的----->商户侧系统通过调用API接口 ...
剑指offer-34、第⼀次出现的字符
题目描述
在⼀个字符串( 0<=字符串⻓度<=10000 ,全部由字⺟组成)中找到第⼀个只出现⼀次的字符,并返回它的位置, 如果没有则返回 -1 (需要区分⼤⼩写).(从 0 开始计数)
示例1
输⼊:"google"
返回:4
思路及解答
暴力遍历(不推荐)
通过双重循环检查每个字符是否只出现一次。
public class Solution {
public int ...
Jenkins Share Library教程 —— 开发入门
写在前面
今日心情有点小丧,但总体问题不大,有一些突然来的活,还没整完,明天再继续搞把。
有难度吗?
有一些把,我觉得还是要做一些自己不擅长的工作,才会有成长的吧,为什么?
用我们测试同学的话术,就是提升“自己”的“测试覆盖率”,即解决问题的能力,核心就是会了就是赚了!
学习目标
通过本教程,你将学会:
...
【技术干货】Vaadin Flow vs Hilla:你该选择哪个Java Web框架?
在现代Web开发中,前后端分离已成为主流趋势,但对于许多以 Java 为核心技术栈 的企业来说,如何高效地构建现代化Web应用依然是一个挑战。今天我们为大家介绍的,是由 Vaadin 平台 提供的两种开源全栈Web框架 —— Vaadin Flow 与 Vaadin Hilla。它们自 Vaadin 24.4 起成为平台核心组成 ...
Spring 事务、循环依赖连环问
Spring 事务
详情请查看:Spring 事务
Spring 事务实现方式有哪些?
事务就是一系列的操作原子执行。Spring事务机制主要包括声明式事务和编程式事务。
编程式事务:通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务:将事务管理代码从业务方法中分离出来,通过aop进行封装。Spring声明式事务 ...
CopyOnWriteArrayList 的故事--一起看看java原生的读写分离
CopyOnWriteArrayList 是JUC中,为了实现高并发而提供的list容器之一。对于大部分的业务场景,都是读多写少,并发度也基本卡在了读的位置。通常支持并发的容器在解决并发时,采用是:(1)数据分割,每个线程只操作属于当前线程自己的数据,如ThreadLocal (感兴趣的同学可以看我前文 《Java内存模型及Java关键字 volatile ...
为什么不该用 Double 表示金额及解决方案
众所周知,double 和 float 这些浮点数其实是不精确的。
比如 0.1 + 0.2 并不等于 0.3,而是等于 0.30000000000000004——这也一度成为程序员圈子里的经典梗。所以用浮点数表示金额这种需要精确计算的数值,是会出现精度丢失问题的。
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 输出: 0.3000000000000 ...
Spring AOP、MVC高频面试题解析
什么是AOP?
面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。
面向切面编程和面向对象编程的区别,两者有冲突吗?
面向切面编程(AOP)和面向对 ...
从零开始学Flink:数据输出的终极指南
在实时数据处理的完整链路中,数据输出(Sink)是最后一个关键环节,它负责将处理后的结果传递到外部系统供后续使用。Flink提供了丰富的数据输出连接器,支持将数据写入Kafka、Elasticsearch、文件系统、数据库等各种目标系统。本文将深入探讨Flink数据输出的核心概念、配置方法和最佳实践,并基于Flink 1.20.1构建一个完整 ...
Java并发编程(5)
线程池
1、什么是线程池?
管理线程,避免增加创建线程和销毁线程的资源消耗:线程也是一个对象,创建一个对象要类加载,销毁一个对象要走GC垃圾回收流程,都是有资源开销的。
提高响应速度:对比普通的做法,是重新创建一个线程执行,要慢很多。
重复利用:线程用完再放回池子,可以达到重复利用的效果,节省资源。
2、 ...
10. Spring AI + RAG
10. Spring AI + RAG
@目录10. Spring AI + RAGRAG概念向量:文本向量化向量数据库匹配检索SearchRequest接入ChatClientRetrievalAugmentationAdvisor最后:
RAG
检索增强生成(Retrieval-augmented Generation)
对于基础大模型来说, 他只具备通用信息,他的参数都是拿公网进行训练,并且有一定的时间延迟, 无法得知一 ...
浅谈ThreadLocal----每个线程一个小书包
ThreadLocal是什么?thread是线程,local是本地的意思字面意思是线程本地。其实更通俗的理解是给每个线程设置一个缓存。这个缓存用来存储当前线程在未来的业务逻辑中需要执行到的变量。我们先来看怎么用:
首先创建全局变量ThreadLocal,各自启动一个线程任务:线程任务将变量设置到缓存中。线程任务需要用到缓存中的变量时 ...
7. Spring AI 对话记忆 + 结构化输出
7. Spring AI 对话记忆 + 结构化输出
@目录7. Spring AI 对话记忆 + 结构化输出对话记忆PromptChatMemoryAdvisor配置聊天记录最大存储数量配置多用户隔离记忆原理源码$数据库存储对话记忆Redis存储多层次记忆架构 痛点结构化输出基础类型:Pojo类型:原理最后:
对话记忆
大型语言模型 (LLM) 是无状态的,这意味着它们不会 ...
Spring知识点(2)
一、有哪些依赖注入方式?
构造方法注入:通过调用类的构造方法,推荐用于强依赖(没有依赖对象就没法工作)。这也是官方推荐的注入方式。好处:依赖不可变(final修饰)、更安全。
@Component
public class UserService {
private final UserDao userDao;
// Spring 会自动注入 UserDao
@Autowired ...
Spring Boot接入邮箱,完成邮箱验证码
原文出处:[https://www.huaguoniang.top/archives/spring-boot-mail]
先知
邮箱的一些基本概念:
发送邮件
STMP协议:
Simple Mail Transfer Protocol ,简单邮箱传输协议,用于发送邮件的协议。
基于TCP,保证可靠性,但不安全,是明文传输
Spring Boot默认也是基于此协议进行发送邮件
接收邮件
POP3协议: ...
Java中实现html转pdf
目录1、背景2、需求3、思路4、实现步骤4.1 搭建一个简单的工程4.1.1 引入依赖4.1.2 编写Freemarker工具类4.1.3 编写pdf工具类4.1.4 增加一个模板4.1.5 增加一个控制层4.1.6 运行4.2 功能完善4.2.1 生成的pdf需要支持中文4.2.1.1 程序中引入宋体4.2.1.2 pdf工具类中增加使用中文字体4.2.1.3 freemarker模板中使用中文字体4.2 ...
全球知名的Java Web开发平台Vaadin上线慧都网!
近日,慧都科技正式与国际知名的企业级Java Web开发平台供应商Vaadin达成合作伙伴关系。双方的合作,不仅补强了慧都在前端与应用开发领域的能力,更标志着慧都在软件工程数字化方案版图上的进一步扩展与深化,也为中国企业构建现代化应用开发注入了新动能。
目前Vaadin 开发框架及核心组件已全面上架慧都网,对慧都Dev ...
Java 日志管理的黄金组合: SLF4J+Logback
slf4j 的前世今生
Log4J、Log4J2和LogBack的历史故事
使用过Log4J和LogBack的同学肯定能发现,这两个框架的设计理念极为相似,使用方法也如出一辙。其实这个两个框架的作者都是一个人,Ceki Gülcü,俄罗斯程序员。
Log4J 最初是基于Java开发的日志框架,发展一段时间后,作者Ceki Gülcü将Log4j捐献给了Apache软件基金会 ...
【LeetCode】121. 买卖股票的最佳时机
121. 买卖股票的最佳时机
题目
给定一个数组 prices ,它的第 i 个元素 prices 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
例子
...
剑指offer-33、丑数
题⽬描述
把只包含质因⼦ 2 、 3 和 5 的数称作丑数( Ugly Number )。例如 6 、 8 都是丑数,但 14 不是,因为它包含质因⼦ 7 。 习惯上我们把 1 当做是第⼀个丑数。求按从⼩到⼤的顺序的第 N 个丑数。
如果 n = 9 , 返回 10 。注意事项:我们可以认为 1 也是⼀个丑数。
输⼊:7
返回值:8
思路及解答
暴⼒破解
⾸先,我 ...