Java 开发

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

算法

打家劫舍问题

Java 开发 / 中间件

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

Java 开发

Prometheus 监控的开关配置

Java 开发

图解 AQS

算法

朋友圈问题

Java 开发

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

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

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

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

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

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

图解 IO

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

图解 AQS

773 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

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

本站事故复盘

1667 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年的站就这样被自己搞没了......
Spring 知识图解(持续更新中..)
10月12日 · 2020年

Spring 知识图解

934 0
Spring 图解(持续更新中..)...
MySQL 中 redo log、undo log、binlog 的总结
12月5日 · 2019年

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

16117 8
本文主要总结下重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)的概念。redo log 是物理日志,undo log 和 binlog 是逻辑日志,物理日志的恢复速度远快于逻辑日志。innodb 事务日志包括 redo log 和 undo log,redo log 是重做日志,提供前滚操作,undo log 是回滚日志,提供回滚操作。...
Sharding-JDBC 支持动态扩容及刷新 ActualDataNodes
9月7日 · 2020年

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

4994 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...
1月9日 · 2020年

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

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

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

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

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

1949 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 及以上版本中的.....
Java 开发More
图解 AQS
11月22日 · 2020年

图解 AQS

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

线上 JVM 堆内存不足引发BeanCreationNotAllowedException

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

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

1949 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 及以上版本中的.....
9月2日 · 2020年

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

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

Spring 知识图解

934 0
Spring 图解(持续更新中..)...
12月1日 · 2019年

线上定时任务全部罢工

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

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

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

MySQL 常用锁和 MVCC 总结

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

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

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

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

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

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

1949 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 及以上版本中的.....
11月29日 · 2019年

数据迁移后的一致性校验

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

ZooKeeper 简单概括

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

Elasticsearch 常规概念及底层原理

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

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

1376 0
使用场景:系统解耦、异步、多服务订阅消息、消息可靠性、消息时序性 发送端:.....
基于 Redisson 实现切面分布式锁(升级版)
11月23日 · 2020年

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

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

基于 Redis 实现分布式锁

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

RabbitMQ 发消息报错 Listener not registered

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

朋友圈问题

644 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著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。...
零钱兑换问题
10月18日 · 2020年

零钱兑换问题

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

路径总和问题

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

打家劫舍问题

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

数据结构:跳表

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

股票买卖问题

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