自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(229)
  • 收藏
  • 关注

原创 postgresql执行模糊批量删除表

【代码】postgresql执行模糊批量删除表。

2023-02-27 10:00:32 1183 1

原创 postgis函数汇总

它们还提供有关残疾的性质和地点的信息。—返回一个线串,该线串是输入的子串,从总2d长度的给定分数开始和结束。—返回0到1之间的浮点数,表示LineString上与给定Point点最近的点的位置,以总2d线长的一部分表示。第二个参数是一个介于0和1之间的float8,代表必须定位该点的线串总长度的一部分。第二个参数是一个介于0和1之间的float8,代表必须定位该点的线串总长度的一部分。— 构造一个多多边形,给定一个封闭的字符串的任意集合,作为一个多字符串文本表示法众所周知的文本表示法。

2022-12-22 14:17:55 2284

原创 Mockito单元测试详解

(注意: @RunWith(MockitoJUnitRunner.class) 不能和 @RunWith(SpringRunner.class) 同时使用,而一般都需要 @RunWith(SpringRunner.class) 提供spring容器环境,所以很少用这个注解)SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以了。测试的时候需用调用B服务,但是B服务没写 好,这是可以先Mock一个B服务。

2022-10-25 16:44:24 3805

原创 修改mybatisplus源码HsqldbDialectExt 支持postgresql的offset分页模式

【代码】修改MyBatisPlus源码支持postgresql的offset分页模式。

2022-10-13 11:29:57 494

原创 深入理解Redis原理:5种数据结构及底层实现原理

(1)底层实现,如果value是数字redis内部会转化为Long存储来减少内存。

2022-03-29 16:08:55 1539

原创 MybatisPlus中集成雪花算法生成ID源码分析可靠性调研

雪花算法原理:一个 64 bit 的 long 型的数字作为全局唯一 id。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。 41bit-时间戳,用来记录时间戳,毫秒级。 10bit-工作机器id,用来记录工作机器id。(注意这俩字段,MyBatisPlus源码会用到) 1

2022-02-11 14:00:52 2644

原创 AOP声明式事物@Transactional失效的几种场景(7种)

一、什么是声明式事物什么是编程式事物?大白话讲,编程事物就是在代码手动实现事物的回滚,例如try-catch-finally捕获了异常,在finall手动调用方法实现rollback下;声明事物常用的就是AOP实现的切面原理,切入一个@Transactional注解,交给spring自己管理实现,可以被标记在类上、接口、方法上。二、@Transactional在某些场景下会失效,下边详谈(列举7种)(1)@Transactional配置的方法非public权限修饰(例如private的就别加了

2022-01-27 16:58:59 3305

原创 druid+mybatisplus多数据源集成postgresql和clickhouse简单实践

注:本来想写一个starter,但是比较难抽象一、配置文件spring: datasource: type: com.alibaba.druid.pool.DruidDataSource click: driverClassName: ru.yandex.clickhouse.ClickHouseDriver url: $click-urlxxxxx username: xx password: xx initialS

2022-01-21 14:26:16 3027

原创 一篇文章彻底搞懂MongoDB

一、Mongo简介(1)特点:面向文档存储,基于JSON/BSON 可表示灵活的数据结构 动态 DDL能力,没有强Schema约束,支持快速迭代 基于内存,支持快速数据查询,高性能计算 基于数据分片,可以支持海量数据存储 丰富的功能集,支持二级索引、强大的聚合管道功能(2)Mongo与MySQL概念区别:SQL概念 MongoDB概念 database database table collection row document column

2021-10-08 00:55:03 1015

原创 物联网MQTT协议详解

一、什么是MQTT协议Message Queuing Telemetry Transport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与 HTTP 一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。二、MQTT协议的特点轻量、简单、开放,是低开销、低带宽占用的即时通讯协议。使用场景有:机器与机器(M2M)、物联网(IoT)。MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN,

2021-10-06 21:49:14 44772 1

原创 Canal实时同步死锁导致CPU飙升

(1)top查看CPU占用情况,可以看到PID为17314的进程CPU占比为502。把CPU都吃完了,前端页面一直很卡(2)定位具体线程:top -H -p PID 看下该进程下线程的情况,可见5201这几个吃了CPU也可以:ps -mp 17314 -o THREAD,tid定位具体线程。下边拿5200或者5201线程来分析(3)拿5201线程ps一下,定位到是canal的问题(4)printf "%x\n" 线程ID: 将需要的线程ID转换为16进制格式js.

2021-07-02 23:18:40 2067 1

原创 基于canal+kafka+flink实现实时增量同步4:kafka消息入库到MySQL功能演示

一、新建三个表(1)主表user_id。它包含有主键user_idCREATE TABLE `user_id` ( `user_id` int(11) NOT NULL, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `age` int(11) DEFAULT NULL, `user_info_id` int(11) DEFAULT NULL, PRIMARY KEY

2021-05-26 17:24:17 893

原创 基于canal+kafka+flink实现实时增量同步3:MySQL到Kafka功能演示

一、Cannal介绍二、Cannal作用canal是alibaba开源的基于mysql binlog解析工具,可利用它实现mysql增量订阅/消费。利用canal,可以将mysql的数据变化,通过解析binlog,投递到kafka(或rocket mq),mq的消费方,可以把这些数据变化,应用到不同的业务场景,比如:1. 同步到redis(即:数据库的变化自动同步到缓存)2. 同步到es搜索引擎(即:数据库的变化自动刷新ES索引)3. 同步到其它异构数据库(即:mysql的变化,自动

2021-05-10 21:43:44 1306

原创 SpringCloud参数优化以及高可用优化

一、SpringCloud参数优化场景:压测一个原先⼀个服务 A 的实例⾥,专⻔调⽤服务 B 的那个线程池⾥的线 程,总共可能就⼏⼗个。每个线程调⽤服务 B 都会卡住 5 秒钟。如果每秒钟过来⼏百个请求这个服务实例呢?⼀下⼦B服务那个线程池⾥的线程就全部 卡死没法再响应任何请求了。优化步骤:(1)优化核⼼服务 B 的性能。不要⽤上百⾏的⼤ SQL,多表关联,那样单表⼏百万⾏数据量的话,会导致⼀下执⾏好⼏ 公众号:石杉的架构笔记秒。 其实最佳的⽅式,就是对数据库就执⾏简单的单表查询和更新,然后

2021-04-09 10:06:54 719 4

原创 基于canal+kafka+flink的实时增量同步功能2:消费者kafkaTomysql代码实现

常见问题:Eureka 注册中⼼使⽤什么样的⽅式来储存各个服务注册时发送过来的机器地址和端⼝号? 各个服务找 Eureka Server 拉取注册表的时候,是什么样的频率? 各个服务是如何拉取注册表的? ⼀个⼏百服务,部署上千台机器的⼤型分布式系统,会对 Eureka Server 造成多⼤的访问压 ⼒? Eureka Server 从技术层⾯是如何抗住⽇千万级访问量的?一、Eureka Server 注册表存储结构示例:(1)假设⼿头有⼀套⼤型的分布式系统,⼀共 100 个服务,每个

2021-04-08 20:44:21 795 4

原创 基于canal+kafka+flink的实时增量同步功能1:mysqlTokafka代码实现

背景:假如一个系统注册⽤户就 20 万,每天活跃⽤户就 1 万,每天单表数据量就 1000,然后⾼峰期每秒钟并发请求最多就 10。公司业务发展迅猛,过了⼏个⽉,注册⽤户数达到了 2000 万!每天活跃⽤户数 100 万!每天单 表新增数据量达到 50 万条!⾼峰期每秒请求量达到 1 万,因为每天单表新增 50 万条数据,⼀个⽉就多 1500 万条数据,⼀年下来单表会达到上亿条数据。经过⼀段时间的运⾏,单表已经两三千万条数据了,勉强还能⽀撑着。但是单表数据量越来越⼤,拖垮了⼀些复杂 查询 SQL 的性

2021-03-31 11:39:59 816

原创 深入理解ThreadLocal看这一篇就够了

一、ThreadLocal是什么从名字我们就可以看到ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。(以下均基于jdk1.8)作用(线程安全):(1)在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。(2)线程间数据隔离(3)进行事务操作,用于存储线程事务信息。(4)数据库连接,

2021-03-22 11:39:27 973 2

原创 一次ThreadLocal造成的内存泄露排查

问题描述:请求一个接口,有时候返回的是上一次的结果,有时候又返回正确,有时候能请求到接口有时候没请求到也返回数据,返回结果不是想要的,造成数据 不一致。很神奇!!!public class ReqContextHolder { private static final ThreadLocal<ReqContext> contextMap = new ThreadLocal<>(); private static final Map<String

2021-03-19 19:01:38 1443

原创 实战责任链设计模式——反向同步关系型数据库(MySQL举例)(3)

接着责任链实现反向同步多数据源数据(2)提出的几个具体实现逻辑详细讲解:一、数据源获取1.1、厂模式获取具体需要处理的数据源+创建链接scanHandler = ScanFactory.getScanHandler(reversesyncReq.getComponentId())ScanFactory:public final class ScanFactory { private ScanFactory() { } public static fina

2021-01-27 23:51:43 512

原创 实战责任链设计模式——反向同步总体流程(2)

详细讲解下:责任链在反向同步功能里的使用具体实现我从Controller详细讲一遍处理逻辑(1)提交反向同步权限任务Controller接口 @RequestMapping(value = "/dbReverseSync", method = RequestMethod.POST) @ControllerWebPage public ResponseUtil dbReverseSync(@RequestBody Map params) { Response

2021-01-27 23:22:48 638 3

原创 实战责任链设计模式——反向同步多数据源架构设计(1)

一、责任链设计模式搭建骨架图什么是责任链模式:责任链设计模式背景说明:责任链模式包含一份请求对象和一系列执行对象,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里的场景是:找到某个Handler处理掉请求。反向同步功能实现里边,需要同步多种类型的数据源到我们自己的库,例如关系型mysql、oracle,大数据hive,索引es等等。单从反向同步这个功能来说,我需要执行一个请求,能根据不同的类型处理不同的同步操作,只处理一个具体Handler的(记住这里,也可.

2021-01-27 23:13:15 614 2

翻译 设计模式学习(10)——行为型模式之“责任链设计模式“

一、介绍责任链模式是把多个对象串联起来形成一个链状结构,让每个对象都有机会对事件发送者的请求进行处理。设计意图是为了使事件发送者和事件接受者之间解耦。责任链模式包含一份请求对象和一系列执行对象,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。是一种处理请求的模式,请求在链上传递。责任链模式解决的问题:(1)请求者和接受者松散耦合在责任链模式中,请求者并不知道接受者是谁,也不知道具体如何处理。请求者只负责向责任链发出请求就可以了,该模式下可以有多个接受者处理对象,每

2021-01-27 21:53:14 216

转载 Google工具包Guava——聊聊代码校验Preconditions

一、Preconditions工具类介绍Preconditions是guava提供的用于进行代码校验的工具类,其中提供了许多重要的静态校验方法,用来简化我们工作或开发中对代码的校验或预处理。所有的14个静态方法,如下:(1)checkArgument(boolean expression):用来校验表达式是否为真,一般用作方法中校验参数(2)checkArgument(boolean expression, @Nullable Object errorMessage):校验表达式是否为真,

2021-01-20 21:30:50 939

原创 深入理解Redis原理:双写一致及分布式锁

(1)什么是分布式锁分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。(2)分布式锁应该具备哪些条件在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行具备可重入特性自动解锁,防止死锁具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败(3)分布式锁的实现方式基于数据库实现分布式锁。

2021-01-02 22:36:27 502 1

原创 ThreadPoolExecutor线程池问题排查:线程池设置不合理导致future.get()阻塞

一、业务背景有一个接口的部分功能使用了线程池,这个功能放在线程池里和主线程并行执行,等线程池里的任务执行完通过future.get的方式(如果需要得到线程池里的线程执行结果,使用future的方式)获取线程池里的线程执行结果,然后合并到主流程的结果里返回给前端。业务场景很简单,目的是不影响主流程的性能,不增加整体响应时间。但是遇到了设计的逻辑错误。设计场景:I/O密集型(大部分业务都是通过调用接口实现的) 核心线程数:4核(cpu核数) 最大线程数:cpu核数*2 等待队列:2048二、相关

2020-12-16 18:20:37 6413

原创 Java并发: 监视器Monitor、等待/通知机制原理解析

问题描述:如果在当前线程持有锁时调用Thread.sleep则可能导致性能和可伸缩性问题,因为持有锁的线程的执行被冻结。最好对monitor对象调用wait来暂时释放锁并允许其他线程运行Monitor介绍:Monitor是一种用来实现同步的工具 与每个java对象相关联,即每个java对象都有一个Monitor与之对应 Monitor是实现Sychronized(内置锁)的基础Monitor的基本结构:Owner字段:初始时为NULL表示当前没有任何线程拥有该monitor record.

2020-12-14 18:16:45 861

原创 代码规范扫描的一些案例

一、sonar代码规范扫描1.1、提示Use try-with-resources or close this "XXX" in a "finally" clause(1)案例1:问题描述:提示我们用java7的try-with-resources模式处理流,免去手动在finally里close等繁琐流程问题解决:例如可以这样try (InputStream inputStream = f.downloadFile(fileName); OutputStre

2020-12-02 16:46:51 1117 2

原创 SpringCloud框架源码EnvironmentDecryptApplicationInitializer冲突解决

问题描述:配置文件需要配置数据库加密密码,采用RSA加密算法,但是统一需要 加{cipher}{rsa}前缀,不加前缀前启动正常。加了前缀后并且已经在代码里边处理替换掉前缀但是仍然报错:java.lang.IllegalStateException: Cannot decrypt: key=spring.datasource.sydev.password at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplic

2020-11-16 11:27:49 901

翻译 分布式任务调度:海量任务处理elastic-Job解决方案(一)

开局一个github,装备全靠捡:https://github.com/apache/shardingsphere-elasticjob一、ElasticJob概述1.1、什么是ElasticJobElasticJob 是面向海量任务处理的的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。它的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署。具有弹性调度、资源管控、以及作业治理的功能。1.2、Elasti

2020-11-11 17:39:11 2400

转载 Elasticsearch中数据是如何存储的——转自ES中文社区

前言很多使用Elasticsearch的同学会关心数据存储在ES中的存储容量,会有这样的疑问:xxTB的数据入到ES会使用多少存储空间。这个问题其实很难直接回答的,只有数据写入ES后,才能观察到实际的存储空间。比如同样是1TB的数据,写入ES的存储空间可能差距会非常大,可能小到只有300~400GB,也可能多到6-7TB,为什么会造成这么大的差距呢?究其原因,我们来探究下Elasticsearch中的数据是如何存储。文章中我以Elasticsearch 2.3版本为示例,对应的lucene版本是5.5,

2020-10-23 16:38:14 3831

原创 redis命令全掌握系列——字符串2(get、getSet、strLen、appEnd、setRange、getRange)

一、GET命令1.1、用法时间复杂度: O(1);(返回与键key相关联的字符串值)返回值:如果键key不存在, 那么返回特殊值nil; 否则, 返回键key的值;如果键key的值并非字符串类型, 那么返回一个错误, 因为GET命令只能用于字符串值。1.2、代码示例(1)对不存在的键key或是字符串类型的键key执行GET命令redis> GET db(nil)redis> SET db redisOKredi...

2020-10-12 17:39:24 453

原创 数据库优化支持高可用

一、Redis字符串命令1.1、SET(1)使用说明时间复杂度O(1);如果key已经持有其他值,SET就覆写旧值, 无视类型;当SET命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除;对不存在的键进行设置:redis> SET key "value"OKredis> GET key"value"对已存在的键进行设置:redis> SET key "new-value"OKredis> G...

2020-10-12 15:36:14 513

原创 深入理解Canal

Canal是一款基于数据库增量日志订阅和消费的开源产品,它能够捕获数据库的变更数据,并把这些变更数据传递给其他系统。(官网目前只支持mysql,支持pg等得用插件)它的作用是实时监控数据库变更,并将变更数据传输给其他系统,用于数据同步、数据分析等场景。

2020-09-22 09:26:50 2577

原创 SpringCloud RestTemplate+HTTP实现微服务跨服务接口调用

前言:我们知道SpringCloud中服务调用可以用Fegin本地客户端和RestTemplate模板的方式,如果是Dubbo则是分布式的RPC则轻松搞定,这里介绍的是Cloud模板的方式。性能不是很好,为什么大家可以思考一下!背景:各服务都注册在Eureka上,彼此独立部署,现需要在一个服务调用另一个服务的接口,原因是视图改造,以往的开发人员服务间沟通居然采用视图的形式,视图这种东西基本被时代淘汰了。一、在Eueka上找到需要调用的服务,记下服务名二、编写RestTemplateServi

2020-09-11 11:13:17 2349

原创 MySQL:存储函数

一、概述1.1、什么是存储函数储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值。而存储过程没有直接返回值,主要用于执行操作二、存储函数注意:存储函数和存储过程的查看、修改、删除等操作几乎相同2.1、存储函数创建CREATE FUNCTION(1)语法格式CREATE FUNCTION sp_name ([func_parameter[...]])RETURNS type[c..

2020-09-08 19:18:26 1083

原创 MySQL:存储过程

一、概述1.1、什么是存储过程存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用 SQL 语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用“CALL存储过程名字”即可自动完成1.2、使用存储过程原因(1)存储过程只在创造时进行编译, 以后每次执行存错过程都不需要在重新编译, 而一般SQL语句每执行一次就编译一次, 所以使用存储过程可

2020-09-08 15:17:49 401 2

原创 一篇文章带你全面了解什么是Hive

一、Hive查看表的分区信息(1)查询某个表的分区信息:SHOW PARTITIONS employee;(2)查看某个表是否存在某个特定分区键SHOW PARTITIONSemployee PARTITION(country='US')DESCRIBE EXTENDEDemployee PARTITION(country='US')(3)查询表信息:DESCRIBE EXTENDEDemployee;(4)查询结构化的表信息:DESCRIBE FORMATTED...

2020-08-22 14:40:36 606

原创 Java系列6:Google工具包Guava的使用(看这一篇就够了)

一、Guava工具包(1)使用前引入maven依赖<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency>二、集合2.1、创建集合

2020-08-08 15:55:00 11572

原创 MySQL优化——会导致全表扫描的情况以及解决方案

(1)like模糊查询对于like ‘%...%’(全模糊)、左模糊like‘%...’。这样的条件,无法使用索引解决办法:尽量不用模糊查询,可以用右模糊,可以走索引,即like ‘…%’(2)询条件中is null、is not null应尽量避免在where 子句中对字段进行null 值判断,会走全表:select id from t where num is null解决办法:对于is null,可以建立组合索引,nvl(字段,0),对表和索引analyse后,is nul.

2020-07-29 10:19:05 5180 3

原创 MySQL优化——explain的使用

一、理论基础1.1、简介(1)explain作用explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。(2)explain用法在select语句前加上explain就可以了如:explainselectsurname,first_nameforma,bwherea.id=b.id1.2、EXPLAIN列的解释table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种...

2020-07-28 12:35:02 298

空空如也

空空如也

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

TA关注的人

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