Java 开发

junit5 下 wiremock 正确使用方式

中间件

ZooKeeper 简单概括

中间件

RabbitMQ 发送端和消费端的总体设计

Java 开发

Spring 本地事务

数据库

数据迁移后的一致性校验

中间件

基于 Redis 实现分布式锁

Java 开发

SpringBoot 中 @Scheduled 的执行原理

3月29日 · 2020年

线上 JVM 堆内存不足引发BeanCreationNotAllowedException

156 0
线上 JVM 堆内存不足引发BeanCreationNotAllowedException背景某个周六的中午,领导突然找我说线上有大量报错,让我看一下。我发现日志中出现了很多下面的报错信息,而且持续了一段时间(后面才发现收到了告警邮件,但是当时手机没有提醒,强行甩锅...):...
3月27日 · 2020年

多种状态字段的查询性能优化案例

159 0
多种状态字段的查询性能优化案例前提问题当分页查询消息的时候,会查询符合条件的消息total数量,这个操作在查询消息数量比较多的时候,很容易出现timeout(从库查询一万多条消息,count 一下,需要90多秒),经查证,是现有receiver_visible_roles字段导致的:receiver_visible_roles存储:目前这个字段是存了5种角色的可见性,1代表可见,0代表不可见,从高位到低位依次代表:E、D、C、B、A。假如A、B可见,其余角色不可见,则存储00011。receiver_visible_roles查询:假如查A、B可见,其余角色没有限制,则需要 in (00011, 00111, 01011, 01111, 10011, 10111, 11011, 11111),虽然该字段建有索引,并用到了索引,但还是很慢。另,假如再新增角色,查询性能会更慢......
3月20日 · 2020年

[升级版]通过 Jdbc + Job 解决跨库大表数据迁移

152 0
前面写过一篇通过 Jdbc + Job 解决跨库大表数据迁移,那只是个初始版本,后面对其进行了优化改造,数据迁移性能大幅度提升。优化点单实例 Job 优化为多实例 Job单线程优化为多线程普通偏移优化为分段偏移...
3月17日 · 2020年

Redis中通过scan命令获取key、value【Java实现】

328 0
需求:通过 Job 每秒去 Redis 中获取 Key 前缀为:“message:xxx:yyy:id: ”的所有 Value,Value以字符串类型存储,键值对存储量级:几百万。 Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的 Key 的信息,有两种方式:1、通过 keys 命令,简单粗暴,由于Redis单线程这一特性,keys 命令以阻塞的方式执行。keys 命令通过遍历查找,时间复杂度是 O(n)。Redis 库中 key 的数量越多,查找实现的代价越大,产生阻塞的时间越长。2、通过 scan 命令,以非阻塞的方式实现 key 值的查找,绝大多数情况下是可以替代 keys 命令的,可选性更强。...
1月27日 · 2020年

通过 Jdbc + Job 解决跨库大表数据迁移

420 0
将 scala 项目重构为 Java 微服务,在进行读迁移时,其中有一块业务数据量是亿级别的,需要进行跨库数据迁移(注意:表结构发生了很大变化),并且在迁移过程中尽量做到不停服迁移。针对亿级别的数据量级,肯定不能使用脚本迁移的方式迁移,更不可能使用 mysqldump 命令进行导入导出进行数据迁移。网上还有以导入导出文件的形式迁移百万级数据,但是这个操作需要修改 mysql 的配置,保险起见,直接 pass ...最终,选择通过 Jdbc 配合 Job 在双写阶段进行数据迁移,待数据迁移基本完毕,并且数据一致性校验没问题后,再进行读迁移的上线(此时,只需要业务方上线,将读切换到现在的微服务即可)。...
1月9日 · 2020年

@Transactional 事务提交之后执行 @Async 修饰的方法

705 0
一个 @Transactional 修饰的方法A 的内部要调用另一个用 @Async 修饰的方法B,并且方法B 要在方法A 的事务提交之后,异步执行,大概就是下面代码这样。方法A 和 方法B 假如在同一个类中,则方法B 的 @Async 注解会失效:首先解释下 @Transactional 注解失效的原因:Spring 在扫描 bean 的时候会扫描方法上是否包含 @Transactional 注解,如果包含.....
12月29日 · 2019年

数据结构:跳表

412 0
本文主要总结下自己学习跳表时的一些笔记,主要包含跳表的由来、时空复杂度、增删改查和具体应用四个方面。二分查找的数据结构是数组,利用数组随机访问查找的时间复杂度是 O(logn)。如果数据结构是链表,可以达到这样的速度吗?答案是可以的,只是需要对链表进行改造,改造之后的结构就是跳表(又名跳跃表),是一种动态数据结构,可以支持快速的插入、删除、查找、按范围查找,功能类似于红黑树,Redis 中的有序集合使用的就是跳表(后文会说)。...
12月18日 · 2019年

异步并发利器:CompletableFuture、parallelStream

752 0
生产上 prometheus 频繁告警java.net.SocketTimeoutException: timeout(远程调用超时),首先确定是哪个接口,后查看 Hystrix 的配置,发现 A 服务对 B 服务设置的超时时间是20s(一开始是没有发现未启用这个配置的),故一直在 review B 服务的这个超时的接口,一开始是在整个接口上,接口内部的 IO 操作、MQ 操作上都做了时间差的日志打印操作,发到线上后,发现有的请求达到了10s 多,但是 Hystrix 配置的超时时间是 20s 呀,百思不得其解,眼下做的只能是赶紧优化下 B 服务的这个超时接口了(毕竟耗时太严重了)。...
12月15日 · 2019年

Error running jOOQ code generation tool: com.mysql.cj.jdbc.Driver..

517 0
今天在用 JOOQ 生成代码的时候,即运行 mvn clean install 命令时,出现以下错误,代码中指定的驱动明明是“com.mysql.jdbc.Driver”,但是报错信息中显示的确是驱动“com.mysql.cj.jdbc.Driver”。经搜索,com.mysql.jdbc.Driver 是 mysql-connector-java 5 中的com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6 及以上版本中的.....
12月13日 · 2019年

简单递归问题

324 0
需求 给定一个十进制数,每一位要么是 0,要么是 1,为 1 的那一位保持不变,为 0 的那一位可以为 0 也可以为 1,求所有的组合场景。示例:给定 int num = 1001,则 targets = {1001, 1101, 1011, 1111}......