中间件

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

算法

零钱兑换问题

Java 开发

图解 AQS

算法

数据结构:跳表

Java 开发

图解 JVM

中间件

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

Java 开发

Spring 知识图解

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

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

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

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

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

图解 IO

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

图解 AQS

496 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

928 0
使用 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);...
3月17日 · 2020年

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

3730 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 命令的,可选性更强。...
Sharding-JDBC 支持动态扩容及刷新 ActualDataNodes
9月7日 · 2020年

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

2149 2
需求 目前,有一个基于自增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年

线上定时任务全部罢工

1289 0
针对某块业务有两个 JOB,一个是全局处理的 JOB(每天0点执行),一个是部分处理的 JOB(每5分钟执行一次)。当晚上线时,由于已经过了0点,也就没有看这个定时任务是否正常执行(查看日志,其它定时任务都在正常执行)。隔天早上,看日志时,发现所有的定时任务全部罢工了,也没有任何报错信息。然后汇报组长问题,组长重启服务后又全部正常了(重启真是万能药呀)。后又看了看测试环境的定时任务是否正常,结果也全部罢工了,很奇怪,当时自测时,每个定时任务都是没问题的(后文揭晓)。但是具体什么原因导致的,当时真的不清楚。...
12月1日 · 2019年

本站事故复盘

1400 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年的站就这样被自己搞没了......
12月29日 · 2019年

数据结构:跳表

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

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

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

搜索二维矩阵问题

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

分布式主键调研

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

图解 IO

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

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

1491 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月1日 · 2019年

junit5 下 wiremock 正确使用方式

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

OSI七层模型、TCP/IP四层模型

359 0
七层负载均衡:基于虚拟的 URL 或主机 IP 的负载均衡 。在四层负载均衡的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个 Web 服务器的负载均衡,除了根据 VIP 加 80 端口辨别是否需要处理的流量,还可根据七层的 URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的 Web 服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。对应的负载均衡器称为七层交换机(L7 switch),除了支持四层负载均衡以外,还有分析应用层的信息,如 HTTP 协议 URI 或 Cookie 信息,实现七层负载均衡。此种负载均衡器能理解应用协议。...
12月3日 · 2019年

SpringBoot 中 @Scheduled 的执行原理

2312 0
前面有篇文章是“线上定时任务全部罢工”,本文主要从代码的角度分析下原因。注解 @Scheduled 的执行原理 1、加载所有使用 @Scheduled 注解的类及方法。Spring 首先会通过类 ScheduledAnnotationBeanPostProcessor 的 postProcessAfterInitialization 方法去初始化 bean,待初始化完 bean 后,就会拦截所有用到“@Scheduled”注解的方法,进行调度处理,具体细节请看下面代码:.....
数据库More
谈谈分库分表
9月29日 · 2020年

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

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

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

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

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

1491 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 解决跨库大表数据迁移

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

MySQL 常用锁和 MVCC 总结

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

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

12799 4
本文主要总结下重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)的概念。redo log 是物理日志,undo log 和 binlog 是逻辑日志,物理日志的恢复速度远快于逻辑日志。innodb 事务日志包括 redo log 和 undo log,redo log 是重做日志,提供前滚操作,undo log 是回滚日志,提供回滚操作。...
中间件More
基于 Redisson 实现切面分布式锁(升级版)
11月23日 · 2020年

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

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

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

2149 2
需求 目前,有一个基于自增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...
11月29日 · 2019年

RabbitMQ 发消息报错 Listener not registered

29441 1
在完成 MQ 的发送方代码后,通过单元测试(mock 方式)发现发送方代码是没有问题的,但是通过 JOB 发送消息就一直提示“Listener not registered..”,又通过 http 直接调用接口来发送消息,也是提示“Listener not registered..”,然后各种检查配置、各种谷歌都无济于事,最后只能 debug 源码了。...
8月23日 · 2020年

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

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

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

1082 0
使用场景:系统解耦、异步、多服务订阅消息、消息可靠性、消息时序性 发送端:.....
Elasticsearch 常规概念及底层原理
11月1日 · 2020年

Elasticsearch 常规概念及底层原理

573 0
一、ES 分布式架构原理 ES设计的理念是分布式搜索引擎,底层实现基于Lucene,核心思想是在多台机器上启动多个ES进程实例,组成一个ES集群。 概念描述 接近实时:ES是一个接近实时的搜索平台,这就意味着,从存入一个文档直到文档能够被搜索到有一个轻微的延迟 集群(cluster):一个集群由多个节点(服务器)组成,所有节点一起保存全部数据,每一个集群有一个唯一的名称标识...
算法相关More
零钱兑换问题
10月18日 · 2020年

零钱兑换问题

378 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月6日 · 2020年

股票买卖问题

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

路径总和问题

330 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);}...
搜索二维矩阵问题
10月18日 · 2020年

搜索二维矩阵问题

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

打家劫舍问题

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

朋友圈问题

401 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著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。...