- 博客(159)
- 资源 (16)
- 收藏
- 关注
原创 [日常踩坑]--(14)异步任务与事务
Author:赵志乾Date:2020-08-14Declaration:All Right Reserved!!!踩坑:场景:数据库事务执行完,需要执行异步任务;例如向Redis发布消息;做法:事务的最后一步执行消息发布;代码如下:@Transactional(rollbackFor = Exception.class)public void doMyTransaction(Object param) { // step1: 执行事务操作 // step2: 发布Re.
2020-08-14 15:13:31 805
原创 [日常踩坑]--(13)MySQL大表变更
Author:赵志乾Date:2020-08-14Declaration:All Right Reserved!!!踩坑:场景:MySQL数据库单表行数将近400万,多张表加和约千万行。需要对这几张表进行字段添加和字段更新;做法:使用数据客户端连接数据库,直接执行变更命令;现象:此系列命令的执行极其占用数据库资源,使得数据库性能大幅下降。导致线上应用中的其他表单条记录更新操作耗时将近30秒,并发锁过期失效,出现数据更新错乱。解决方案:上述问题是由于单表过大,导致更新占用过..
2020-08-14 14:35:29 257
原创 [日常踩坑]--(12)Redis锁释放
Author:赵志乾Date:2020-07-28Declaration:All Right Reserved!!!踩坑:场景:获取Redis锁,完成业务逻辑后释放锁做法:try语句中获取Redis锁,finally语句中释放锁,代码如下:try{ // step1: 获取锁--默认过期时间15秒 boolean result = jedisTemplate.getLock(lockKey); if(!result){ // 抢锁失败 .
2020-07-28 13:35:34 2292
原创 [日常踩坑]--(11)随机业务id重复问题
Author:赵志乾Date:2020-06-05Declaration:All Right Reserved!!!踩坑:场景:业务记录需要唯一标识,也就是我们使用的业务id。做法:本地通过时间戳+业务串+随机数的规则生成业务id,当在循环中使用该方法是会产生重复的业务id。代码如下:public class ServiceIdGenerator { private static DateFormat dateFormat = new SimpleDateFormat("yy.
2020-06-05 18:42:03 1339
原创 [系统设计]--(2)控制接口调用间隔的接口并发锁
Author:赵志乾Date:2020-04-04Declaration:All Right Reserved!!!《小并发量、低延时、通用场景下的接口并发锁》给出的并发锁方案主要用于解决多个请求并发调用时,只有单个调用能够抢到锁并完成业务流程的执行。为此,其在业务代码执行前进行抢锁,执行完或异常终止时显示释放锁,以便后续请求能够顺利执行。现在我们要面临一个新的场景,某类修改接口针对...
2020-04-05 09:20:55 444
原创 [系统设计]--(1)小并发量、低延时、通用场景下的接口并发锁
Author:赵志乾Date:2020-04-04Declaration:All Right Reserved!!!实际项目中的接口大致可以分为两大类:查询类与修改类。对于查询类接口而言,其对业务数据是没有影响的(对查询进行统计的功能除外)。针对此类对业务数据无影响的接口,完全可以放开并发控制,以提高接口的响应速度。而对于修改类接口,其操作会影响到业务数据。为避免数据不一致,需要进行并发...
2020-04-04 23:37:19 284
原创 [日常踩坑]--(10)运算符优先级
Author:赵志乾Date:2020-04-04Declaration:All Right Reserved!!!踩坑:场景:复杂表达式依赖运算符默认优先级。做法:直接在if判断中使用复杂表达式且依赖运算符默认优先级。代码如下:// 第1期代码--真实意图:订单失败且计划关闭if(order.getStatus().equals(Status.FAIL)&&am...
2020-04-04 22:23:33 150
原创 [日常踩坑]--(9)包装类空指针
Author:赵志乾Date:2020-04-04Declaration:All Right Reserved!!!踩坑:场景:Vo对象中的数值类型通常使用对应的包装类。做法:直接使用equals方法或者==进行相等判断。代码如下:public class Vo{ private Integer age; // 省略getter和setter函数}p...
2020-04-04 21:57:54 764
原创 [leetcode题目解答]--(901) 股票价格跨度
Author:赵志乾Date:2020-02-29Declaration:All Right Reserved!!!题目描述:编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。例如,如果未来7天股票的价格是 [100, 80, 60, 70...
2020-02-29 19:25:09 224
原创 [leetcode题目解答]--(27) 移除元素
Author:赵志乾Date:2020-02-22Declaration:All Right Reserved!!!题目描述:给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元...
2020-02-22 19:15:00 113
原创 [leetcode题目解答]--(26) 删除排序数组中的重复项
Author:赵志乾Date:2020-02-22Declaration:All Right Reserved!!!题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2], 函数应该返...
2020-02-22 19:03:05 144 1
原创 [leetcode题目解答]--(25) K个一组翻转链表
Author:赵志乾Date:2020-02-22Declaration:All Right Reserved!!!题目描述:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给定这个链表:1->2->3->4->5...
2020-02-22 18:50:53 139
原创 [leetcode题目解答]--(24) 两两交换链表中的节点
Author:赵志乾Date:2020-02-22Declaration:All Right Reserved!!!题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3。链表节点:publi...
2020-02-22 16:17:39 189
原创 [leetcode题目解答]--(23)合并K个排序链表
Author:赵志乾Date:2020-02-22Declaration:All Right Reserved!!!题目描述:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4-&...
2020-02-22 15:32:38 219
原创 [leetcode题目解答]--(22)括号生成
Author:赵志乾Date:2020-02-20Declaration:All Right Reserved!!!题目:给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。示例:给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]...
2020-02-22 14:32:14 181
原创 [leetcode题目解答]--(21)合并两个有序链表
Author:赵志乾Date:2020-02-20Declaration:All Right Reserved!!!题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 链表节点:pu...
2020-02-20 20:36:12 147
原创 [Mysql扫盲]--(1)日期和时间函数
Author:赵志乾Date:2019-11-24Declaration:All Right Reserved!!!使用mysql进行数据管理时,经常会涉及到日期和时间的处理。mysql本身为使用者提供了一系列日期和时间处理函数,方便我们使用。以下是常用的3个日期时间函数1、日期加减函数应用场景: 基于某一日期时点进行时间偏移计算。比如,给定日期时点A,计算早于或晚于A一段...
2019-11-24 21:09:02 168
原创 [日常踩坑]--(8)工具类封装和使用
Author:赵志乾Date:2019-11-09Declaration:All Right Reserved!!!踩坑:场景:项目中经常会封装一些工具类,方便通用流程的处理。做法:封装工具类时,注意事项标注不全或命名不规范。使用工具类时,未充分了解工具类方法的特性。曾经踩过这样一个坑,使用工具类方法获取给定时间戳对应当日的凌晨0点时间戳。代码如下:public stat...
2019-11-09 11:11:42 251
原创 [通用解决方案]--(3)统一系统对接的字段别名与格式
Author:赵志乾Date:2019-09-28Declaration:All Right Reserved!!!场景实际项目中,经常会遇到调用第三方服务接口的情景。第三方通常只提供一份接口文档,且字段命名规则、格式需求与自己项目不一致。解决方案方案1:单独做一层转换按照第三方的要求写一层Vo,然后将Vo转换成自己项目中的字段格式和命名规则。此方案在实现过程中会...
2019-09-28 14:42:41 785
原创 [通用解决方案]--(2)Post请求发送Json格式的body体工具类
Author:赵志乾Date:2019-08-29Declaration:All Right Reserved!!!场景当前服务需要调用其他服务提供的基于http的接口。要求使用Post操作,Content-Type为application/json,字符集编码为UTF-8解决方案引用的jar包<dependency> <groupId>...
2019-08-29 15:14:11 1173
原创 [日常踩坑]--(7)不同jar包中JSONObject的区别
Author:赵志乾Date:2019-08-29Declaration:All Right Reserved!!!踩坑场景:HttpPost使用StringEntity配置请求体。做法:使用json-lib包中的JSONObject设置参数,并通过JSONObject的toString方法获取的json串构建StringEntity。发送端实际发送数据和期望发送数据不一致。如...
2019-08-29 11:50:59 372
原创 [日常踩坑]--(6)部分@Transactional没有生效
Author:赵志乾Date:2019-07-25Declaration:All Right Reserved!!!踩坑场景:Service层的某个方法需要事务,且该方法在本类内部被调用。(其他场景下事务都能生效)做法:直接在方法上添加注解@Transactional。结果事务未生效。解决方案该问题的原因是字节码增强未生效导致的。使用@Transactional注解后,...
2019-07-25 14:14:38 379
原创 [通用方案]--(1)图片压缩
Author:赵志乾Date:2019-07-25Declaration:All Right Reserved!!!场景上传到服务器的图片偏大时,会导致前端图片的加载过程变慢。解决方案用户上传的图片在服务器端落盘前进行压缩。1、引入依赖包thumbnailator(google开源的压缩工具)<!-- https://mvnrepository.com/ar...
2019-07-25 13:40:34 224
原创 [日常踩坑]--(5)MyBatis分页查询带嵌套集合的结果集
Author:赵志乾Date:2019-07-24Declaration:All Right Reserved!!!踩坑:场景:分页查询带嵌套结果集合的Vo,如下:// 结果记录package com.zhaozhiqian;import java.util.List;public class NodeVo { private String id; ...
2019-07-24 13:59:59 1327 3
原创 [日常踩坑]--(4)混淆显示文本和编码文本
Author:赵志乾Date:2019-07-08Declaration:All Right Reserved!!!踩坑:场景:将代码中写死的文本信息调整到界面可配置。做法:使用数据库存放要配置的文本内容。将代码中的文本信息复制粘贴到输入文本框,结果存储到数据库中的文本多转义了一次。// 代码中的配置--内容是一个向右指的手势
2019-07-08 19:53:38 638
原创 [日常踩坑]--(3)多服务访问同一图片的跨域问题
Author:赵志乾Date:2019-07-04Declaration:All Right Reserved!!!踩坑:前提:ftp服务器存放图片,图片的url存放在数据库表中。场景:服务A前端负责图片的增删改查,服务B和服务C的前端代码通过url查询图片时,报跨域访问问题。做法:数据库表中存放图片的完整url(即包含域名)解决方案:上述问题是由图片url强关联服...
2019-07-04 19:41:28 454
原创 [日常操作]--(1)日志文件查看
Author:赵志乾Date:2019-07-04Declaration:All Right Reserved!!!背景:线上项目出现问题时,通常需要通过日志文件进行定位。操作:使用下面3条指令可以很方便地进行日志查看。// 进入日志文件所在目录cd 日志文件所在目录// 过滤文件中带关键字的行,并且显示行号.cat -n 日志文件名 | grep 关键字...
2019-07-04 19:38:22 359
原创 [日常踩坑]--(3)MySQL存储emoji表情产生乱码
Author:赵志乾Date:2019-06-14Declaration:All Right Reserved!!!踩坑:前提:mysql-connector-java版本为5.1.30,mysql版本为5.7.17。场景:数据库指定字段类型为varchar,使用的字符集为utf8mb4,将emoji表情通过JDBC存储时产生乱码。做法:jdbcUrl中使用charac...
2019-06-14 10:15:39 979
原创 [日常踩坑]--(2)切面未做异常处理
Author:赵志乾Date:2019-06-12Declaration:All Right Reserved!!!踩坑:前提:切面逻辑和业务代码均未做异常处理。场景:项目采用多数据源配置,在切面中完成数据源的动态切换。当业务代码抛异常后,没有自动切回默认数据源。做法:public Object around(ProceedingJoinPoint point, Ch...
2019-06-12 14:35:11 514
原创 [日常踩坑]--(1)MySql数据库时间戳精度
Author:赵志乾Date:2019-06-05Declaration:All Right Reserved!!!踩坑:前提:数据库中TIMESTAMP采用默认精度(秒),Java应用中Timestamp精度为毫秒。场景:需要将数据库中时间戳设置为当日00:00:00之前。做法:如下代码,存库后依然是当日00:00:00。Long todayBegin = 当日00...
2019-06-05 20:05:46 4998
原创 ApplicationContextAware构建BeanHolder
Author:赵志乾Date:2019-05-16Declaration:All Right Reserved!!!基于Spring框架的实际项目,会将Bean放入IoC容器进行统一管理(包括依赖管理和生命周期管理)。而从IoC容器中获取需要的Bean则主要是通过容器接口ApplicationContext。Web项目中,通常都是由Web容器和Spring IoC容器相互配合完成B...
2019-05-16 14:01:12 262
原创 ContextRefreshedEvent事件解决初始化
Author:赵志乾Date:2019-05-16Declaration:All Right Reserved!!!实际项目开发中,经常会遇到“应用启动时进行初始化”的诉求。在基于Spring框架的项目中,解决方案如下:1、监听ContextRefreshedEvent事件Spring容器初始化完成后(onRefresh)会触发ContextRefreshedEvent事件,因...
2019-05-16 11:48:24 976
原创 [java面试]---dubbo系列---(2)dubbo中的负载均衡策略
Author:赵志乾Date:2019-05-11Declaration:All Right Reserved!!!dubbo作为一款成熟的rpc框架,在协议所定义的功能之上封装了许多额外的功能,如容错策略、负载均衡策略等等。其中,dubbo支持的负载均衡策略包括随机(Random)、轮询(RoundRobin)、最少活跃调用数(LeastActive)和一致性Hash(Consi...
2019-05-11 14:06:03 188
原创 [Spring基础扫盲]---(1)import标签规划配置文件
Author:赵志乾Date:2019-05-10Declaration:All Right Reserved!!!随项目规模的增大,Spring配置文件也会不断增大。为了便于配置文件的管理和维护,实际应用中通常采用import标签来规划配置文件,即先将配置文件进行拆分,按功能放置于对应模块,最后在主配置文件(通常是applicationContext.xml)中使用import标签进行...
2019-05-10 15:07:40 440
原创 [Java基础扫盲]--JDBC
Author:赵志乾Date:2019-05-04Declaration:All Right Reserved!!!1、什么是JDBCJDBC是Java应用访问数据库的一套标准接口,其全称为Java DataBase Connectivity。Java程序通过JDBC接口来间接访问数据库,JDBC接口下接JDBC驱动,由JDBC驱动来完成对数据库的访问。其中,JDBC接口内置于J...
2019-05-04 15:23:02 130
原创 [Java基础扫盲]--反射与泛型--(5)泛型
Author:赵志乾Date:2019-05-04Declaration:All Right Reserved!!!1、什么是泛型所谓的泛型就是编写模板代码来适应任意类型,从而避免一些繁琐的类型转化,且能够让编译器在编译阶段进行类型检查。在使用泛型时,其继承关系中要保持泛型参数不变。例如:ArrayList<Integer>和List<Integer>有继承关...
2019-05-04 10:50:42 110
原创 [Java基础扫盲]--反射与泛型--(4)注解
Author:赵志乾 Date:2019-05-03 Declaration:All Right Reserved!!!1、什么是注解注解就是放在Java源码中类、方法、字段、参数前的一种标签。其以@字符起始。注解本身对代码逻辑是没有任何影响的,而对于注解的使用是由对应的工具来决定的。例如编译器使用的一些注解:@Override注解让编译器检查其所标注的方法是否正确的实现了覆写...
2019-05-03 21:34:46 118
原创 [Java基础扫盲]--反射与泛型--(2)方法调用与继承关系获取
Author:赵志乾 Date:2019-05-03 Declaration:All Right Reserved!!!1、方法信息获取反射可以Class实例获取引用类型所有相关信息,包括方法信息。假设Class实例为cls,则获取方法信息如下:cls.getMethod(方法名,参数列表); //获取某个public方法,包括父类中的public方法cls.getMeth...
2019-05-03 20:34:33 158
原创 [Java基础扫盲]--反射与泛型--(1)反射
Author:赵志乾Date:2019-05-03Declaration:All Right Reserved!!!1、Class实例由来Java语言中,除了基本类型外,其他类型都统称引用类型。而每一种引用类型都是JVM所引入广义类型的特例,其依据能持有的实例不同而有所区分。为了明确表征一个引用类型,JVM进程在内存中使用Class的一个实例来存储引用类型的所有信息,如:该引用类型有...
2019-05-03 19:22:52 138
原创 [基础知识点扫盲]---(1)zookeeper的4种使用场景
Author:赵志乾Date:2019-04-13Declaration:All Right Reserved!!!zookeeper作为分布式系统的一种基础组件,有着广泛的应用场景。今天我们一起来看一下最常用的4种场景:·分布式锁·元数据/配置信息管理·分布式协调·高可用1、分布式锁分布式系统中,各服务大多都是多实例部署,即多个服务实例操作同一数据源,为...
2019-04-13 22:48:49 327
Linux命令行与Shell脚本编程大全LinuxCommandLineAndShellScriptingBible(2th).pdf
2017-10-15
精通AngularJS.pdf
2017-09-13
AngularJS权威教程.pdf
2017-09-13
effective STL 中文版
2016-08-23
大话处理器:处理器基础知识读本.pdf
2016-03-18
大话物联网
2016-03-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人