中间件

ZooKeeper 简单概括

Java 开发 / SpringCloud

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

中间件

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

Java 开发

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

Java 开发

Spring 知识图解

Java 开发

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

数据库

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

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

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

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

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

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

图解 IO

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

图解 AQS

1727 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

4411 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);...
股票买卖问题
9月6日 · 2020年

股票买卖问题

1545 0
葵花宝典 状态转移框架dp[i][k][1]:表示今天是第 i 天,手上持有股票,至今最多允许交易 k 次dp[i][k][0]:表示今天是第 i 天,手上没有持有股票,至今最多允许交易 k 次 /** * 解释:今天我没有持有股票,有两种可能: * 1、要么是我昨天就没有持有,然后今天选择 rest,所以我今天还是没有持有; * 2、要么是我昨天持有股票,但是我今天 sell 了,所以我今天没有持有股票了。 * max( 选择 rest, 选择 sell ) */ ...
Sharding-JDBC 支持动态扩容及刷新 ActualDataNodes
9月7日 · 2020年

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

12938 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年

junit5 下 wiremock 正确使用方式

3066 0
场景描述 通过 wiremock 方式模拟远程接口调用时,发现注解 @Rule 失效,即下图代码无效:@Rulepublic WireMockRule wireMockRule = new WireMockRule(8080);...
3月17日 · 2020年

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

11360 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 命令的,可选性更强。...
11月29日 · 2019年

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

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

本站事故复盘

2723 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年的站就这样被自己搞没了......
MySQL 中 redo log、undo log、binlog 的总结
12月5日 · 2019年

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

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

Spring 本地事务

2184 0
本文总结了 Spring 本地事务的使用方式和注意点,为后面总结“分布式事务“的文章做铺垫。本地事务传播行为.....
使用 Feign 调用分页接口报错:Method has too many Body parameters
11月8日 · 2020年

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

4411 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);...
12月2日 · 2019年

gradle 项目解决 jar 包冲突

4212 0
现象:当添加 jar 包 "org.apache.shardingsphere:sharding-jdbc-core:4.0.0-RC2"(仅用作举例) 后,idea给出下方的提示,并且很多类文件报错,去掉这个 jar 包后,又恢复正常。故猜测应该是 jar 包冲突导致的。...
8月15日 · 2020年

图解 JVM

1507 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 做的事情,做个不恰当的比喻,你妈让你打扫房间,你只把眼皮子底下的垃圾捡了就可以过关了,而不用把床底和桌角的垃圾扫干净...
1月27日 · 2020年

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

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

多数据源下的单元测试优化

1901 0
水平分表完成业务代码后,在运行单元测试时,出现了以下两个问题:事务不回滚性能极差:200 个单元测试方法,分表之前,平均耗时 12 分钟左右,分表之后,耗时 50 分钟左右...解释下,分表之前耗时 12 分钟左右的大概原因:对于持久层代码,没有 mock,直接走的 DB单元测试未使用 H2 等内存数据库,因为有一些操作 H2 不支持其它历史问题,下面会提及...
数据库More
12月15日 · 2019年

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

3369 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 及以上版本中的.....
3月20日 · 2020年

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

2508 0
前面写过一篇通过 Jdbc + Job 解决跨库大表数据迁移,那只是个初始版本,后面对其进行了优化改造,数据迁移性能大幅度提升。优化点单实例 Job 优化为多实例 Job单线程优化为多线程普通偏移优化为分段偏移...
MySQL 中 redo log、undo log、binlog 的总结
12月5日 · 2019年

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

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

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

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

数据迁移后的一致性校验

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

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

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

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

2222 0
使用场景:系统解耦、异步、多服务订阅消息、消息可靠性、消息时序性 发送端:.....
Sharding-JDBC 支持动态扩容及刷新 ActualDataNodes
9月7日 · 2020年

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

12938 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...
8月23日 · 2020年

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

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

基于 Redis 实现分布式锁

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

ZooKeeper 简单概括

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

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

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

数据结构:跳表

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

零钱兑换问题

1609 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;}...
打家劫舍问题
9月13日 · 2020年

打家劫舍问题

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

股票买卖问题

1545 0
葵花宝典 状态转移框架dp[i][k][1]:表示今天是第 i 天,手上持有股票,至今最多允许交易 k 次dp[i][k][0]:表示今天是第 i 天,手上没有持有股票,至今最多允许交易 k 次 /** * 解释:今天我没有持有股票,有两种可能: * 1、要么是我昨天就没有持有,然后今天选择 rest,所以我今天还是没有持有; * 2、要么是我昨天持有股票,但是我今天 sell 了,所以我今天没有持有股票了。 * max( 选择 rest, 选择 sell ) */ ...
搜索二维矩阵问题
10月18日 · 2020年

搜索二维矩阵问题

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

路径总和问题

1383 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);}...