自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Mr.hu

嗯哼

  • 博客(159)
  • 资源 (2)
  • 收藏
  • 关注

原创 Mysql事务隔离级别及其底层原理

所谓“幻读”,指的是在一个事务读取某个范围的记录行时,另一个事务在该范围插入新的记录,就可能导致在前一个事务多次读取该范围的记录时,更多的行被返回,好像从中产生了“幻影”一样。这就意味着,如果我们在事务 A 中执行多次的 select,在每次 select 之间有其他事务更新了我们读取的数据并提交了,那就出现了不可重复读,即:重复读时,会出现数据不一致问题,后面我们会讲解超支现象,就是这种引起的。在同一时间,读操作不会被写操作阻塞,写操作也不会被读操作阻塞,大大提高了数据库的并发处理性能。

2023-12-07 21:04:38 118

原创 关于晋升与跳槽的一些思考

这篇文章主要探讨了作者对于个人职业发展的两种可能路径的看法和规划:内部晋升和跳槽。作者强调了在这两种路径中,个人技能的提升、持续学习以及项目和团队成功的重要性。对于内部晋升,作者把它看作一次挑战和历练,需要强大的技术实力和带团队的能力。对于跳槽,则被认为是一种对自身的全新考验,可以重新寻找自己在社会中的位置,检验自己所选行业的正确性以及个人的技术学习情况。总的来说,这篇文章对于求职者如何结合自身情况,分析和选择自我发展的道路提供了独到的见解和实用的建议。

2023-11-02 14:29:40 291

原创 一种支持热插拔的服务端插件设计思路

本文讨论了服务端插件的定位和实现方式。服务端插件是一个逻辑扩展平台,通过提供快速托管逻辑的能力来实现功能的扩展。与传统将服务和逻辑写在一起相比,服务端插件减少了服务的发布和变更,并支持多种语言实现不同的逻辑,同时还支持热插拔。与函数计算服务相比,服务端插件减少了网络传输的损耗,性能更高。

2023-10-31 20:36:57 219

原创 defer 与闭包,go 并发常见问题

参考网上的实现,提供了一种安全地启动并发的实现,其实就是类似AOP的思想,在所有goroutine启动之前defer+recover确保安全,同时提供了带err处理的方式(可选),省去之前单独传入errChan来收集错误的烦恼。所以在go 的并发中我们启动新的协程时要使用defer捕获新协程的panic,防止拖累主服务。遵循一个约定:谁创建,谁停止(谁创建goroutine,谁负责停止goroutine)读一个close的channel不会panic,会返回相应的零值。

2023-03-27 19:23:36 503

原创 快手实习生机试题 字符串最小变换次数

分析: 动态规划,dp[ i ][ j ] 存储a[0]到a[ i ] 与b[0]到b[ j ] 两个字符串的最少变换次数(ab为字符数组),状态转移方程为dp[i][j] = min(dp[i-1][j]+1 , dp[i][j-1]+1 , dp[i-1][j-1]+(a[i]==b[j]?0:1) );代码:import java.util.*;p...

2022-02-22 20:52:50 389

原创 DDD的一些知识

什么是DDD?Eric Evans 在其著作《领域驱动设计:软件核心复杂性应对之道》提出了一种新的架构设计方法——领域驱动设计(Domain Driven Design)简称DDD。对于初次接触DDD的开发同学而言,一些概念理解起来可能比较晦涩,在此把DDD的几个基础概念进行梳理记录。​DDD中的那些概念1、领域领域在我们的认知当中和区域、地盘这些词都属于近义词,从字面意思上也可以看出来领域是用来确定范围和边界的。在我们进行业务建模时,DDD会按照一定的规则将业务领域进行细分,当领域细分到一定的程

2021-09-17 11:06:12 310

原创 幂等服务的设计理念

幂等键目的针对成功的请求进行幂等失败及抛异常的请求要允许重试,(存在请求参数变化,但是幂等键不变的情况)。这是因为幂等键是根据业务场景来的。能够返回执行中 (有状态幂等)此需求是针对超时的情况,要让调用方能感知,能够保存并返回上次成功执行的结果针对幂等的请求做到可重入​拓展功能幂等键支持配置选择第几个入参选择某个入惨的某个属性多个入参组合打印日志默认打印所有异常支持打印出入参测试环境标支持一键关闭所有幂等功能,用于测试环境..

2021-09-17 10:55:53 153

原创 mybatis 动态 SQL if的test写法规则

前言使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。比如:<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if></select>其中 t

2021-06-15 19:58:28 1043

原创 使用Aop实现自定义注解 - 实战篇(统一日志打印)

使用Aop实现自定义注解- 原理篇使用Aop实现自定义注解 - 实战篇(统一日志打印)统一日志打印约定大于配置,系统提供对外的接口要有以下要求,这样的好处是我们可以对接口统一做定制化日志管理。比如只对更新接口打印入参。接口命名单个查询接口,???? findById批量查询接口,???? listByIds单个更新接口,???? updateById批量更新接口,???? batchUpdateById单个新增接口,???? save批量新增接口,???? batchSave

2021-06-14 16:22:26 1762 1

原创 基于模版方法 快速导入Excel数据到数据库

目录一、目标二、初始化分析整体流程数据导入流程三、技术选型文件导入文件读取四、程序设计整体设计详细设计五、最佳实践一、目标快速初始化园区,需要初始化部分,园区维度,不初始化全局维度二、初始化分析整体流程实施人员:数据准备-》数据检查开发人员:数据导入实施人员:数据验证数据初始化的过程主要是,将确定格式的数据导入数据库的过程。因为涉及实施人员,为了兼容性,文件格式采用Excel。数据导入流程对于开发而言数据导入分为三个流程:文件导入、文件读取,文件解析、插入数据库。接下来我们分别聊下各个流程。先

2021-06-14 12:02:44 902 2

原创 泛型系列文章(3) - 泛型高级知识 - 泛型与反射包的应用

泛型系列文章(3) - 泛型高级知识 - 泛型与反射包的应用Gson泛型解析原理gson官网链接用过Gson的都知道,Gson是可以解析带复杂泛型参数的数据结构的,方式如下:T data = new Gson().fromJson(json, new TypeToken<T>(){}.getType());List<List<String>> data = new Gson().fromJson(json, new TypeToken<List<Li

2021-06-13 15:06:15 106

原创 泛型系列文章(2)- 泛型中级知识 - 反射包源码

泛型系列文章(2)- 泛型中级知识与反射包源码一.泛型基类Type及其子接口的来历​ 原始类型和新产生的类型都应该统一成各自的字节码文件类型对象。但是由于泛型不是最初Java中的成分。如果真的加入了泛型,涉及到JVM指令集的修改,这是非常致命的。​ 为了使用泛型又不真正引入泛型,Java采用泛型擦除机制来引入泛型。Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是,一旦编译完成,所有的和泛型有关的类型全部擦除。​ 因此,与泛

2021-06-13 14:48:49 155

原创 泛型系列文章(1)- 泛型基础知识

泛型系列文章(1)- 泛型基础知识一.概述1.泛型是个语法糖(Syntactic Sugar)在计算机语言中添加某种语法,这种语法对语言的功能并没有影响,但更方便程序员使用Java中常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等虚拟机并不支持语法糖,会在编译阶段解语法糖,将语法糖还原回基础的语法结构泛型作为一种语法糖,可以在编译阶段完成一些类型转换工作,避免在运行时强制转换而出现ClassCastException(类型转换异常)2.泛型的引入原因JDK1.5之前没有

2021-06-13 14:47:32 155

原创 区块链与分布式系统一致性解决方案

区块链与分布式系统一致性解决方案拜占庭将军问题共识算法常见的共识算法分布式系统中的节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复。分布式系统面临的这个问题就是拜占庭将军问题,对于拜占庭将军问题,不同系统给出了不同的解决方案。拜占庭将军问题提现在区块链系统中就是:对于一笔合规交易如何让大家能够达成一确认;在其他分布式系统中是如何保证

2020-10-23 15:54:26 2042

原创 分布式锁的方法论

分布式锁的实现方法 目前有两种常见实现方法:基于数据库实现分布式锁和基于缓存(Redis等缓存)实现分布式锁。我们将从以下几个个方面考察两种实现方式的优劣:基本功能:在分布式系统中能够保证不会有两个线程同时执行同一方法。可重入锁:在线程本身拥有锁的情况下,再次执行本方法不需要重新获取锁,避免发生死锁。高可用获取和释放锁:不能释放别人的锁。最好是阻塞锁:方法的执行时间都很短,往往只需要阻塞等待一段时间就能获取到锁。基于数据库实现分布式锁我们需要在数据库创建一张锁表,...

2020-10-22 15:29:46 140 1

原创 Redis 实现分布式锁

使用 String 高级命令实现分布式锁删除分布式锁(CAD)大多数应用都使用SET NX接口来设置一个分布式锁,一般会设置一个超时时间,防止业务崩溃或者错误导致资源无法释放。SET resource_name random_value NX PX 300然而在删除的时候,却不能直接把resource_name的key删掉,比如:App1设置了分布式锁resource_1,随机valu...

2020-10-22 15:25:45 161

原创 OOM dump文件的几种方法

OOM dump文件的几种方法前言dump的几种方法准备工作我们需要直接dump现在的内存对象。我们需要在发生FullGC时 dump出文件保存。运行时强制修改参考前言​ 在进行OOM分析或者线上经常FullGC时,需要我们dump内存文件分析,不同情况下需要使用不同的dump方法。dump的几种方法准备工作获取程序的pid有两种方法:执行ps -ef | grep 程序名在java/bin 文件中执行jsp我们需要直接dump现在的内存对象。1.可以使用jmap工具:Jmap命令是

2020-10-21 16:39:46 3541

原创 基于Pikachu漏洞练习平台的 XSS攻击

概述简介XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户。XSS漏洞主要是通过js代码用来进行钓鱼攻击、前端js挖矿、盗取用户cookie,甚至对主机进行远程控制。攻击流程假设存在漏洞的是一个论坛,攻击者将恶意的JS代码通过XSS漏洞插入到论文的某一页面中当用户访问这个页面时,都会执行这个恶意的JS代码,这个代码就会在用户的浏览器端执行XSS攻击类型危害:存储型 > 反射型 > DOM型反射型:交互的数据一般不会被存在数据库里面,一次性,所见即所得,一般出

2020-10-20 20:10:44 794

原创 基于pikachu漏洞平台的 --SQL注入攻击学习与总结

SQL注入攻击基础知识常见注释符号(官方链接):mysql> SELECT 1+1; # 行内注释mysql> SELECT 1+1; -- 行内注释mysql> SELECT 1 /*行内注释 */ + 1;mysql> SELECT 1+/*多行注释*/1;mysql> SELECT * FROM table1 WHERE a=1 /*! AND b=2 */其中/*! */ 里面的语句会被MySQL识别并执行,但是会被其他系统

2020-10-16 18:01:28 1632 1

原创 线程钩子ShutDown Hook与Finally

线程钩子前言某些情况下,Finally无法释放线程资源,所以我们需要使用线程钩子释放。在线上对于分布式锁的释放,一般在Finally里进行,但是应用重启时的脚本使用的是kill-15指令关机,此时Finally里面的代码不会被执行,导致分布式锁无法释放。Finally一定会执行么?线程基础知识java中线程状态与转换关系如下图:其中箭头旁边的标注代表执行的线程方法。[外链图片转存中…(img-mQRWdhf5-1601360975262)]从running态转为Block阻塞态有三种方

2020-09-29 14:32:41 341

原创 Finally 一定会被执行吗?

Finally 一定会被执行吗?前言在编程的时候大家总喜欢在finally释放各种线程资源,保证线程退出时能够释放占用的资源。但是Finally一定会被执行吗?结论是的一般情况下,finally会在try和catch之后执行,但是以下情况例外:执行了Thread.currentThread().suspend();执行了 System.exit()执行了 Runtime.getRuntime().halt(exitStatus) 、 Runtime.getRuntime().e

2020-09-29 14:29:08 1448

原创 MySQL批量更新(下) -- 性能对比

MySQL批量更新(下) – 性能检测前言前面写了批量更新的上篇–四种实现方式,本节对他们的性能进行测试。本次测试数据库隔离级别 READ-COMMITTED表总计40万行每次更新3000行测试结果方法一:CASE 指令 – 性能【消息】:执行成功,当前返回 [3000] 行,耗时 [386ms.]方法二:Join Update – 性能【消息】:执行成功,当前返回 [3000] 行,耗时 [247ms.]可以看出 join 的方式性能优于 case&nbs

2020-09-13 17:39:25 1136

原创 MySQL批量更新(上) + Mybatis 实现

批量更新前言增删改查-数据库四大基本操作,批量更新如何实现呢?MySQL官方给出的一个控制指令可以解决这个问题:CASESQL原理CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list]END CASEOr:CASE WHEN search_condition THEN stateme

2020-09-13 14:25:21 2675

原创 多线程Spring注入对象问题的四种解法(@Autowired 注入为空)

多线程Spring注入对象问题的四种解法前言当我们使用多线程时,想给线程注入一个service,但是运行时发现service总是为null。举个????:public class MyThread implements Runnable { @Autowired Service application; public void run() {}}原因new Thread不在spring容器中,也就无法获得spring中的bean对象。根据SpringBean的生

2020-09-09 00:38:30 4964

原创 SQL优化之in或range查询

前言读过《高性能MYSQL》的读者应该还记得,建议使用in代替部分rang查询,提高查询效率,因为在一条索引里面,range字段后面的部分是不生效的。但是使用in的时候需要注意,在某些情况下存在问题。问题在线上巡检时发现一条慢SQL,语句如下:SELECT *FROM base_tableWHERE code IN ( 。。。。。。)其中 code 已经在表中单独创建了 普通索引 ,并且 in 条件的list 大约 2万行 。首先执行 EXP.

2020-09-07 20:47:17 2605

原创 索引那些事--进阶版

索引那些事--进阶前言什么是好索引? 三星系统如何创建高性能索引?其它覆盖索引:索引和锁前言在去年笔者写了一篇MySQL索引那些事的文章,介绍了常见的索引分类,以及索引底层原理和部分索引特性。最近在工作的时候遇到问题,重新回顾一下遗漏的知识点。索引虽好,但是不能随意创建,不仅仅是因为索引会占用存储空间,而且在MySQL更新或新增数据的时候索引的维护成本会大大增加,甚至严重影响数据库的性能。在后期维护索引的时候又很难随意删除一个索引(无法确定是否有人在用),所以我们在新增索引的时候一定要慎重。那弄懂什么

2020-08-24 00:54:42 106

原创 JDK动态代理原理(源码层面)

JDK动态代理前言笔者在写设计模式的代理模式的时候,顺便想起并利用Java的JDK实现了动态代理。事后对源代码很感兴趣,于是顺手分析了一下。其中代理模式两种实现方式见:https://github.com/link8hu/java-源码分析public static Object newProxyInstance(...) throws IllegalArgumentException { //验证传入的InvocationHandler不能为空 Objects.r

2020-08-20 01:11:14 395

原创 使用Aop实现自定义注解 - 原理篇

自定义注解的实现本次我们将使用Spring boot 和AOP 实现自定义注解,主要功能是自动打日志。元注解元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:1.@Target,说明了Annotation所修饰的对象范围    2.@Retention,定义了该Annotation生命周期(编译/运行)    3.@Documented,是一个标记注解,没有成员

2020-07-31 22:02:49 5499

原创 如何把代码隐藏在图片背后

隐藏代码到图片背后前言原理应用思考前言很多时候在新闻上看到黑客将恶意代码隐藏到图片背后,这种技术早已不是什么密码,今天来窥探一下背后的技术原理。原理大家都知道图片是由一个个像素点组成的,黑白图片是一张二维的像素点,彩色则是RGB三张二维像素点,而图片的格式定义集中在图片头部。那么我们就可以利用图片的这种协议进行代码的隐藏:为了不影响图片的查看,我们可以直接将代码追加在图片的末尾。因为屏幕显示技术的落后,像素点不同但相近的rgb的值,在电脑上显示是一样的颜色。我们可以将每个像素的最后一位使用一个

2020-07-20 20:13:33 1236

原创 LeetCode 8. 字符串转换整数 (atoi)

8. 字符串转换整数 atoi题目描述分析代码题目描述请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了...

2019-12-11 17:41:37 192

原创 220. 存在重复元素 III

#220. 存在重复元素 III题目描述给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t =...

2019-12-04 17:39:32 202

原创 LeetCode 46. 全排列

46. 全排列题目描述分析代码题目描述给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]分析全排列有很多题,比如随意给定几个数字,求全排列的第x个。本题是输出所有全排列的组合,深度遍历就好。pat刷多了,突然使用Java写深度遍历好别扭...

2019-12-04 15:32:39 132

原创 俄罗斯套娃信封问题

俄罗斯套娃信封问题题目给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],...

2019-12-02 15:51:24 339

原创 LeetCode -- 300. 最长上升子序列

LeetCode -- 300. 最长上升子序列题目描述分析解法题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能...

2019-12-02 15:48:34 276

原创 正则表达式 (例子--保留两位小数)

正则表达式复习分类:正则表达的4个知识点:定位符、断言、**限定符**和分组定位符:表示行和单词的开始和结尾。^表示必须以什么字符开头;$表示必须以什么字符结尾。限定符:即限定某个字符或某类字符出现的次数。*****表示重复0次或更多次(任意次数);{n}表示重复n次;{n,}表示重复至少n次;{n,m}表示重复n-m次;特例:?表示重复0次或1次(最......

2019-10-15 20:46:29 4132

原创 Spring不支持静态变量注入原因及其解法

Spring不支持静态变量注入原因及其解法场景重现:原因分析:解决方案后话场景重现:以下变量在使用时会报空指针@Autowiredprivate static ReadService readService;原因分析:静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了...

2019-09-28 11:24:08 685

原创 记一次高并发更新 feature--拓展字段 问题

记一次高并发更新 feature–拓展字段 问题##前言: 原思路:- 从数据库查出原有feature 1- 更新要修改的内容 2- 整个feature置入数据库 3##问题:在高并发情况下:​ 两线程同时查出了feature,并先后完成了2-3步,结果:​ 更新被覆盖解决办法:使用数据库JSON操作函数,在数据库上更...

2019-09-20 15:54:49 607 1

原创 一次高并发问题记录

一次高并发问题记录###场景复述:目前做了一个Excel导入的功能:先读取整个Excel,遍历读取到的List将数据库中已存在等无效数据的剔除批量插入数据库问题复现:连续两次导入同一份文件结果:数据库中存在两份相同的数据原因分析:​ 上次的导入还没执行完毕,这次又导入。每次查询数据库都显示库位不存在,所以插入了两遍。目前现场只要等上次...

2019-09-20 15:51:30 314

原创 SpringBootStarter 分析及其手写实现

SpringBootStarter 分析及其实现stater可以帮助我们省略很多的配置,我们不如分析下,SpringBoot的stater,然后实现一版自己的starter:主要是类似Mybatis那种自动根据条件注入的功能mybatis-spring-boot-starterMybatis-starter主要包含两个pom文件点进去可以看到:<project xmlns="http...

2019-08-31 23:27:51 577

原创 2019 拼多多校招第三题sum 服务端研发工程师

题目描述给定两个正整数N和S,你需要找出所有的长度为N的正整数数列中,满足单调递增以及总和为S的数列有多少个。输入描述:共一行,两个整数N和S. (1<N, s < 10000)输出描述:一个整数, 为满足条件的数列个数对100000007取模的结果。分析本题最牛逼的解法是动态规划,dp[n][s] 表示:和为s长度为n 的序列个数。状态转换方程为:dp[n][s] =...

2019-08-12 00:29:57 2617 2

智能饮水机源代码及电路图

演示地址http://player.youku.com/player.php/sid/XMzUzMTEyMzg5Mg==/v.swf 当使用者把水杯放在饮水机给水位置时,压力传感器会检测到压力,饮水机开始控制高度检测传感器上升,利用超声波测出水杯的高度,同时确认水杯放置的情况。当水杯的液面高度接近水杯高度时,自动关闭抽水泵并停止注水,防止水溢出,减少了水资源的浪费,以此达到节水的目的,实现可持续发展。

2018-10-12

FirePHP 库文件

FirePHP 支持的库文件 php调试从未如此简单!

2016-11-25

空空如也

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

TA关注的人

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