自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 有效知识点博客链接整理(长期更新,只做书签整理用)

redis缓存一致性+延迟双删。

2023-02-01 10:03:53 377 1

原创 记第一次写groovy脚本cookie排坑,附登录验证码的解决方案(纯原创整理笔记)

其实就是走get请求拿到图片文件,一开始我用共用httpUtil走获取失败,发现了第一个坑,原因在于postman等都是自动转成文件,代码里直接走get请求行不通,所以我的解决办法是需要走IO获取文件并落地。然后主要的坑是在登录的场景,登录需要用户名+密码+验证码,登录后拿取cookie,之后爬接口一直用这个cookie就行了,用户名密码都有了,这么第一步就是获取验证码。文件落地后效果如图,接下来就可以拿file文件去走图片识别的SDK了。这一步其实就是落地,相对路径创建目录。

2022-09-09 11:31:28 725

原创 为什么不要在对外接口中使用枚举类型

还有一种看起来比较特殊,但是实际上比较常见的情况,就是有的时候一个接口的声明在A包中,而一些枚举常量定义在B包中,比较常见的就是阿里的交易相关的信息,订单分很多层次,每次引入一个包的同时都需要引入几十个包。而参数的构造过程是由B系统完成的,如果B系统使用到的是一个旧的二方库,使用到的枚举自然是已有的一些,新增的就不会被用到,所以这样也不会出现问题。比如前面的例子,B系统在调用A系统的时候,构造参数的时候使用到AType的时候就只有P_T和A_B两个选项,虽然A系统已经支持P_M了,但是B系统并没有使用到。

2022-09-06 16:32:23 623

原创 链表反转整理笔记

链表反转作为利扣简单里并且是数据结构和面试最常考的算法,每次写完之后都会忘记,这里做一次整理一般最常见的就是这两种解法,迭代和递归。

2022-09-01 10:23:15 231

原创 Spring中Bean装配方式整理,第三方jar包引入bean的方法

在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便。 因此本篇博文也不再介绍Spring中通过xml来声明bean的使用方式。1、使用@Component等派生注解只要在类上加类上加 @Component 注解即可,该注解只要被扫描到就会注入到spring的bean容器中。当然不只是@Component注解可以声明Bean,还有如:@Repository、@Service、@Controller 等常用注解同样可以。如果去看这些注解,就发现

2022-08-05 17:27:55 4119

原创 SpringBoot中localeResolver使用教程

从上面的AcceptHeaderLocaleResolver方法,返回的LocaleResolver的逻辑可知,我们最终会得到AcceptHeaderLocaleResolver,这样根据请求对象中的请求头中的Accept-Language属性,来返回Locale区域对象的LocaleResolver。就会继续执行最下面的部分。5、当属性值为fixed,应该搭配spring.web.locale、spring.mvc.locale这两个配置属性一起使用,给出固定的Locale区域对象。...

2022-07-28 11:04:06 3244 1

原创 Maven 生命周期,仓库概念和打包命令区别(package、install、deploy)

通过三个命令的输出我们可以看出三者的区别在于包函的maven生命的阶段和执行目标(goal)不同。maven生命周期(lifecycle)由各个阶段组成,每个阶段由maven的插件plugin来执行完成。生命周期(lifecycle)主要包括clean、resources、complie、install、pacakge、testResources、testCompile、deploy等,其中带test开头的都是用业编译测试代码或运行单元测试用例的。仔细查看上面的输出结果截图,可以发现,https。...

2022-07-27 11:17:56 796

原创 SpringMVC拦截器HandlerInterceptor各方法解析

SpringMVC中的Interceptor拦截器是链式的,可以同时存在多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。...

2022-07-27 09:39:54 472

原创 记线上双写失败日志mysql错误排查原因

排坑如下不配数据库连接池的话默认8小时后会断开连接,从而导致第二天我得应用再去连接mysql的时候就会疯狂报错。做了双MYSQL的项目第一天数据全是好的,但是第二天发现上线排查日志发现双写全部失败了。以后多数据源一定要配上数据库连接池。...

2022-07-21 15:22:14 228

原创 在mybatis拦截器实现双写并且支持处理事务的方法(使用TransactionalEventListener实现)

书接上文:不使用binlog,canal,kafka等,只用java+mybatis拦截器来实现项目中的异步双写主从数据库,代码逻辑全整理我目前在双写的项目发现中还差一个缺陷,就是如果有事务注解的情况下,发生了回滚,我的异步双写成功写入,但是主库插入失败,这里就用到了TransactionalEventListener作为参考来实现异步双写的事务回滚参考如下:TransactionalEventListener使用场景以及实现原理,最后要躲个大坑然后再我的拦截器中应用,代码如下.........

2022-07-14 11:28:13 2563

原创 记一次SSM框架AOP实现自定义注解失效问题排坑

之前我在springboot项目中使用自定义注解完全可用,但是在SSM的老项目中迁移代码发现注解并不生效,其实是配置文件里AOP开关没开启的问题,但是我们都是使用注册中心去存放配置,本地配置文件其实根本不会用上,因为排查了半天,发现注释掉后果然能正常运行,说明本地配置文件不会加载为了不修改配置文件实现AOP,这里作为参考如下Spring使用@AspectJ开发AOP(零配置文件)其实实现方法非常非常简单,就是加上@EnableAspectJAutoProxy即可,只是对老项目的不熟悉,以及加上修改配置也

2022-07-12 10:14:56 912

原创 不使用binlog,canal,kafka等,只用java+mybatis拦截器来实现项目中的异步双写主从数据库,代码逻辑全整理

项目中因为要迁库,所以我要在原项目中接入我的双写逻辑,确保新旧两个库都有数据写入,假如新库写入失败,旧库数据也能写入,这就确保了重要数据不能丢失。一开始考虑的方案是使用数据同步工具,像是canal或是DTS等,但是环境这块卡的比较死,没有其他花里胡哨的工具,只能纯靠java改写代码来实现了,期间排了不少坑,这里做个人踩坑记录实现效果,批量双写全部报200,自测下来还算成功......

2022-07-08 16:31:01 2724 1

原创 mybatis根据表名动态批量新增,批量更新的实现方法(附排坑过程+完整源码完全可用)

项目中迁移的需求用到了批量新增,批量更新来做迁移的需求,为了方便以后的迁移,这里写了一套完整的方法来实现insert和update首先因为是老项目的表,索引列都层次不齐,因此还是要手动列出相关索引的表,建立arr方便之后遍历这里传入tableArr,后面三个参数是根据业务需求制定的,我这里是要实现补录startTime和endTime期间旧表内的数据,queryType指的是索引类型,我这里的话queryType设置如下注意这里新增和更新的两个方法的一些细微不同:批量新增会remove掉map中的id

2022-06-30 09:23:19 2102

原创 mybatis动态数据源配置(附自定义注解实现数据源切换)

在做DB数据迁移需求的时候要用到多数据源,正好整理下配置文件DBConfig配置注意这里事务一样要配置,不然切换数据源后不会生效

2022-06-29 09:49:41 5859

原创 项目中遇到的线上数据迁移方案1---总体思路整理和技术梳理

项目有一个需求,旧库拆分到新库,将旧数据迁移到新库里,期间需要考虑补录和迁移数据,因为没有canal同步,我分配到的任务就是在代码里加入补录迁移数据的接口去保证迁移顺滑和数据一致性因为线上数据量很大且每时每刻都会有数据入表,需要考虑的几个点:.........

2022-06-28 17:22:15 572

原创 mybatis在实际项目中常见的排坑配置

目前在做mybatis数据迁移的时候遇到了不少坑,以前项目没有配置项,导致会产生不少bug,目前记录排坑了三种场景和其解决方案之前项目中没引入,解决办法有三个:1.手工转,字段多的话很麻烦2.外面写方法转这里用到了hutool的包项目中还遇到了插入字段的顺序问题,我这里返回是LinkedHashMap来确保key顺序一致3.mybatis配置驼峰假如我查的某一列有个字段为null,map会不返回,如下图解决办法很简单,写一个mybatis-config.xml,加入该配置在DBConfig里se

2022-06-28 16:21:13 438

原创 mysql中explain语句查询sql是否走索引,extra中的几种类型整理汇总

1.using index通过二级普通索引查找,实现了覆盖索引,不用进行回表查询2.using index condition通过二级普通索引查找,在通过索引查到的结果后还有where条件过滤,而且这个过滤筛选是只需要用二级普通索引就可以实现,不用在内存中进行判断筛选。但是需要回表查询需要的字段值。3.using where不管有没有通过索引查找,只要加载了数据到内存进行where条件筛选,都是4.using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需

2022-06-28 16:00:57 1356

原创 线上数据库迁移的几种方法

互联网系统,经常会有数据迁移的需求。系统从机房迁移到云平台,从一个云平台迁移到另一个云平台,系统重构后表结构发生了变化,分库分表,更换数据库选型等等,很多场景都需要迁移数据。在互联网行业,很多系统的访问量很高,即便在凌晨两三点也有一定的访问量。由于系统数据迁移,导致服务暂停几分钟,是很难被业务方接受的!本文我们就来聊一下,在用户无感知的前提下,如何设计不停机数据迁移方案!数据迁移过程我们要注意哪些关键点呢?第一,保证迁移后数据准确不丢失,即每条记录准确而且不丢失记录;第二,不影响用户体验(尤其是访问量高的C

2022-06-23 16:12:02 2916

原创 对java序列化和持久化最通俗易懂的理解

流可以是二进制流,也可以是“字符流”,甚至可以是其他东西的流。可以这么定义“流”:有顺序的连续多个“同类”。这里所谓的“同类”,如果是bit,那么就是二进制流;如果是字符,就是“字符流”;如果是人,就是“人流”。...

2022-06-22 16:24:49 333

转载 中台库存中的实仓与虚仓的业务逻辑设计

实仓和虚仓的概念是针对系统开发本身而言的。简单来说,核算成本的仓库可以称之为实仓,不核算成本的可称之为虚仓。虚仓在系统中主要过渡的作用。在中台系统中,虚仓即等于库存的分配池,在同个仓库组中单个商品的库存,实仓库存之和 = 虚仓库存之和。那么在商城中台库存管理中,实仓与虚仓的业务逻辑该怎么设计呢?需要考虑以下问题:场景:实仓 a,b,c 初始库存都是 0,需要为实仓 a,b,c 都采购 100,即需要 3 个采购入库通知单,实仓分别为 a,b,c。在上述场景中虚仓如何分配库存呢?此时,就需要用到 " 分配池

2022-06-17 10:23:14 834 1

原创 mysql索引详解(B+树,聚簇/非聚簇,PRIMARY/NORMAL/UNIQUE/FULLTEXT区别)

索引结构众所周知索引的功能就是加速查找,mysql索引结构分为哈希和b+树(1)HASH    用于对等比较,如"=“和” <=>",查询单条快,范围查询慢  (2)BTREE    b+树,层数越多,数据量指数级增长(mysql,innodb默认)用在像 "=,>,>=,<,<=、BETWEEN、Like"等操作符查询效率较高当然Mysql默认就是BTREE方式。关于b+树为什么会按照层数指数级增长b+树是基础,看其他博客学习:漫画:什么是B+树?

2022-03-28 14:53:44 2183

原创 mysql为什么尽量不要存null

在项目中优化mysql的时候字段尽量不要用NULL 值,使用-1或者其他特殊标识来替代,整理了下原因:为NULL的列会使用更多的存储空间,在Mysql中也需要特殊处理含NULL复合索引无效.对Mysql来说更难优化,因为可为NULL的列使得索引,索引统计和值比较都更复杂。当可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里甚至还可能导致固定大小的索引(例如只有一个整数列的索引)变成可变大小的索引。如果计划在列上建索引,列尽量设计成可not null...

2022-03-11 11:41:24 4736 1

原创 ClickHouse学习笔记(使用场景,原理解析,环境搭建,数据迁移和同步,SQL语法)

我们的客户中台项目用到了一个用户大宽表,实时对客户数据进行多维度分析。之前一直用的Mysql,随着数据量越来越大,现在想使用ClickHouse进行优化是最佳的选择ClickHouse和Mysql很像,也是数据库,常用于数据分析OLAP(On-Line Analytical Processing,联机分析处理)领域。传统数据库是OLTP(On-Line Transaction Processing,联机事务处理)使用场景1.读多于写通常将数据批量导入后,进行任意维度的灵活探索、BI工具洞察、报表制

2022-02-18 17:13:47 2095

原创 《Redis开发与运维》学习笔记3:主从复制,哨兵和集群

这篇主要整理第六章,第九章和第十章的内容,聚焦于Redis的分布式和集群部分,转载注明出处:https://blog.csdn.net/Koikoi12复制复制可以在分布式系统中实现相同数据的多个Redis副本,满足故障恢复和负载均衡等需求,是高可用的。主节点有多个从节点,但每个从节点只能有一个主节点关键命令:slaveof {masterHost} {masterPort}从节点发起,目标是主节点slaveof no one从节点断开与主节点的关系建立主从关系后,主节点会自动同步数

2022-02-17 16:40:18 528

原创 《Redis开发与运维》学习笔记2:阻塞,内存模型以及缓存设计

这篇主要整理第七章,第八章和第十一章的内容,主要是一些缓存的优化内容。主从复制,哨兵和集群下一章节再讲,书中像是持久化,五种基础类型api,运维报警,统计配置等章节不会讲,转载注明出处:https://blog.csdn.net/Koikoi12Redis阻塞Redis是单线程架构,所有读写都在一条主线程完成,因此如果出现了阻塞是一件严重的事情。1.发现阻塞当Redis阻塞时,线上应用服务应该最先感知到,这时应用方会收到大量Redis超时异常。常规做法是在应用方加入异常统计并通过邮件/微信/短信

2022-02-16 18:42:31 615

原创 《Redis开发与运维》学习笔记1:Redis内置的附加功能及应用场景

最近在看《Redis开发与运维》 决定将书上的内容整理出来,这篇主要整理第三章的内容,该节详细讲解了redis内置的各种功能,转载注明出处:https://blog.csdn.net/Koikoi12慢查询分析所谓的慢查询,就是记录命令前后执行时间(不包含网络传输时间,因此不解决超时问题)MySQL也有该功能配置参数设置慢查询日志最大长度:config set slowlog-max-len 1000 线上建议调大慢查询列表,可设置1000以上,长度超出时会将最早的日志移除设置预设阀值:con

2022-02-15 17:30:49 796

原创 详细整理全23种设计模式-行为型模式篇3(迭代器、访问者、备忘录、解释器)

这一篇主要讲行为型模式的最后四种行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。迭代器模式访问者模式备忘录模式解释器模式参考:行为型模式应用实验25000 字详解 23 种设计模式(多图 + 代码)...

2022-02-14 17:23:32 419

原创 详细整理全23种设计模式-行为型模式篇2(模板方法、状态、命令、中介者)

这一篇主要讲行为型模式的中间四种行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。模版方法模式在含有继承结构的代码中,模板方法模式是非常常用的。先定义一个抽象类public abstract class AbstractTemplate { // 这就是模板方法 public void templateMethod() { init(); apply(); // 这个是重点 end(); // 可以作

2022-02-14 14:24:45 283

原创 详细整理全23种设计模式-行为型模式篇1(策略、观察者、责任链)

这一篇主要讲行为型模式的前三种行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。策略模式直接举例,先定义接口和实现类,选择不同颜色的笔画图public interface Strategy { public void draw(int radius, int x, int y);}public class RedPen implements Strategy { @Override public void draw(int radius, i

2022-02-14 11:07:14 495

原创 详细整理全23种设计模式-结构型模式篇2(装饰、外观、组合、享元)

这一篇主要讲结构型模式的后面四种结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。装饰模式component是逻辑实现类,decorator作为装饰器,用来增强component方法,像是添加小功能等例子代码是奶茶和加调料先声明奶茶接口,拥有描述和价格等属性 public abstract class Beverage { // 返回描述 public abstract String getDescription();

2022-02-11 15:53:43 492

原创 详细整理全23种设计模式-结构型模式篇1(代理、适配器、桥接)

这一篇主要讲结构型模式的前三种结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。代理模式最常使用的模式之一了,用一个代理来隐藏具体实现类的实现细节,通常还用于在真实的实现的前后添加一部分逻辑。首先是一个简单的service层逻辑 public interface FoodService { Food makeChicken(); Food makeNoodle(); } public class FoodService

2022-02-10 17:29:33 601

原创 详细整理全23种设计模式-创建型模式篇(java源码,优缺点解析,适用场景)

设计模式首先分成三类,这一篇主要讲创建型模式中的5种,创建型模式的作用就是为了产生实例对象,基于面向对象设计,将对象的创建与使用分离,降低系统的耦合度单例模式特点:单例类只有一个实例对象,减少内存开销该单例对象必须由单例类自行创建单例类对外提供一个访问该单例的全局访问点饿汉public class HungrySingleton { // 创建私有静态实例,意味着这个类第一次使用的时候就会进行创建 private static final HungrySingleton ins

2022-02-10 11:46:49 659

原创 逐步解析力扣1162. 地图分析(网格结构的最短路径,BFS广度优先搜索)

leetcode 1162. 地图分析使用BFS解题代码如下,代码比较多,等下一步步讲解class Solution { static int[] dx = {-1, 0, 1, 0}; static int[] dy = {0, 1, 0, -1}; int n; int[][] grid; public int maxDistance(int[][] grid) { this.n = grid.length; this.gr

2022-02-08 12:06:38 858

原创 逐步解析力扣102. 二叉树的层序遍历(BFS广度优先搜索,BFS和DFS的区别)

leetcode 102. 二叉树的层序遍历DFS 与 BFS 的特点比较DFS(深度优先搜索)//使用递归遍历void dfs(TreeNode root) { if (root == null) { return; } dfs(root.left); dfs(root.right);}BFS(广度优先搜索)//用队列顺序插入当前节点和左右子节点void bfs(TreeNode root) { Queue<TreeN

2022-02-08 11:10:54 368

原创 逐步解析力扣146. LRU算法(哈希表+双向链表,LinkedHashMap源码解析,Redis内存淘汰机制)

LRULRU(Least Recently Used,最近最久未使用)是一种常见的页面置换算法,在计算中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以我们不可能把所有的文件都加载到内存,因此我们需要制定一种策略对加入到内存中的文件进项选择。LRU的设计原理就是,当数据在最近一段时间经常被访问,那么它在以后也会经常被访问。这就意味着,如果经常访问的数据,我们需要然其能够快速命中,而不常访问的数据,我们在容量超出限制内,要将其淘汰。实现自己的lru算法:leetcode 146.

2022-01-27 16:56:32 2021

原创 项目中批量修改/删除,封装成功次数失败原因并返回到自定义Response

项目中用到了一个批量修改/删除的封装,感觉挺不错的,先记录下controller层 @PostMapping("/delete") @ApiOperation(value = "积分删除") public CommonResponseGeneric<BatchOperationGenericRes<BatchPointRes>> deleteByIds(@RequestHeader HttpHeaders headers, @RequestBody @Valid

2022-01-27 12:00:29 763

原创 java并发编程ReentrantReadWriteLock读写锁详解,图解实现,源码分析,锁降级

特点和ReentrantLock一样,公平/非公平,可重入等概念可以看之前写过的这篇:java并发编程ReentrantLock类和可重入锁概念,公平/非公平锁区别,可重入抛异常是否会释放锁使用锁降级操作class CachedData { Object data; volatile boolean cacheValid; final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void proc

2022-01-24 18:40:15 803

原创 java并发编程Future类详解

作用和举例future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例:小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时候,future.get获取,继续做接下来的事情但要注意的是当还没获取外卖的时候,主线程中用餐这一步是卡住的JDK中的Future实现结构如下常用方法:cancel():如果等太久,你可以直接取消这个任务isCancelled():任务是不是已经取消了isDone():任务是不是已经完成了

2022-01-24 17:30:40 7234

原创 java并发编程线程池详解及使用场景(附带项目中使用线程池实现异步工具)

ThreadPoolExecutor类详解使用线程池的目的是:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。所以需要统一管理1.构造和参数在ThreadPoolExecutor类中四个构造方法:前三个都是调第四个构造方法,参数也最多如下corePoolSize:核心线程数,会一直存活,即使没有任务,线程池也会维护线程的最少数量maximumPoolSize:线程池维护线程的最大数量

2022-01-21 11:44:46 2751

原创 java并发编程ThreadLocal数据结构,隔离原理,防止内存泄露和项目实际使用

作用和场景ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的Spring采用Threadlocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式可以使业务层使用事务时不需要感知并管理connection对象,通过传播级别,巧妙地管理多个事务配置之间的切换,挂起和恢复。敖丙举的例子:抽出对象做线程隔离会比传给每个方法要好许多使用和源码ThreadLocal<String> localName

2022-01-20 11:30:32 1005

空空如也

空空如也

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

TA关注的人

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