数据库

数据迁移后的一致性校验

中间件

基于 Redis 实现分布式锁

算法

路径总和问题

Java 开发

Prometheus 监控的开关配置

Java 开发

线上 JVM 堆内存不足引发BeanCreationNotAllowedException

Java 开发

压测工具 JMeter 实操

Java 开发

图解 JVM

面试 6 家公司,拿下三个大厂 offer
1月31日 · 2021年

面试 6 家公司,拿下三个大厂 offer

3916 3
前段时间,本人利用三周时间(排除等offer的时间),面试了6家公司,拿下了4个offer(两个BAT,一个二线大厂,一个福利非常棒的独角兽)。另外,没拿下的两个公司(一个要转go语言)都终止于二面。...
基于 Redisson 实现切面分布式锁(升级版)
11月23日 · 2020年

基于 Redisson 实现切面分布式锁(升级版)

2266 0
之前使用过Redis作为分布式锁,但是因为本身特性的局限性,存在很多隐患,故将Redis替换成了Redisson。(由于公司直接买的腾讯云的Redis,对于开发者来说,它是单实例的,屏蔽了内部的底层实现,故本文暂且只考虑Redis是单实例的场景,如果想要了解在多实例情况下,基于Redis/Redisson作为分布式锁,可以自行搜索RedLock的具体实现,也很简单)。...
图解 IO
11月22日 · 2020年

图解 IO

2092 1
一、图解普通IO、mmap、零拷贝 1、如果不使用零拷贝技术,普通的IO操作在OS层面是如何执行的? 2、mmap(内存映射技术)为什么可以提升IO性能?3、零拷贝技术是如何提升IO性能的?...
图解 AQS
11月22日 · 2020年

图解 AQS

1681 0
AQS,全称AbstractQueuedSynchronizer,是 JDK 提供的一个同步框架,内部维护了一个 volatile int state(代表共享资源)和一个 FIFO 线程等待队列(多线程争用资源被阻塞时会进入此队列) ...
使用 Feign 调用分页接口报错:Method has too many Body parameters
11月8日 · 2020年

使用 Feign 调用分页接口报错:Method has too many Body parameters

4312 2
使用 Feign 调用分页接口报错:Method has too many Body parameters @ApiOperation(value = "分页查询会话")@PostMapping(Routes.SESSIONS_QUERY)JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo, @PageableDefault(size = 20, sort = "id", direction = Sort.Direction.DESC) Pageable pageable);...
11月30日 · 2019年

分布式主键调研

2665 0
近期要对一个亿级别的表分库分表,一个很重要的环节就是要选定一个分布式主键的生成方式,本文主要总结下对分布式主键调研的结果。分布式主键生成方式主要分为两大类:中心化、去中心化。...
3月17日 · 2020年

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

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

MySQL 中 redo log、undo log、binlog 的总结

21587 8
本文主要总结下重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)的概念。redo log 是物理日志,undo log 和 binlog 是逻辑日志,物理日志的恢复速度远快于逻辑日志。innodb 事务日志包括 redo log 和 undo log,redo log 是重做日志,提供前滚操作,undo log 是回滚日志,提供回滚操作。...
8月15日 · 2020年

图解 JVM

1465 0
年轻代和老年代都是使用的 G1 收集器年轻代收集:YGC(STW):E 和 S(from) 区 复制到 S(to)(是个 free Region),然后清除 E 和 S(from) 区中未存活的对象MixGC(年、老年代收集(清理的不是很干净,但是清理的时间特别短)):1、初始标记 (标记 GCroot 直接引用的对象和所在的 Region,这里不止标记 O 区,初次标记一般和 YGC 的 STW 同时进行) 2、根区间扫描(扫描 GCroot 所在的 Region 到 Old 区的引用)3、并发标记(类似 CMS,但是标记的是整个堆,而不是只有 O 区。这期间如果发现某个 Region 所有对象都是\'垃圾\'则标记为 X)4、重新标记(同 CMS,并且将上一步中的 X 区删除,另外,用了 SATB,速度更快,也是 STW)5、复制清理(选择所有 Y 区 Reigons 和\'对象存活率较低\'的 O 区 Regions 组成 Csets,进行复制清理,STW)其实我们不需要完全的清理干净,每次我们只清理大部分也能保证系统的正常运行,这就是 MixGC 做的事情,做个不恰当的比喻,你妈让你打扫房间,你只把眼皮子底下的垃圾捡了就可以过关了,而不用把床底和桌角的垃圾扫干净...
Sharding-JDBC 支持动态扩容及刷新 ActualDataNodes
9月7日 · 2020年

Sharding-JDBC 支持动态扩容及刷新 ActualDataNodes

12557 6
需求 目前,有一个基于自增message_id的范围分片表(message_id_mapping),如何动态地创建分表并刷新分表的配置(ActualDataNodes)?开发 范围分片配置 # message_id_mapping表的路由策略spring.shardingsphere.sharding.tables.message_id_mapping.actual-data-nodes = shardingds.message_id_mappingspring.shardingsphere.sharding.tables.message_id_mapping.table-strategy.standard.sharding-column = message_idspring.shardingsphere.sharding.tables.message_id_mapping.table-strategy.standard.precise-algorithm-class-name = com.xxx.yyy.persistence.config.MessageIdShardingAlgorithmspring.shardingsphere.sharding.tables.message_id_mapping.table-strategy.standard.range-algorithm-class-name = com.xxx.yyy.persistence.config.MessageIdShardingAlgorithm...
12月1日 · 2019年

本站事故复盘

2656 2
2019年11月23日上午9点左右,在没有手动备份的前提下,升级了 MySql 数据库(从5.1到5.7)半小时后,升级结束,网站无法登陆,显示“error establishing a database connection”当时没多想,以为是升级后不兼容导致的,又切换到了5.1版本,网站还是报同样的错误当时由于有别的更重要的事,故先放弃了折腾下午14点左右,还未回家,尝试用手机登陆宝塔面板继续解决,搞了半天无果,故询问宝塔管理员,他让我在服务器上执行ps aux|grep mysql,可是手机端没有尝试过ssh登陆,故暂时放下了手机下午17点左右赶回家,开始查看原因,最后发现 MySql 压根没有安装成功,我又在原版本5.1和新版本5.7之间尝试切换了几次,都无法连接 phpmyadmin...晚上20点左右,打算重装宝塔,先备份数据库,瞬间备份完成,当时心惊了一下,赶紧查看备份好的文件,才几十B,完了,数据全没了..赶紧查看每周通过 shell 脚本备份的数据库压缩包,什么鬼,才几百B,解压,发现里面竟然只有一张用户表..2年的站就这样被自己搞没了......
谈谈分库分表
9月29日 · 2020年

谈谈分库分表的几个核心流程

2447 0
移动互联网时代,随着软件用户量的不断增长,由此产生的数据量也在飞速增长,比如,用户表、订单表、聊天消息表等。据统计,MySQL单表可以存储10亿级数据,只是这时性能比较差,业界公认MySQL单表容量在1KW量级是最佳状态,因为这时它的BTREE索引树高在3~5之间。既然一张表无法搞定,那么就想办法将数据放到多个地方,目前比较普遍的方案有3个:分区要求数据不是海量(分区数有限,存储能力就有限)业务并发能力要求不高分库分表互联网行业处理海量数据的通用方法发展几十年的RDBMS(关系型数据库)具有生态完善、绝对稳定、事务特性的优点,只要有软件的地方,它都是核心存储的首选NoSQL/NewSQLNoSQL/NewSQL宣传的无论多厉害,就现在各大公司对它的定位,都是RDBMS的补充,而不是取而代之...
Java 开发More
图解 AQS
11月22日 · 2020年

图解 AQS

1681 0
AQS,全称AbstractQueuedSynchronizer,是 JDK 提供的一个同步框架,内部维护了一个 volatile int state(代表共享资源)和一个 FIFO 线程等待队列(多线程争用资源被阻塞时会进入此队列) ...
12月18日 · 2019年

异步并发利器:CompletableFuture、parallelStream

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

Spring 本地事务

2125 0
本文总结了 Spring 本地事务的使用方式和注意点,为后面总结“分布式事务“的文章做铺垫。本地事务传播行为.....
1月9日 · 2020年

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

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

面试 6 家公司,拿下三个大厂 offer

3916 3
前段时间,本人利用三周时间(排除等offer的时间),面试了6家公司,拿下了4个offer(两个BAT,一个二线大厂,一个福利非常棒的独角兽)。另外,没拿下的两个公司(一个要转go语言)都终止于二面。...
使用 Feign 调用分页接口报错:Method has too many Body parameters
11月8日 · 2020年

使用 Feign 调用分页接口报错:Method has too many Body parameters

4312 2
使用 Feign 调用分页接口报错:Method has too many Body parameters @ApiOperation(value = "分页查询会话")@PostMapping(Routes.SESSIONS_QUERY)JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo, @PageableDefault(size = 20, sort = "id", direction = Sort.Direction.DESC) Pageable pageable);...
数据库More
谈谈分库分表
9月29日 · 2020年

谈谈分库分表的几个核心流程

2447 0
移动互联网时代,随着软件用户量的不断增长,由此产生的数据量也在飞速增长,比如,用户表、订单表、聊天消息表等。据统计,MySQL单表可以存储10亿级数据,只是这时性能比较差,业界公认MySQL单表容量在1KW量级是最佳状态,因为这时它的BTREE索引树高在3~5之间。既然一张表无法搞定,那么就想办法将数据放到多个地方,目前比较普遍的方案有3个:分区要求数据不是海量(分区数有限,存储能力就有限)业务并发能力要求不高分库分表互联网行业处理海量数据的通用方法发展几十年的RDBMS(关系型数据库)具有生态完善、绝对稳定、事务特性的优点,只要有软件的地方,它都是核心存储的首选NoSQL/NewSQLNoSQL/NewSQL宣传的无论多厉害,就现在各大公司对它的定位,都是RDBMS的补充,而不是取而代之...
12月10日 · 2019年

MySQL 常用锁和 MVCC 总结

4290 0
前段时间,在 scala 项目的某块业务迁移到微服务上线前,测试环境意外地发生了两次死锁问题,触发死锁的原因不同,一次是因为数据迁移不到位,由更新操作导致,解决方式是重写 update 方法。另一个是因为前人写的代码太过于随意,一个事务中包含了多个模版方法,由不同的子类去实现方法,后人在实现时,有可能并不知道自己实现的方法是被嵌套在事务中的,从而扩展了很多操作,操作中不乏有耗时的远程调用,从而一个小事务被慢慢积累成一个大事务,最终导致了死锁,由于老业务(scala 项目)很复杂,当时解决的方式是将死锁的方法异步处理。从那之后,自己断断续续做了一些关于 MySQL 并发相关的笔记,本文先梳理下 MySQL 控制并发访问的两种手段(MVCC 和几种常用锁)。...
11月29日 · 2019年

数据迁移后的一致性校验

10149 2
目前正在对 scala 项目(某块业务)重构,重构成 Java 微服务,业务、表设计都有些许变化,其中涉及到数据迁移,简单来说就是从老表迁到新表(表结构发生了变化)。为了保证迁移前后数据的一致性,需要进行一些必要的验证。本文主要讨论下自己在进行数据一致性校验时用到的方法,仅仅作为一种数据验证的思路,分享给大家,内容可能有一些瑕疵,欢迎大家指正。...
MySQL 中 redo log、undo log、binlog 的总结
12月5日 · 2019年

MySQL 中 redo log、undo log、binlog 的总结

21587 8
本文主要总结下重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)的概念。redo log 是物理日志,undo log 和 binlog 是逻辑日志,物理日志的恢复速度远快于逻辑日志。innodb 事务日志包括 redo log 和 undo log,redo log 是重做日志,提供前滚操作,undo log 是回滚日志,提供回滚操作。...
3月20日 · 2020年

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

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

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

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

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

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

基于 Redisson 实现切面分布式锁

2183 0
之前项目中使用的是`基于 Redis 实现分布式锁`中的基于 redis 1.5.* 版本使用 setIfAbsent实现的分布式锁,为了使用简单,也是通过AOP切面的方式实现的,但是随着并发量的增长,难免会产生一些担心:...
8月23日 · 2020年

基于 SpringBoot + (ShardingSphere)Sharding-JDBC + Flyway + JOOQ + Gradle 进行水平分表的问题汇总

4578 0
Sharding-JDBC 的性能问题ShardingSphere 与 JOOQ 的版本兼容问题多数据源与 Flyway 的结合问题Sharding-JDBC 与 JOOQ 的兼容问题多数据源下的 DSLContext 配置多数据源下的事务问题数据迁移问题......
11月29日 · 2019年

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

2173 0
使用场景:系统解耦、异步、多服务订阅消息、消息可靠性、消息时序性 发送端:.....
12月7日 · 2019年

基于 Redis 实现分布式锁

2797 0
分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。由于线上出现了并发问题,导致出现了很多脏数据,分布式环境下,考虑到乐观锁无法解决,也只能请教于分布式锁了。实现分布式锁的方式有:数据库乐观锁、基于 Redis 的分布式锁.....
11月29日 · 2019年

ZooKeeper 简单概括

1975 0
Apache ZooKeeper是Apache软件基金会的一个软件项目,他为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。ZooKeeper的架构通过冗余服务实现高可用性。因此,如果第一次无应答,客户端就可以询问另一台ZooKeeper主机。ZooKeeper节点将它们的数据存储于一个分层的命名空间,非常类似于一个文件系统或一个前缀树结构。客户端可以在节点读写,从而以这种方式拥有一个共享的配置服务。更新是全序的。使用ZooKeeper的公司包括Rackspace、雅虎和eBay,以及类似于象Solr这样的开源企业级搜索系统。...
算法相关More
打家劫舍问题
9月13日 · 2020年

打家劫舍问题

2881 3
本文整理于自己的学习笔记.. 一、打家劫舍 I 自顶向下、使用备忘录的递归解法 自顶向下:递归一般是自顶向下,依赖于子问题优化函数的结果,只有子问题完全求出,也就是子问题的递归返回结果,原问题才能求解。...
朋友圈问题
11月1日 · 2020年

朋友圈问题

1396 0
朋友圈 班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/friend-circles著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。...
12月29日 · 2019年

数据结构:跳表

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

搜索二维矩阵问题

1661 1
搜索二维矩阵问题 前言 搜索二维矩阵 I和搜索二维矩阵 II两道题在解题思路上都是围绕二分查找展开的,搜索二维矩阵 I比较简单,纯暴力或直接套二分查找的公式(二维的二分查找)即可,而搜索二维矩阵 II的解题方法就比较特别,个人感觉有点意思,故在此记录下~...
零钱兑换问题
10月18日 · 2020年

零钱兑换问题

1554 0
一、零钱兑换 I 自顶向下、使用备忘录(HashMap)的递归解法 // 备忘录Map<Integer, Integer> memoMap = new HashMap<>();public int coinChange(int[] coins, int amount) { // 查备忘录,避免重复计算 if (memoMap.containsKey(amount)) { return memoMap.get(amount); } // base case if (amount == 0) return 0; // 下面的递归入参,假如 amount - coin < 0,则返回 -1 if (amount < 0) return -1; // 最差的情况,就是使用 amount 个面值为 1 的硬币,而 amount + 1 就是个不存在的值,下面要比较最小值,则每次递归都使用 amount + 1 比较求最小值即可 int res = amount + 1; for (int coin : coins) { // 子问题(目标金额减去当前 coin) int subProblem = coinChange(coins, amount - coin); if (subProblem == -1) continue; // 求最值,即 res 与 子问题加上一个 coin(与上面`目标金额减去当前 coin`相对应,即自顶向下的思想) 求最值 res = Math.min(res, subProblem + 1); } res = res == amount + 1 ? -1 : res; memoMap.put(amount, res); return res;}...
路径总和问题
10月25日 · 2020年

路径总和问题

1329 0
一、路径总和 I 递归 public boolean hasPathSum(TreeNode root, int sum) { if (root == null) { return false; } if (root.left == null && root.right == null) { return root.val == sum; } return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);}...