- 博客(296)
- 资源 (24)
- 收藏
- 关注
原创 退出csdn声明
鉴于csdn社区环境恶化,本人不再csdn更新文章,我活跃在B站给大家提供更多技术分享,问题与文章的阅览请移步Google与StackOverflow等优质社区。
2022-04-12 14:36:51 3250 11
原创 PDFbox的head is mandatory问题
问题这个是加载字体文件的时候无法找到文件的头信息报出的:搜索大量资料,在stackoverflow找到解决方案:这个是maven资源过滤导致文件异常。原文中文社区没找到,我补充一下。例如外PDDocument如何转换为inputStream流也在社区找到解决方案:...
2021-07-14 11:07:46 4918 2
原创 MybatisPlus自增ID超大自动时间戳生成排查
问题数据库我预期是用自增ID,但是用MybatisPlus动态SQL框架写入,ID是非常大的一个值。分析调用insert是动态生成SQL,id为空。由于动态SQL主要sqlSession执行过程如下图,其中关键到了预编译参数的process方法,此时的id还是null。此时会根据entity去获取表的信息,其中就包含了ID生成规则的定义。其中默认在框架启动的时候定义为idType为ASSIGN_ID的策略。接着就去处理主键。这里用内部的方法填充ID可以看到才去类似雪花算法的生成逻
2021-06-02 14:32:40 768
原创 阿里云OSS请求文件跨域问题Access-Control-Allow-Origin
跨域问题网上很多解决方案提示到这里配置但是不生效,一定要勾选Vary:Origin这个选项,请求的时候浏览器记得请求在控制台要清理缓存。
2021-06-01 14:05:57 2383
原创 单元测试规范&Mybatis+SpringBoot+H2实战
背景介绍为了长期持续高质量、高效率的迭代,必须遵守一定的研发规范,其中主要包括静态代码的扫描和单元测试两个部分。风险认知行业的普遍共识,风险识别暴露的越晚,修复的成本越高。好代码不是一蹴而就的,是持续重构出来的目标技术选型最佳实践安装sonarLint本地IntelliJ IDEA安装sonarlint,根据提示重启IntelliJ IDEA即可有两个选项:根据本地修改扫描和全量扫描。可以根据实际情况开启。扫描结果如下:此处扫描出范型约束丢失的可能运行时异常,风险等级为M
2021-05-10 12:51:59 3815
原创 如何使用H2与SpringBoot写DAO单元测试
背景最近在推团队单元测试的标准,其实任何依赖外部调用严格意义上都不算单元测试,但是数据库的SQL的正确性,的确是需要自测保证的,第一个版本就是本地初始化mybatis然后访问远程数据库,但这样容易影响测试数据库,因此本次考虑使用H2内存数据库进行测试。H2分几种模式,其中内存数据库就是应用启动DDL表然后应用结束销毁所有,所以快捷轻量。使用H2 + SpringBoot首先pom文件 <dependency> <groupId>org.myb
2021-05-09 22:18:46 1004 2
原创 一个lombok与JDK16的兼容性问题
问题在公司下载了最新的 JDK16,我们的项目用到了lombok,启动项目的时候报错如下:java: java.lang.ExceptionInInitializerErrorUnable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment
2021-05-06 17:43:53 8989 5
原创 红包雨高并发问题解决方案
问题很多APP为了引流营销创造除了各种玩法,其中红包雨就是常见的一种方式,主要效果就是预告在某个时间点,会发布多少金额的券等等,到点就能够聚集上百万用户来抢,大概效果就是疯狂的戳屏幕,然后偶现几个金额,最后结束后告诉一共抢到xx元。这里面有两个挑战。1. 如何扛住这种高并发流量2. 如何保证不超卖。主要思路业务真实意图很多技术方案挑战很大,可以从业务的角度去进行优化,换个思路可能技术挑战就不大了,例如抢购用户数是固定吗?一定要把所有金额分发出去么?如果是固定,那我们可以前置,不用在活动的时候
2021-04-02 15:38:10 3543 1
原创 教朋友写责任链
背景最近一个开发的朋友开始学习Java,她之前写脚本语言多一点,对于面向对象的一些设计还是不够熟练,她写一个代码特别的累,需要大量堆if-else语句,她的直觉告诉她这样写肯定不够好,然后咨询了我。场景介绍她的代码逻辑是要处理一个BinlogDTO的Message消息,然后做一些后续的逻辑,由于前面的设计是很多张表都会沿用这个BinlogDTO对象并且发送的一个Message的Topic,这个BinlogDTO的对象大概定义为:class BinlogDTO { private String
2021-03-22 17:08:29 395 6
原创 yml读取下划线丢失问题
问题在项目中时常需要读取配置文件,例如某个变量会随着环境的不同而不同,在springboot项目中会很容易想到yml的方式。但是最近遇到一个问题,发现下划线被注入的到bean中会丢失下划线,差点引起线上故障,demo如下:@Componentpublic class YmlConfTest { @Value("${id}") private String id;}yml配置文件如下:id : 1_2但是实际运行中发现id注入的是12,而不是预期的1_2,这就导致问题发生。
2021-01-23 09:57:30 4353 2
原创 dubbo与springMVC边界日志快速接入
在项目的测试阶段,系统的边界日志是十分重要的,但是又不想无限制的打印日志,可能仅仅希望在测试环境打开,所以很多时候便于调试,我们会不停的加日志,到了发布之前很容易删除冗余的日志导致线上的磁盘压力过大。图中绿色部分是我们很关注的日志,我们的微服务系统采用的是SpringMVC + dubbo两种方式进行RPC调用,针对这种场景提出两个目标优化点:快速集成日志记录,对业务代码无入侵可以灵活控制环境打印日志文件隔离SpringMVC接口拦截一般记录这种横切面的日志,首先想到的是AOP的方式,的确
2021-01-22 15:36:57 402
原创 字节跳动系统设计面试实时排行榜
题目现在有个游戏,有过亿的用户会来玩,玩游戏后会获得一个分数,当游戏结束的时候返回给用户自己所在的排名和排名前百分比,如何设计这样一个系统。思路功能其实并不算复杂,有很多种方式可以实现,所以这就要明确整个系统需要支持的用户量和容错与扩展等等,例如如果这个就几百的并发。方案1 mysql直接搞一个mysql的表即可解决。user_score (id, user_id, score, create_time),游戏结束就insert一条记录,然后select count出分数比自己高的,然后再coun
2020-12-09 15:57:05 4438 1
原创 快手算法题LC31下一个排列
题目下一个排列实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。传送门如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1思路题目的含义很多人说读不太懂,其实我读了一遍也是似懂非懂,后来画了下图,就明白了,就是把一个数组的数字进行排列组合,可以生成n个数字,这个数
2020-11-10 11:07:08 501 1
原创 亚马逊笔试题LC57插入区间 合并区间思想
题目插入区间给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例 1:输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]示例 2:输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]输出:[[1,2],[3,10],[1
2020-11-04 18:21:58 246
原创 字节跳动算法题LC121买卖股票的最佳时机
题目买卖股票的最佳时机给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股
2020-11-03 20:27:20 355
原创 LC349两个数组的交集 双指针思想
这题目来自今天的打卡题,虽然是一道简单的题目,但是可以用多种方式来解决,每种方式都有不同的侧重点,所以做一个总结。题目两个数组的交集给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。思路方法1这个题目如果只是解决出来当
2020-11-02 14:17:01 284
原创 LC27移除元素 双索引移动
题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,1,2,2,3,0,4
2020-10-30 16:45:22 198
原创 LC129算法题根到叶子节点数字之和
树的结构是面试中最常考察的一种数据结构,因为这不至于太难,又能过滤掉一批基础薄弱的面试者,所以对树的理解深度很大程度影响是否能顺利通过面试。 这次来分析一个树的经典算法题目:题目给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3]1/ 2 3输出: 25解释:
2020-10-29 14:15:55 2457
原创 字节跳动算法题跳跃游戏
字节跳动是比较注重算法类的题目,都必须要手撕代码的。这次遇到的题目如下:55. 跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。
2020-10-27 17:51:47 670 2
原创 短链接生成实现
背景最近偶然看到运营在群里进行页面分享的时候链接很长,导致发出来之后直接被刷屏,这样体验肯定不好,当然也不利于推广,因此比较好的方式是生成一个短链接服务,能够把链接变短,所以自己写个工具进行优化,也调研了下常见的短链接服务设计。方案对比方案1: 可以通过摘要MD5运算,得到一个固定长度的值,然后持久化到数据库。当然在生成的时候都需要判断是否重复,哈希碰撞的话,也就是如果重复就重新进行运算,直到生成并写入到数据库。优点:长度固定、直接调用库简单。缺点:数据量大的时候可能碰撞比较频繁,导致生成效率比较
2020-10-23 15:31:45 2912
原创 力扣今日打卡之数组的全排列
全排列 II给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]此题难度中等,比较中规中矩,我们很容易会想到递归+回溯的解法,就是用一个列表不断的去尝试并撤销,但是这里有个问题,就是去重。 List<List<Integer>> ansList; public List<List<Integer>> permuteUnique(int[.
2020-09-18 23:24:07 167
原创 算法练习总结
背景程序员都知道的方程式 程序=数据结构+算法,数据结构算法的重要性不言而喻,其揭示了程序编写的核心思想,是计算机识别程序指令的思考方式,但是大部分程序员都不会太重视这块,并非不知道其重要性,而是其在实际应用中体感想对较少,现代编程语言逐渐抽象化以及开源社区的发展屏蔽大量细节,让程序员更关注在业务逻辑与架构的思考上,站在公司和项目开发的角度,这样能快速构建商业系统,对于程序员会逐渐失去对数据结构算法的敏感度。另一方面,数据结构算法是一个十分宽泛的领域,虽然看得到的常用的结构与算法经过一定的训练可以掌握,
2020-09-16 14:59:04 233
原创 力扣今日打卡数独解答
今日力扣打卡题比较复杂,写个总结回顾一下。首先题目如下37. 解数独编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。Note:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。思路最开始拿到题理解
2020-09-15 14:42:17 243
原创 高并发MySQL行锁应用层排队解决方案
前言在互联网项目中的最大挑战之一就是对于高并发的性能问题的处理,在流量小的情况下都可以正常运行的系统再高并发的情况都会暴露出比较严重的问题,并不是说前期的方案不好,而是需要优化甚至更复杂和精细的设计去迭代,例如查询问题可以通过缓存,大写入和峰值可以通过消息中间件,数据库可以分库分表,并且绝大部分性能问题都可以通过横向机器扩展去解决。其中有部分业务需要同步高并发写入,并且由于前期设计需要高并发流量竞争DB行锁,当然可以通过改变存储模型去解决,但是动静太大改动成本太高,在可预期的范围内又不需要抵抗如此大的
2020-08-06 11:38:15 1342 1
原创 一个自动化运营自媒体的方案
背景最近有在关注一些自媒体,发现这块现在正处于红利期,就如15年的VR,16年的AI,17年的区块链,18年的短视频,19年的直播。我们可以发现,每次抓住这样的节点都能诞生出一批企业,当然死的也很多,但是也从侧面反映了在风口的猪都能飞起来,大家都想争取做那个跑的最快的猪。现阶段由于疫情的影响没看到下一个风口,自媒体赚钱还算一个风口。仔细调研一下发现可以做成程序自动化运营进行创收。平台分析讲这个话题比较俗气,但是的确是开始做的一个原动力,现在这个社会很浮躁,都想赚块钱,这个风气的确不好,容易扭..
2020-07-22 15:39:12 1242 3
原创 滑动验证码破解
背景最近有点自己空余的时间,打算利用互联网的数据做点事情,由于需要爬取一些数据,但是这个数据必须在登陆状态下才能得到,调研了很多爬虫的反爬技术的攻防,发现采用一些比较底层的爬虫框架虽然速度更快扩展性更好,但是成本比较高,因为目标网站任何改动都可以让整个爬虫崩溃,因此需要花大力气去维护,但是我的需求并不是大量数据,而是 “爬下来”,所以最后选择了selenium去进行爬取,理论上所见即所得,即所爬。关于验证码在登陆的时候,发现需要进行一个验证码的验证,验证码本质就是识别机器和人,这本身就是一个攻防战,理
2020-07-04 11:14:43 4881 4
原创 3年后再来聊建造者模式
建造者模式,目的就是把复杂对象的内部组装流程和组建的具体表示给解耦。就如同中国宝马汽车制造流水线,流程都一样,只是每一个流程使用的具体品牌或则规格不太一样,现在就可以制造出来3系,5系等等不同的车,哪天工厂升级了,来个7系的生产,流程差不多,主要就是升级了更好的配件。其实没必要严格的按照标准的类图去设计,例如我认为其中导演类我就认为没必要,可以封装在要创建的对象内部。还是以我说制造汽车的例子,过了3年我再来重写,我会这样:class BMWCar { /** * 系列 */
2020-06-10 18:16:31 200
原创 SpringBoot自动化配置mybatis源码分析
上一篇文章,讲到源码的分析,这次来分析mybatis与spring进行集成的源码。阅读准备首先提出几个问题spring如何是把依赖的mapper接口注入成mybatis的对象的。spring boot是如何加载到mybatis的。Spring骨架接口定义spring里的一些基本概念,要做一个简单的介绍,否则深入到spring与mybatis集成的源码是比较难理解。Spring的类图轮廓,其中BeanFactory是容器的最抽象接口,下面一些接口扩展了接口抽象,继承的层次越多,一般接口的能
2020-06-08 17:24:50 559
原创 关于阅读源码的总结
为什么开始阅读其实源码平时也有在看,但是时间比较碎片化,刚好最近需要做内部技术分享在调研技术栈,为了避免枯燥无味,想更贴合平日的项目,spring与jdk基本也没太多新意并且自以为自己没太自信能够讲清楚,另一方面数据库一般又是整个项目的核心所在,所以这次主要从国内最常见的orm框架mybatis作为主要的一个主要的分享内容。由于考虑到整个源码的分析可能篇幅较大,不追求华丽的描述和故弄玄虚,只是想简简单单的讲清楚,所以分多篇文章去分析,每篇文章自己觉得比较重要的点。如何阅读源码源码里一般都是OOP的
2020-06-08 11:40:38 272
原创 spring boot集成测试容器重启问题
背景spring boot test的项目中常用的测试框架, 最近在写集成测试的时候发现一个比较奇怪的问题,当我在运行多个测试用例的时候会偶尔重新启动整个容器上下文,由于后期业务逐渐复杂,大量的测试用例需要运行,这个问题直接导致回归测试的效率降低。举个例子:几个类:@RunWith(SpringRunner.class)@SpringBootTest(classes = TestApplication.class)public class BaseApiTest { @Test
2020-05-22 23:48:06 4679 1
原创 日常命令自动化思路
经常需要查询日志的朋友,肯定都对重复的一堆登陆交互命令习以为常,仔细想想其实这些是很影响效率的,作为程序员同一件事干三次以上就要自动化了,这些命令本质上不就是一堆linux命令的组合么,为什么不用shell命令把它给自动化了例如git命令,很多时候就是习惯三连,别误会不是点赞转发订阅????。就是git add , git commit, git push.这三个命令都敲烂了,每次提交就分支名和提交信...
2020-03-12 17:50:18 322
原创 modelmapper属性匹配问题分析
最近遇到一个工具类的问题比较容易出错,问题比较诡异,因为是通用的工具类,因此还是要搞清楚根本原因,避免误用。由于领域模型之间的转换手写getter setter代码会很冗余并且容易出错,然而复制对象属性值是高频操作,因此各种库有开源实现用以复制对象属性,常见的有spring和apache的实现,个人更推荐spring的版本,根据经验发现spring的BUG更少。这次在项目中用一个现成的封装工具类...
2020-02-13 13:49:17 3741 2
原创 高并发库存扣减优化
背景库存是电商中的一个核心概念,主要记录商品的可售等数量信息,其既简单又复杂,简单是因为它大多数时候就是提供一个商品是否可售的信息,下单扣库存,退款或则入库加库存就行了,因此从业务的角度上的确不算复杂。为什么复杂?因为在分布式高并发库存的性能上来说是需要考虑很多的,由此而展开的一系列的优化又会使简单的业务操作变的实现上异常复杂。本文介绍接触到一些库存上的优化,也会参照业界的最佳实践与设计模式探讨...
2019-12-26 16:37:50 5713
原创 使用arthas排查线上问题
背景arthas是阿里开源的Java排查工具。使用JVMTI等技术实现对JVM底层的一些监控,例如idea的DEBUG技术就是依赖这个,所以这是JVM的一个“后门”。问题线上出现问题,很多时候由于日志的缺失,或则是监控的维度等等问题无法立即排查真实的情况。使用方式这次我们来分析使用arthas来查看spring容器的一个操作,可以任意的查看Spring容器的任何信息。...
2019-11-21 11:22:41 1913 2
原创 excel解析成java实体
问题由于业务的迭代和各种数据订正等等场景。excel解析的场景越来越多,但是现成的工具类其实还是不够自动化,我们需要一个只关注解析对象的工具,其他的东西尽量做到封装。可以把excel表格看成RDB的表一样,一行就代表一条记录,对应代码一个entity。根据不同的需求我们只需要编写列与entity字段的映射关系即可,其他的兼容性与实现细节不关心。实现方式/** * 将表格的数据转...
2019-10-25 10:07:41 487
原创 Dubbo部署导致上游调用报错问题排查
现象在部署的时候,总会有上游的部分调用请求出错。在流量小的时候这样的报错是能容忍的,但是库存作为核心服务,高并发的极小的流量,它占的绝对值的数量也不小,所以这个问题已经到了不得不解决的地步。开始抓取以下的日志进行分析。原因分析应用启动的日志:启动的时间点为:16:48分,但是准确的服务提供的时间其实并非这个时间点。因为我们在应用层用AOP去拦截了所有请求,看请求日志如下:也就是说27...
2019-10-16 19:41:43 775
原创 使用binlog缓存异步化
在高并发的系统中关于缓存的重要性不言而喻,缓存在项目当中大量使用,扛住了大部分的查询流量,但也有很多点需要注意,最为典型的例子就是数据一致性问题,缓存击穿问题,缓存高可用问题等等。这次需要解决的问题是一个秒杀场景的高并发问题。关于缓存一致性问题缓存一致性就是说DB的数据与缓存的数据保持一致,理论上同一瞬间去变更两个值是最理想的,访问缓存跟DB是一致的,但是在分布式的情况下,无论如何操作,更新D...
2019-10-09 11:45:28 1952 1
原创 优雅的写测试用例
测试是一个很大的话题,每个研发团队都在强调测试的重要性,在不同的阶段测试的价值也是不一样的,每个研发团队都或多或少有自己的测试“文化”。在很多时候忽视了对测试环节的重视,导致的稳定性差而增加更多的工作量是得不偿失的,应该系统性的认识测试的价值,并好好规划。我也是参考了很多文章,自己总结了一些现在的情况基本概念单元测试:本地测试,非IO和RPC调用,可以本地单独测试,比较复杂的业务逻...
2019-09-09 21:24:16 1322 6
原创 踩坑PowerMock org.powermock.api.extension.listener.AnnotationEnabler 问题
今天遇到一个powermock的问题:堆栈打印:org.powermock.api.extension.listener.AnnotationEnablerdebug到源代码发现为:Argument should be a mock, but is:class …代码如下:public class MockTest extends BaseTest{ @Spy @Inje...
2019-08-21 09:57:18 3663
matplotlib下载
2018-05-19
大型网站技术架构
2016-07-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人