自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

念念不忘,必有回响

微信:weihubeats。个人公众号:小奏技术,专注于技术分享

  • 博客(344)
  • 收藏
  • 关注

原创 LeetCode每日打卡之罗马数字转整数

初步看到觉得很简单,将罗马数字与对应的值用一个map装入,然后从右向坐遍历,如果右边的值大于右边向前推一位的值,则需要将右边的大值 - 小值,然后跳过小值循环下一位比如CIV就需要计算 V的值然 - I的值,然后再直接计算C的值。实现代码如下public int romanToInt(String s) { Map<Character, Integer> map = new HashMap(); map.put('I', 1); map...

2021-05-15 20:25:10 6

原创 这样看模板设计模式就很容易理解了

模板模式是属于行为设计模式中的一种,主要是为了解决代码的复用和扩展定义模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤看定义其实是很难理解的,下面我们结合实际例子和代码来理解下实现核心代码这里我先给出模板模式的大致实现代码然后再结合实际应用场景来说明。首先我们需要定义一个抽象类,抽象类中定义了一些固定好的算法骨架,然后核心方法由子类实现public abstract class Abstr.

2021-05-14 21:13:44 9

原创 1734. 解码异或后的排列

异或的相关属性和基础参考之前的博客这一题是 1720 的简单升级版本不同之处很明显,就是没有给出一个 ans[n ]的值让我们通过推导出来的公式encoded[i] XOR perm[i + 1] = perm[i]进行计算所以我们的目的很明确,需要计算出一个perm[i],然后后面的计算就和之前那道简单题一样了如果计算出一个perm[i]呢,这里我们可以通过题意计算出ans[n - 1]计算推导过程如下首先我们将所有的奇数位encoded[i] 进行异或,encoded[1] = p.

2021-05-11 21:35:05 14

原创 租房需要考虑的问题

最近在找房子,然后太过于随意签下一家公寓,总的来说不是太满意,这里记录一下租房需要考虑的点吧,以后租房可以拿来看看是否满足自己需求价格,价格作为第一位没什么好说的,看自己接受什么样的价位是否隔断房,主要是为了看隔音效果,隔音效果如果不好住着也难受是否有合适的晾衣服的地方除房租外的其他额为费用怎么算,比如电费多少一度,水费怎么说,管理费物业费怎么算房子采光怎么样,广州的一些城中村采光不太好,需要格外注意整体空间自己是否够用,家具是否够用,如果不够用自己购买是否有足够的位置安置洗衣机,马桶,.

2021-05-09 22:17:51 12

原创 1720. 解码异或后的数组

困难题我唯唯诺诺,简单题我重拳出击题目看着有点复杂,简单解释就是通过给出的公式encoded[i] = arr[i] XOR arr[i + 1],arr数组,其中encoded[] 为已知,arr[0] 为已知,算出arr[]。其实所以我们要推导出arr[i] = ?? 这么一个公式。在推导前我们先复习一下异或的相关特点:相同数值异或,结果为 0x ^ x = 0任意数值与 0 进行异或,结果为数值本身x ^ 0 = x异或本身满足交换律a ^ b = b ^ a.

2021-05-06 21:03:55 10

原创 Java8 并行流(parallelStream)原理分析及线程池线数设置

我们都知道在java 使用strem流做多线程处理是非常方便的。list.parallelStream().forEach(s -> { // 业务处理 });但是parallelStream是如何实现多线程处理的呢?其实看源码我们会发现parallelStream是使用线程池ForkJoin来调度的,这里我们可以看源码看到由于我们使用的 forEach,所以直接看类ForEachOps即可.当然其他方法比如reduce等会有不同的实现类,总的实现类是如

2021-05-02 23:17:37 96

原创 我从Windwos转mac的原因及新手必转软件总结

刚开始换mac开发因为和windows有很多不同,所以也是相当不习惯,装一些开发必备软件是第一步。这个我把我装的一些软件总结给大家借鉴文章目录软件下载地址必备软件推荐撸码必备数据连接必备本地服务跳转连接远程服务器笔记文档相关接口调用聊天相关连接远程redis文本文件比较不同浏览器输入法JVM监控相关科学查找资料休闲娱乐软件下载地址提供两个下载破解软件的地址:马克菠萝Xclient必备软件推荐撸码必备Idea数据连接必备DataGripNavicat装两个是因为Dat.

2021-05-01 22:15:06 28

原创 Java设计模式之适配器模式

定义适配器模式(Adapter Design Pattern):定义解释也很简单,就是将不兼容的接口转换为兼容的接口,让原本不能一起工作的类一起工作,简单比喻就是转接头,我们在使用一些显示器的接口的时候由于接口的不兼容就需要使用转接头。适配器模式实现方式主要分两种:类适配器和对象适配器,下面我们来简单了解下这两种实现方式。类适配器类适配器主要基于继承来实现ITarget 表示我们要转换的接口public interface ITarget { void f1(); void

2021-04-27 22:33:29 25

转载 岛屿类问题的通用解法、DFS 遍历框架

在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如:L200. 岛屿数量 (Easy)463. 岛屿的周长 (Easy)695. 岛屿的最大面积 (Medium)827. 最大人工岛 (Hard)我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。网格结构遍历起来要比二叉树复杂一些,如果没有掌握一定的方法,DFS 代码容易写得冗长繁杂。本文将以岛屿问题为例

2021-04-26 21:01:51 12

原创 SpringBoot spi

java 有自己的spi,dubbo也有自己的spi,Spring也有自己的spi,而springboot就用到了spirng的spi来实现自动装配。我们用过springboot的都知道,在SpringBoot中我们需要添加任何一个配置类都只需要添加一个配置类,比如@Configurationpublic class SpiTestConfig { public SpiTestConfig() { System.out.println("test config init!")

2021-04-24 15:03:45 19

原创 33. 索旋转排序数组

这里暴力很简单,直接一遍for循环public int search(int[] nums, int target) { if (nums == null || nums.length == 0) { return -1; } for (int i = 0; i < nums.length; i++) { if (nums[i] == target) { return .

2021-04-21 23:06:41 13 1

原创 如何去除博客阅读要关注公众号的限制

有时候浏览一些网站博客,经常会受到这种强制关注公众号的要求才让看,让人觉得挺烦人的。解决方式很简单直接屏蔽这种博客网站,永久不再访问破解验证码这种方式只适用于使用openwrite.cn 提供的工具的拦截对于第一种方式来说很简单,下面主要来介绍第二种不用关注破解验证码的方式,对于这种网站 一般都是使用openwrite.cn这个网站提供的工具来做的,我们直接按F12查看他的源代码然后按 CTRL+ F进行搜索关键字blogId找到blogId,然后进行url拼接https://re.

2021-04-09 17:34:54 30

原创 关于ClickHouse Merge一些说明

首先 Merge不是实时的,是后台定时任务去自动merge,只有在合并过程中才会出现重复数据删除,无法设置或掌控,一般merge时间是10-15分钟,但是如果某个分区一直不写入新的数据可能存在该分区一直不merge,这没发保证的。如果需要该分区merge,只能强制merge。强制merge建议带分区optimize TABLE sales_db.order_detail PARTITION (2020,202001) FINAL;强制merge属于CPU性操作,会相当耗费CPU资源,建议在晚上系统

2021-04-07 11:39:31 175

原创 大数据量查询大杀器之Mybatis 流式查询

流式查询在我们查询大数据量数据,而内存不够的时候,我们常常使用的做法就是分页,分页的效率往往是低下的,当然如果表有自增id主键,基于自增id主键去查询效率也还行,但这不是我们今天介绍的重点,我们今天介绍的重点是Mybatis流式查询,也就是我们在查询数据的时候查询成功后返回的结果集不是一个集合而是一个迭代器,每次从迭代器中处理查询一条结果,这样就能避免大数据导致的OOM。实战MyBatis 流式查询的核心接口是 Cursor可以看到 Cursor 继承了 Iterable接口。由Iterable知

2021-04-07 09:04:56 58

原创 53. 最大子序和

题目的难度是简单,但是自己看了半天硬是没有头绪,总觉得需要使用递归,但是又知道如何下手,以为自己菜呢,原来评论区也有一堆小伙伴是这样顿时我悟了,我应该不菜吧。。。。。。。。。解法一:动态规划思路,如果全是负数,找最大值即可,如果有正数,从正数开始累加,如果累加到值为负数,则说明后面的值对前面累加的结果没有意义,需要舍弃这个累加的数,重新累加,每次累加的结果取最大的值public int maxSubArray(int[] nums) { int res = nums[0];..

2021-04-05 21:30:16 16

原创 java spi 与 dubbo spi

传统java spi在java 中我们要动态通过配置文件制定实现类该如何实现呢?使用java spi机制即可,我们来看下面这个例子public interface Robot { void sayHello();}然后定义两个实现类。分别为 OptimusPrime 和 Bumblebeepublic class OptimusPrime implements Robot { @Override public void sayHello() {

2021-04-05 13:38:05 25 1

原创 LeetCode 344. 反转字符串

解法一:最先想到的是用栈解决,先进后出。代码public void reverseString(char[] s) { Stack<Character> stack = new Stack<>(); for (int i = 0; i < s.length; i++) { stack.push(s[i]); } while (!stack.isEmpty()) { .

2021-04-04 21:55:56 12

原创 LeetCode 7.整数反转

解法一: 每次取目标数最后一位,原数每次 * 10 + 目标数最后一位,使用long 装返回结果来判断溢出,如果最后返回结果墙砖int 不等于 long返回结果,则说明溢出,直接返回0class Solution { public int reverse(int x) { long result = 0; while(x != 0){ result = result * 10 + x % 10; x = x / 10; .

2021-04-02 08:51:22 8

原创 synchronized 我理解的到底有多深

synchronize 作用synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。人话解释就是解决多线程并发访问冲突问题。保证原子性,可见性,有序性(单线程执行依然会有指令重排序,但是由于是单线程执行,所以还是能保证有序性)synchronized锁的谁首先需要说明的是Java 中任何一个对象都可以作为synchronized 锁。具体锁分如下几种情况普通同步方法锁是当前实例对象静态同步方法,锁是当前类的class对

2021-03-27 21:35:06 21

原创 idea 如何获取类的字节码文件

代码我们现在要获取下面代码的字节码文件,idea 如何获取呢public class SynchronizedTest { public static void main(String[] args) { SynchronizedTest synchronizedTest = new SynchronizedTest(); ExecutorService threadPool = Executors.newFixedThreadPool(3);//

2021-03-27 17:52:00 29

原创 分享一组最近的面试遇到的面试题

在公司不管待多久,想不想离职,偶尔出去面试看看自己的实力我觉得还是很有必要的,所以最近随便面了一家公司,分享下我的面试题。只能写出部分,不能记住全部一面简单简绍自己,包括做过的项目针对项目优化项目细节作了一些提问输入www.baidu.com发生了什么(我从 tcp ip 协议 到操作系统层面回答的)网站的优化(我从前端,到nginx,后台,分库分表,读写分离等多方面作了回答)一道排序算法题(当场手写)二面简单简绍自己,包括做过的项目针对项目优化项目细节作了一些提问分布式事务.

2021-03-26 08:56:56 31

原创 多线程之CompletionService

假设我们有这样一个需求,现在有A系统,部署了三个节点。我们需要获取A系统的一个接口数据,需要最快返回返回结果,而不是至少单纯调用某个节点,在某个节点调用不通再去掉用另外一个节点。这种需求如何实现呢?这就是类似Dubbo 中的 Forking Cluster。其实实现起来也比较简单,我们只需要使用一个线程池同时去调用三个节点,哪个节点获取到了任务就直接返回,并停止其他任务即可。而CompletionService 就是可以这样处理,下面我们对CompletionService 作一个简单的了解吧Compl

2021-03-21 12:59:17 37

原创 ReentrantReadWriteLock详解

ReentrantReadWriteLock 是读写锁,和ReentrantLock会有所不同,对于读多写少的场景使用ReentrantReadWriteLock 性能会比ReentrantLock高出不少。在多线程读时互不影响,不像ReentrantLock即使是多线程读也需要每个线程获取锁。不过任何一个线程在写的时候就和ReentrantLock类似,其他线程无论读还是写都必须获取锁。需要注意的是同一个线程可以拥有 writeLock 与 readLock (但必须先获取 writeLock 再获取 .

2021-03-20 16:50:43 32

转载 Java中9种常见的CMS GC问题分析与解决

1. 写在前面| 本文主要针对 Hotspot VM 中“CMS + ParNew”组合的一些使用场景进行总结。重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省略较多,另外本文专业术语较多,有一定的阅读门槛,如未介绍清楚,还请自行查阅相关材料。| 总字数 2 万左右(不包含代码片段),整体阅读时间约 30min ,文章较长,可以选择你感兴趣的场景进行研究。1.1 引言自 Sun 发布 Java 语言以来,开始使用 GC 技术来进行内存自动管理,避免了手动管理带来的悬挂指针(Dangling

2021-03-20 09:31:06 76

原创 Springboot 中@ConditionalOnProperty的妙用,指定接口实现

在原生java中就有spi来为我们接口作扩展通过配置文件去指定实现类来灵活编码,而不乏很多开源框架对java的spi 作了增强,比如dubbo。具体duboo的spi增强了什么大家可以去dubbo官网参考这里不作展开说明来说说我们今天的目标:需求: 因为我们项目可能需要切换数据库,但是为了平滑切换,准备了这两个数据源Mapper,希望有什么问题可以通过配置文件马上回滚到原先的数据源。比如原先的mapper是查询的mysql,新的数据源是查询的postgresql。我们想先切换为postgresql去做改

2021-03-19 17:52:16 276

原创 Mybatis ClickHouse clickhouse-jdbc 批量数据插入性能优化

背景在生产使用ClickHouse后,应用是基于Springboot + Mybatis + clickhouse-jdbc + druid去操作ClickHouse。但是写入的瓶颈非常明显,每次数据量超过1W后写入就非常耗时。要几十秒甚至几百秒。按理说ClickHouse的写入性能非常强悍,支持大批量写入,少量数据写入反而很慢,而实际我们在使用Mybatis 写入的性能反而与官方说明有些相反。针对这个写入性能问题我们团队做了几天的排查排查首先排查ClickHouse自身问题我们查询了SQL

2021-03-09 19:36:38 1003 6

原创 Size (154.47 GB) is greater than max_[table/partition]_size_to_drop (50.00 GB) 2. File ‘/data/servic

错误Reason: 1. Size (154.47 GB) is greater than max_[table/partition]_size_to_drop (50.00 GB) 2. File '/data/service/clickhouse/flags/force_drop_table' intended to force DROP doesn't exist How to fix th ...产生原因这是在执行 drop table操作一张超过50gb的MergeTree报错的,删除不

2021-03-08 17:45:18 91 1

原创 多线程同步器之CountDownLatch

文章目录CountDownLatch是什么核心方法构造方法常用的其他三个方法使用案例CountDownLatch是什么countDownLatch是在java1.5被引入,可以翻译为计数器。主要用于等待多个线程一起执行完成后继续下一步,Thread.join()有点类似核心方法构造方法CountDownLatch 值提供了一个构造方法,传入一个计数器的值常用的其他三个方法//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行public void await()

2021-03-06 20:44:06 55

原创 SpringCloud Fegin 三方接口统一出参(统一验签)

在调用三方接口的时候我们为了接口安全一般会验签,比如调用所有三方接口都需要添加额外参数比如?signature=[signature]&key=[key]&timestamp=[timestamp]这样会使用我们的接口调用参数显得冗余,且维护困难,在使用 Fegin 做第三方接口调用时,我们可以基于Fegin 开放的RequestInterceptor扩展接口来实现统一出参public class FeignInterceptor implements RequestInterce

2021-03-02 18:05:40 118

原创 ClickHouse删除数据

ClickHouse提供了DELETE,但是不能和传统的Mysql这类数据库的相比。因为这种操作被称为Mutation查询Mutation语句是一种“很重”的操作,更适用于批量数据的修改和删除不支持事务,一旦语句被提交执行,就会立刻对现有数据产生影响,无法回滚Mutation语句的执行是一个异步的后台过程,语句被提交之后就会立即返回,即删除语句执行完不代表数据删除,会有一个后台进程去删除数据操作,具体数据什么时候删除呢,可以在系统表 system.mutations查看其中 is_done

2021-03-01 18:00:30 1575 1

原创 Linux内核学习-写时复制(Copy On Write)

在学习redis RDB,Redis采用fork子进程重写AOF文件时使用到了写时复制(Copy On Write),避免了主线程的阻塞(还是有阻塞的潜在风险),不是很懂写时复制(Copy On Write),所以就来研究下Copy On Write在Linux中当调用fork()系统调用创建一个子进程时,Linux并不会为子进程创建新的物理内存空间,而是共用父进程的物理内存。这是因为Linux的内核开发者觉得,调用者调用fork()系统调用后会立刻调用exec()系统调用执行新的程序,这样旧的物理.

2021-02-18 11:52:47 218

原创 SpringBoot+Apollo配置动态线程池

文章目录前言实现核心依赖配置文件实现代码前言尽管我们经过谨慎的评估,仍然不能够保证一次计算出来来的线程池参数是合适的,那么我们是否可以将修改线程池参数的成本降下来,这样至少可以发生故障的时候可以快速调整从而缩短故障恢复的时间呢?基于这个思考,我们是否可以将线程池的参数从代码中迁移到分布式配置中心上,实现线程池参数可动态配置和即时生效,线程池参数动态化前后的参数修改流程对比如下实现分布式配置中心这里使用的是Apollo核心依赖 <dependency> &l

2021-02-08 08:48:50 210

原创 Mybatis代理Mapper统一获取Mapeer执行结果及执行SQL

文章目录需求记录表结构实现SqlUtils使用需求由于数据源的切换,需要对某个Mapper进行数据监测,需要记录Mapper中所有执行方法的结果,执行SQL,参数等基本信息记录表结构create table sql_test( method text, shard integer, ck_time text, ck_total integer, pg_total integer, create_time ti

2021-02-06 13:41:19 36

转载 线程池在美团的最佳实践

文章目录一、写在前面1.1 线程池是什么二、线程池核心设计与实现2.1 总体设计2.2 生命周期管理2.3 任务执行机制2.3.1 任务调度2.3.2 任务缓冲2.3.3 任务申请2.3.4 任务拒绝2.4 Worker 线程管理2.4.1 Worker 线程2.4.2 Worker 线程增加2.4.3 Worker 线程回收三、线程池在业务中的实践3.1 业务背景3.2 实际问题及方案思考3.3 动态化线程池3.3.1 整体设计3.3.2 功能架构3.4 实践总结四、参考资料一、写在前面1.1 线程池

2021-02-04 21:20:01 124 2

原创 Mybatis插件开发(拦截SQL并改写SQL)

文章目录拦截器接口介绍SQL拦截改写定义拦截器接口 Interceptor添加拦截器拦截器接口介绍Mybatis 允许在以映射SQL语句执行过程中的某一点进行拦截调用。默认情况下,Mybatis允许使用插件来拦截的接口和方法有以下几个Executor(update、query、flushStatements、commit、rollback、getTransaction、clos、isClosed)ParameterHandler(getParameterObject、setParameters)

2021-01-25 09:02:10 503

翻译 处理 CLICKHOUSE 的实时更新

文章目录Use CaseReplacingMergeTreeAggregate FunctionsAggregatingMergeTreeMaterializing The Update总结在 OLAP 数据库中,可变数据通常不受欢迎。ClickHouse 也不例外。与其他 OLAP 产品一样,ClickHouse 最初甚至不支持更新。后来,添加了更新,但是和其他很多东西一样,它们是以“ ClickHouse”的方式添加的即使是现在,ClickHouse 的更新也是异步的,这使得它们很难在交互式应用程序

2021-01-19 11:11:05 3065

原创 Springboot 整合MybatisPlus 多数据源(分包实现)

文章目录实现方式核心依赖核心配置文件MybatisPlus配置类MybatisPlusConfigMybatisPlusConfig1启动类配置分包实现方式上次基于AOP动态切换数据源实现,这次实现使用分包实现核心依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</arti

2021-01-13 20:01:55 194

原创 从0开始一步一步搭建CkickHouse集群(单分片双副本)

文章目录CkickHouse 版本安装包下载安装zk集群搭添加zk配置常见问题CkickHouse 版本20.3.10.75-2安装包下载wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-client-20.3.10.75-2.noarch.rpm wget https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/clickhouse-server-20.3.10

2021-01-06 08:37:04 179

原创 单机搭建三节点ZooKeeper集群(伪集群)

文章目录背景安装zookeeper 版本安装步骤背景由于测试服务器有限,只有一个台服务器,但是ZooKeeper集群最少要三个节点,所以打算在单机搭建三个节点的ZooKeeper集群安装zookeeper 版本3.4.14安装步骤下载 zookeeperwget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz解压安装 zookeepertar -zxvf zook

2021-01-05 18:02:57 180

原创 HashMap源码分析

文章目录简介继承关系存储结构源码分析属性Node节点TreeNodeHashMap 构造方法put 添加方法待更新简介在我们对数据存储的时候都会有数据结构这种东西,但是传统的底层数据结构比如数组或链表,不够好用,所有一些大神就为我们对这些基础数据结构作了进一步的封装,有了更高级的数据结构,而HahsMap就是由此而来,HashMap采用key/value存储结构,每个key对应唯一的value。查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序继承关系

2020-12-26 22:22:15 346

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除