自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(276)
  • 资源 (2)
  • 收藏
  • 关注

原创 堆排序(大根堆与小根堆)

是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次排序,再截取出前1000个最小的或者最大的。但是我们可以设想一下,从一开始我们目标就只要1000个,那么其实其余九亿九千九百九十九万九千个数据,我们压根不需要知道它们的排序顺序,只需要知道它们都比我们1000个目标数据中最大值都要大就可以了这就是堆排序。它的思想整体上非常清晰简单,结构上是一个完全二叉树。根结点比左右孩子都大则叫做大根堆。

2022-12-04 23:20:17 9384 2

原创 B树(BTree)与B+树(B+Tree)

类型3:X处于非终端结点,则用X的前驱或者后继关键字顶替X的位置,然后把对应的前驱和后继关键字删掉,变成删除终端结点的情况。

2022-12-01 17:33:37 2678

原创 ASL和二叉排序树

对照着生成树的图,如果查找元素比7还要小,则肯定查找失败,对应着结点7的左孩子位置为null,对比到结点7的左孩子位置,需要进行3次比较才能确认查找元素不存在(和29比,和13比,和7比,再下找没了,所以是3次比较),同一层中,空的还有16的左孩子结点(代表着大于13小于16的数据也是不存在,但是也要比较三次才能确认),32的左孩子结点(大于29小于32的数据),41的左孩子结点(大于37小于41的数据);查找第n个数据长度n。数据:7,10,13,16,19,29,32,33,37,41,43。

2022-11-28 11:26:59 4226

原创 图/图的存储/图的遍历

有向图就是边的指向是有方向区分的,例如从A->B ;从A可以到B,但是B不能到A(有向图的边是一个箭头,称之为弧,弧头是w,弧尾是v)无向图的边是无方向区分的,只要A-B,从A可以到B,从B也可以到A1:图一定不可以是空图,也就是说顶点集一定不能为空,边集可以为空2:完全图:若任意两个顶点之间都存在着边(注意这里的边是任意两个顶点直接相连的边),则称该图是完全图。无向完全图有n*(n-1) / 2 条边。有向完全图有n*(n-1) 条边3:子图:图中的某一部分顶点和一部分与顶点相连的边构成的新图,

2022-11-22 21:57:30 765

原创 哈夫曼树与哈夫曼编码

例如:根结点代表着快递集散点,一个叶子结点权值是5,在业务逻辑中代表着重量是5斤的货物📦,路径长度是3,业务逻辑代表着3公里,3 * 5 = 15 假设代表着从根结点开始配送这一件货物的成本 开销是15升汽油越重的物品,配送距离越长,开销越大,假设说每一层结点都有一个快递柜,只可以存放一件物品,这样就让收件人自己来取,而不用大老远送过去了,那么我们就应该优先把最重的物品,放在距离快递集散点(根结点)越近的位置。重量轻的(权值小的)小件物品我们可以送远一点。那么这个想法其实就是最短带权路径例:假设快递站今

2022-11-19 22:52:33 4879 1

原创 树/二叉树/森林之间的相互转换 与遍历

因为根结点没有兄弟,所以它仅有左孩子,所以从二叉树的左结点入手,找左结点的全部右兄弟,使它们连接到左结点的parent结点(下图虚线所示),然后断开兄弟之间的连线(打叉叉的地方),然后再从第一个兄弟的左结点继续往下找,依次。森林总结点数为m,即二叉树的总结点数也是m, 根p的右子树结点数有n个,我们根据森林转二叉树规则知道根结点的右子树都是由森林中其它树构成的,既然右子树结点n,也就是除了第一棵树外总的结点数n,所以第一棵树就有m-n个结点。如果是无序树,EF的位置就可以对换,还是同一棵无序树。

2022-11-18 18:13:47 1597

原创 二叉树的性质的结点数与高度的计算题

若有第七层,则第七层最多有:2^7-1 = 64 个结点,且第七层的全部是叶子结点,但是第六层要有8个叶子,也就是可以想象成第六层有8个结点没有生育能力,无法生孩子,那么第七层就会少 2*8 = 16个结点。因为完全二叉树只有六层,第六层不满,前五层满,根据公式,第五层有 2^5-1 = 16个结点,又因为第六层有3个叶子,3个叶子结点会占用第五层2个结点,所以第五层的叶子结点数: 16 - 2 = 14。要第七层结点最多,则第六层必须满,这样第六层的父辈才能往下生长结点,那么照推第五层也必须满…

2022-11-17 20:54:41 4526

原创 树的入门与习题

结点总度数 = 总结点数 - 1总结点数 = 结点总度数 + 1(一般考察的时候题目肯定要么给出总度数,要么给出总结点数,公式只是简单的 + 1 -1关系)巧记:根结点因为是所有子孙结点的祖宗,所以它比较老,头上一根毛都没有,求总度数(树家族成员总毛数)的时候,要记得仅仅根结点没毛,其它每个成员有一根毛,也就贡献一个度,N个成员N-1根毛理解:要使结点数最少,你想象你是一个抠门的大汉,要完成一个工程:高度H,度为M,要最少的结点数(预算)

2022-11-14 17:09:05 832 1

原创 第四章:串(KMP算法和KMP优化)

/ 复制数组 memcpy(s . ch , a , strlen(a));i ++) {} }1: 前两位固定0 12:从第三个位置开始,把子串往后挪动,找到左边线部分上下最大的匹配前缀,也就是左边线上下两字符串必须完全匹配;右边线的子串位置就是next数组下一次要比较的值的位置,也就是回溯位置。3: 若子串完全挪过中间线,也没找到两字符串匹配的位置,next数组值设为1;也就是它们已知的部分一个都匹配不上,只能从头第一个开始匹配。

2022-11-12 16:35:54 648

原创 矩阵的数组存储

(1)对称矩阵。即aij=aji,对称位置的元素相等的矩阵。对称矩阵可以从对角线划分成上三角区和下三角区,所以在存储时,可以仅存储上三角或者下三角部分,节省一半的存储空间。(2)三角矩阵三角矩阵往往只有上三角或者下三角的数据有意义,其余位置的元素为0或者为同一常量,这样在存储时,仅存储上三角或者下三角部分即可。(3)条带状矩阵(三对角矩阵)非零元素集中在主对角线为中心的区域。这种矩阵的存储和数组定位比较麻烦。分析,由于是nn对称矩阵,按照上面的理解仅需要存储上三角或者下三角部分,以上三角为例

2022-11-11 23:26:24 1741

原创 第三章:栈/队列 重点题

按照题目的输出序列,第二个输出的必须是2,此时P3和P1中间隔着P2,所以必须P2出完,P1才能出栈,所以,P1绝对不可能是2,但是从P4~Pn都有可能是2,设 i 属于4~n范围内且Pi=2,则Pi进,Pi出,马上可以得到1,2的输出序列。当. top2 - 1 == top1 的时候,即第二个栈还想放元素,但是已经碰到第一个栈的栈顶指针了,即下一个位置已经是别人的栈顶,也就是共享栈已经满了,不能再放了,所以,当 : top2 - top1 = 1时,栈满。即所有元素都出队完了,此时是队空。

2022-11-09 21:47:46 661

原创 第一章:各种款式的算法复杂度例子+计算小技巧

(1)正确性。能正确解决问题。(正确)(2)可读性。易读,便于人们理解。(简单易读)(3)健壮性。有些也称之为鲁棒性(robust),是指软件对于规范要求以外的输入情况(非法数据等)的处理能力。(容错)(4)高效率/低存储。所谓高效率就是稍后主要演示的时间复杂度。低存储就是指算法执行过程中需要的最大存储空间。(运行时间快,占用空间小)时间复杂度一:加法规律。

2022-11-07 19:58:35 564

原创 Springboot+Maven做启动类与业务模块分离的架构模式

之前的项目一直是启动类与Controller,Service,Mapper等包同级。Maven仅仅是引入其他模块或者第三方Jar包工具。但是最新接手一套项目的架构非常有趣,也是记录一下分享一下,直接上示意图:上图一共五个Maven项目,父模块包含着四个子模块,子模块中有一个就是负责启动ABC那个子模块的启动类,ABC三套子模块中,又有各自的controller,service,mapper的包,然而仅需要ABC三个子模块的controller的包名路径一样(⚠️最好要保持一致,不然该案例的配置会扫描不

2022-05-13 17:33:37 1303 1

原创 自适应阈值法(图文总结)

概念:该方法网上很多很简洁但是很难懂的公式,本文章将会由简单例子入手,一步步去理解那些公式,但是不做代码实现,毕竟只要搞懂了这个算法的思想,代码的实现其实千变万化,甚至用CV库的话根本不用写代码。为啥出现这个二值化算法,OTSU的致命缺陷在哪里?在大津算法OTSU中,由于采取的都是全局均值求出最佳全局阈值,但是在图片光照不均匀的场景,很容易把稍微模糊的边缘目标图像当作背景,为了避免这种场景,我们就可以考虑更为细腻的局部自适应阈值,它是根据图像不同区域亮度,不断计算更新局部阈值,同时不断“刷新”局部图像

2022-03-31 15:05:09 9618

原创 大津算法OTSU(最大类间差法)

由日本人大津于1979年提出,基本思想就是,找到令前景和背景差距最大的那个T,就是最佳阈值(1)对于图像I,设T为前景与背景的分割阈值(初始化阈值),记住T是会浮动的,它会慢慢调整(2)根据上一步初始化定义的T:设前景像素点数占图像比例为W0,前景平均灰度值为u0设背景像素点数占图像比例为W1,背景平均灰度值为u1(3)设图像总平均灰度 ut = w0u0 + w1u1(4)计算方差值Q=W0*(u0-ut)^2 + W1*(u1-ut)^2方差值越大,说明图像构成的两部分差别越大,在该点阈值

2022-03-31 10:04:55 1158

原创 双峰阈值法

概念:1996年,Prewitt提出了直方图双峰法,即如果灰度级直方图呈明显的双峰状,则选取两峰之间的谷底所对应的灰度级作为阈值。(横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。)它认为图像由前景和背景组成,在灰度直方图上,前后二景都形成高峰,在双峰之间的最低谷处就是图像的阈值所在。例子:注意X轴是灰度值,Y轴是该灰度值的像素点个数(1)初始化:假设我现在有一张图片的灰度直方图如下,初始化双峰V1=(0,30),V2=(255,30),初始化阈值为th = 127此

2022-03-29 16:46:38 3084

原创 腐蚀与膨胀算法

(1)概念腐蚀与膨胀算法,是一种入门级基础的形态学处理算法,常见用于图形处理方面腐蚀操作可以消除噪点,同时消除部分边界值,导致目标图像整体缩小。膨胀操作可以使目标特征值增大,导致目标图像整体放大。他两组合起来使用,可以达到更好分割独立的图形元素的目的。核:腐蚀和膨胀算法的灵魂,也是最需要花心思设计的东西,根据目标图像的特征不同,要设置不同的核才能产生很好的效果更专业的叫法叫做“结构元素”,其中核心,也就是结构元素的中心点,叫做“锚点”,一般采用结构元素的影响区域的最小像素值去替换掉“锚点”的像素

2022-03-24 15:05:35 23261 9

原创 梯度下降算法

1:概念首先我们看下面一张图玩个游戏假设红色的点,是你目前站的地方(山顶)黄色的点,是你的目标地点(营地)你被空投到了雪山山顶,现在山顶美景欣赏完了,急着到山下的营地吃个饱饭睡个觉,那么这个时候就要下山,可是你不知道下山的路该怎么走/要走多久等等那么,怎么下?肯定不可能一下子跳下来,而是按照正常人的思维,找一条下山的路,一点点一点点分阶段往下(如下图)就像我们下山,都是先环顾四周,找到下一个比较低且路好走的地方,走过去,再站在那里找下一个比较低且路好走的地方,走过去,再站在那里……周而复始

2022-03-21 16:03:36 2496 1

原创 InheritableThreadLocal的使用和最简单易懂源码分析

ThreadLocal的基本使用和源码关于ThreadLocal的知识点需要看另外一篇博客:ThreadLocal从简单使用及源码InheritableThreadLocal基本使用在了解完ThreadLocal后,我们来看下面例子:会发现ThreadLocal的一个弊端:父子线程无法共享数据那么我们对例子进行一下改造:使用InheritableThreadLocal完美解决这个问题源码分析:这里先试着停下思考:(1)它是怎么让子线程拿到了父线程设置的参数?(2)它放在哪里?又怎么取

2022-02-22 11:15:30 617 1

原创 邻近分类算法---KNN(Java实现+公式计算例子)

名词解释:KNN:K-Nearest-Neighbor K值最邻近所以网上有好几种叫法:最近邻,邻近…其实都是指的KNN,其实按照翻译都对。KNN算法产生于1968年,是数据挖掘和数据分类技术中最简单的入门级算法。按照字面意思,就是计算出距离K值最近的邻居数据,设对应数据为X,然后把待分类数据归类为X。原理基于大量不同维度的训练数据,做循环比较分析,具体经历下面四步流程:①准备数据,对数据进行预处理 。②计算测试样本点(也就是待分类点)到其他每个样本点的距离 。③对每个距离进行排序,然后选择

2022-02-18 17:27:00 3629 2

原创 CyclicBarrier的多种使用姿势和简单源码分析

是什么?循环屏障,顾名思义像一个屏障那样,可以拦截一定数量的线程,当足够数量多的线程到达屏障后,就会“突破”屏障,所有被拦截的线程会继续往下执行,也类似于一个“集合点”“计数器”,不过它可以被循环利用怎么用?例子1:举一个简单的例子,学校开校运会,所有学生站上赛道后才能开跑public class School { private static CyclicBarrier barrier = new CyclicBarrier(3); public static void ma

2022-02-14 16:50:41 284

原创 ThreadLocal从简单使用及源码

是什么?直译是“线程本地(变量)”,一个类似map结构的类,为每个线程变量单独创建一个副本,保证线程安全为什么要用?理由1:跨越多个方法进行参数传递public class School { static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { say(1); } stat

2022-02-10 15:29:43 553

原创 从局部变量表和操作数栈理解 i++ 和 ++i

两个概念:局部变量表:类被创建后的一小块内存区域,存放当前类的局部变量值操作数栈:栈帧中的一小块内存区域,专门用于存放计算的中间结果值三个点:1:赋值操作其实是把操作数栈中的中间结果值进行计算后再赋值给某个变量,是最后一步操作2: i++ 是指先把i放入操作数栈中,自身局部变量表中的i变量自增+13: ++i 是先把局部变量表i的值自增+1,再放入到操作数栈例子一:输出的b是多少,应该很多人都知道是1,因为大学时候老师说过a++是先使用a,再++但是a因为++了,所以是2执行过程:(

2022-02-08 17:07:08 1082

原创 Variable used in lambda expression should be final or effectively final 问题的解决和追根溯源

翻译:lambda表达式中的变量必须是final的为什么?因为lambda表达式和匿名内部类一样,不需要额外定义类就可以直接写接口方法的实现,但是实际上只是简化了我们的写法,还是会由产生的一个内部类做了该接口的方法实现,那么这个时候,可以理解为其实有两个类,外部类的方法,调用了内部类的方法。而外面那个username,就是外部类的方法中的变量。基于这点认识,我们分析会出现如下两个问题:(1)如果像上面例子的异步执行,有可能就会出现外部类的方法执行完成出栈了,方法中的局部变量username被垃圾回.

2022-01-17 15:46:23 7180

原创 JIT与AOT

名词解释:JIT(JUST - IN -TIME)实时编译AOT(AHEAD-OF-TIME)预先编译它们两者最根本的区别,就在于编译代码的时机,所谓的编译代码,就是把人类写的代码,翻译成机器字节码指令这么一个过程。优缺点:JIT优点:1·可以实时根据硬件资源情况实时编译生成最优指令。2·能实现动态链接,动态编译加载需要用到的模块代码,节省内存空间3·能通过程序运行中内存和磁盘空间使用率情况,定位代码优化点(这是AOT无法做到的)JIT缺点:1·边运行边编译,会造成进程的卡顿,编译的同时

2022-01-11 16:57:34 721

原创 idea+Git工具之幽灵删代码事件

这不是搏眼球写的标题,说实话当时自己也怀疑人生排查了很久,下面直接复现那个幽灵删代码场景。首先看develop分支上,是有这个Experiment类的(为了案件重演,我reset --hard 回当时那个commit id)然后再看当时的我的本地分支,也是有这个Experiment类的,所以肯定不是我删掉的但是由于Develop和local分支都改到了这个文件,所以有冲突了:有冲突,没问题,那就看着develop和local解决,哪些以谁为准,都可以商量但是就在这时!奇葩的一幕出现了!合并r

2021-11-30 14:50:45 452

原创 日志输出的小坑(idea 启动项目报错 open file faild ...... permission denied......)

最近修改了日志输出位置path,从当前./目录写到了另外一个文件路径/data/XX/XX,Windows上没问题,Linux也没问题,结果Mac启动idea运行项目说open file faild … permission denied…解决:手动创建对应的文件路径,mkdir 要加 sudo,然后touch创建出对应的log文件,或者把对应文件夹的权限放开:sudo chmod -R 777 /data/log/XXXXX/ 再启动,即可...

2021-11-18 15:04:33 1953

原创 Java中的retry:标志

在线程池执行任务的源码中看到的,没接触过,所以当时记录了下来学习后补充。具体作用:就是一个标志位,用来定位的,用于更加优雅更加细化的跳出循环,常见搭配是continue retry 和break retry,举例说明普通for循环public static void main(String[] args) { for (int i = 0; i < 2; i++) { System.out.println("这是 i:"+i); for (int a =

2021-11-16 11:38:48 679

原创 Spring自定义注解失效的小坑和解决方案

业务需求写了个自定义注解,作用域加在方法上的,使用方法如下:class Test { @自定义注解 public void methodA(){ ...... }}写完了切面service和各种环绕方法后,测试了一下,生效了,于是提交,告诉队友们可以用起来,结果有一位伙计说注解不生效了,过去看,确实是加在方法上,不过是下面这样调用的:class Test { public void methodA(){ this.methodB(); } @自定义注解 public voi

2021-11-10 19:23:01 5370

原创 线程池执行任务原理

我们都很清楚多线程任务怎么创建,也知道线程池怎么用,那么这篇文章主要是用来分析线程池是怎样执行多线程任务的,首先我们创建一个线程池,从它的execute执行方法做为故事起点~(1)执行任务方法源码入参command就是待执行的任务,这一点源码解释了int c 是获取线程池的运行状态和线程数之类的信息,在线程池这个类的每一步操作都会判断一次,这样才能随时知道线程池的运行状态,它底层比较复杂,是通过Int类型的32位取值来表示不同的运行状态,这里不做展开,详情有另外一篇博客说明。判断假如worker

2021-10-25 11:07:39 369

原创 数据仓库分层概念

ODSOperational Data Store 操作数据存储(贴源层)指的是从数据源中经过Extract(数据抽取)-Transform(数据转换)-Load(数据加载)获取到的数据存储到该层。不是简单的数据换个地方存,而是经过了一定的过滤,去重,还原,清洗工作后保存的一层数据。跟源数据最贴近,但不是源数据的一层数据存储层,为整个数仓的加工数据提供来源的一层。例如通过Kafka增量获取通过FlinkJob进行过滤去重清洗,保存到ODS层的TiDB/ClickHouse/Hive之类的存储服务上。

2021-10-22 11:16:35 659

原创 关于MybatisPlus雪花ID @TableId(type = IdType.ASSIGN_ID) 注解不生效问题

问题描述:@TableId(type = IdType.ASSIGN_ID) 注解不生效,无法生成雪花ID,我用了XML SQL 和 @Insert注解SQL方式都不行,也查了很多资料,有的说主键列必须是String,有的说必须是Long解决问题:使用了该注解,就必须用MybatisPlus中的BaseMapper自带的Insert方法,也就是一张表针对一个对象做的增删改查。手写的SQL一律不生效!而我的业务刚好没那么好对应关系,就是说我从一个对象会解析出N张表的数据填充,于是只能选择其他方式。方法:

2021-10-19 10:41:04 12669

原创 Java读取Excel文档每一行数据

public String readExcel() throws IOException { Map<Integer,Object> map = new HashMap<>(); File excelFile = new File("D:\\XX\\jojo\\Desktop\\XXXX.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(excelFile));

2021-08-31 10:29:51 2171

原创 Netty入门:基础概念和搭建一个基础的服务端Demo

(1) Netty是什么?是一个框架!一个可以让我们自己实现NIO异步事件驱动的网络应用框架,主要作用就是做网络通信的架构设计的框架,所以日常业务需求基本不会跟它直接挂钩。它帮我们封装了TCP/UDP等协议的服务端,同时还能让我们自定义各种网络协议。它具有并发高,封装度高,传输速度快的特点。更简单通俗来说,如果是写业务CURD,基本用不上netty,如果你回忆起了大学时候用C写的WebSocket套接字编程做的一些简陋的聊天室/服务器,并且想用Java模仿着做一套,同时DIY一些网络传输协议,那么就

2021-08-05 16:13:21 246

原创 @Value注入失败问题和解决方案

org.springframework.beans.factory.BeanCreationException: Errorcreating bean with name ‘XXXServiceIpml’: Injection ofautowired dependencies failed; nested exception isorg.springframework.beans.factory.BeanCreationException: Could not autowire field: priv

2021-08-03 16:19:45 3518

原创 CloseableHttpClient的Get/Post基本使用与小坑

前言:是什么?当用习惯了Spring自带得RestTemplate,就很少用HttpClient接口的方式了,其实CloseableHttpClient也是http网络请求的一种工具包,实现了HttpClient接口,可以让我们方便的设置请求参数和请求头信息,还能让我们决定连接超时时间和socket超时时间,同时它会自己维护一个连接池,可以做连接数限制(默认5)和过期回收策略,防止每次请求都要创建新的connect,非常的方便。(1)准备工作依赖:Gradle:implementation 'or

2021-08-03 11:43:19 7020

原创 Mybatis列与实体类ORM映射失效解决方法

ORM框架的映射正常来说只要遵循规则,都是可以映射到的。要注意以下几个点(1)开启驼峰映射规则在项目的properties文件中添加:mybatis.configuration.map-underscore-to-camel-case=true或者,在mybatis-config.xml(2)确保POJO类遵循了驼峰命名例如:数据库中列名叫:create_timepojo中属性就应该叫:createTime如果pojo中叫createDate,又不好随便改,牵涉的旧代码很多,怎

2021-07-30 10:36:27 709

原创 Mysql中的冗余索引和重复索引

(1)重复索引:指的是在对应列上,以相同的顺序不同的索引名称建立了多套一模一样的联合索引(单值索引也有,不过相对来说没那么奇葩做这种事),例如:ALTER TABLE a ADD INDEX ‘idx_1’ (‘id’,’name’,’sex’)ALTER TABLE a ADD INDEX ‘idx_2’ (‘id’,’name’,’sex’)ALTER TABLE a ADD INDEX ‘idx_3’ (‘id’,’name’,’sex’)这三个就是重复索引,占用三倍的索引磁盘存储空间,降低

2021-07-23 16:35:26 2556

原创 一文看懂Concurrent面试常问类Executor,ExecutorService,AbstractExecutorService,ThreadPoolExecutor作用,关系与区别

Concurrent包是jdk1.5所提供的一个针对高并发进行编程的包,也是多线程并发编程最喜欢问的,特别是从线程,线程池的使用做为最简单的切入点,先看个不太好理解的类图接下来我们从头往下,一步步拆分开来研究:Executor:多线程框架的主要接口,它底层就是一个execute执行方法。它代表着线程任务的执行,也是一切的开始,不管什么线程安全策略,多线程管理,定时,串行执行,都是建立在这个“执行”的基础之上,没有execute执行,线程也就等于无用。看它源码注释:An object that ex

2021-07-20 18:54:12 434

原创 Mybatis中的一二级缓存通俗易懂解析

前言:缓存我们都知道,是把数据存放在内存中,依靠内存的高速读写能力提高查询效率,那么mybatis中的一二级缓存又是什么呢?有什么区别呢?我们一上来先不说概念,以更简单理解的角度入手(1)实际业务需求假设有个业务需求,需要读取Hbase中二进制格式的数据,要我们设计一个类似ORM(Object Relational Mapping 对象关系映射)映射的功能,我们会怎么做?这一块我在自定义注解中读取Hbase列族列名解析后映射到对应的对象中做过,只需要遵循一定规范,常见例如驼峰,例如蛇形,甚至自己.

2021-07-19 16:26:55 418 1

内存溢出排查手册.pdf

内存溢出排查手册.pdf

2021-05-14

流式字符串统计的FlinkJob

流式字符串统计的FlinkJob小demo

2020-12-31

空空如也

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

TA关注的人

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