
Java
文章平均质量分 80
阿啄debugIT
0、精通java,及常用设计模式,熟练编写shell脚本,掌握python、scala、golang的编写;
1、精通Spring Cloud等微服务架构,掌握SpringBoot、batis等后端技术,kafka、redis、es等中间件的整合开发;
2、熟悉掌握mysql、pg等关系数据的原理及调优,及NoSQL数据的存储和查询;
3、熟悉CDH各个组件,及精通离线、实时等计算技术;
4、掌握java多线程高并发编程,及整合shiro、redis、fastdfs、MQ、netty等开发;
5、熟悉K8S集群管理Docker容器,及理解掌握openstack原理和操作。
展开
-
理解springboot那些注册与回调、监控与统计等命名规范,就可以读懂70%的springboot源代码
再理解springboot那些注册与回调、监控与统计等命名规范,就可以读懂70%的springboot源代码,Spring Boot是Spring提供的一个快速开发工具包,让程序员能更方便、更快速的开发Spring+Spring MVC应用,简化了配置(约定了默认配置),整合了一系列的解决方案(starter机制)、redis、mongodb、es,可以开箱即用。原创 2023-10-25 00:56:06 · 361 阅读 · 0 评论 -
leetcode 1586 二叉搜索树迭代器 II 与 173. 二叉搜索树迭代器
1586 二叉搜索树迭代器 II 与 173. 二叉搜索树迭代器 异同173由于只需要记录next的值,所以只需要一个cur作为全局变量!1586由于需要记录pre的值,所以,需要把每次TreeNode的新对象,压入list,以便需要的时候,能及时获取!173的cur节点,转变为1586的索引posCur原创 2023-10-05 21:33:19 · 170 阅读 · 0 评论 -
LeetCode 251:展开二维向量
LeetCode 251:展开二维向量嵌套list解法:1,提取 Vector2D(List vec2d) 的参数为全局参数2,抽出2个list的对应的index,如List.get(listIdx).get(elemIdx++)借助Iterator迭代器解法1,对外层list,取迭代器Iterator out;2,对内层list,抽取迭代器Iterator inner;原创 2023-10-05 01:56:08 · 654 阅读 · 0 评论 -
Arrays类的binarySearch()方法在leetcode题中经典运用
Arrays类的binarySearch()方法在leetcode题中经典运用,leetcode300. 最长递增子序列leetcode 面试题 17.08. 马戏团人塔原创 2023-09-30 20:38:30 · 155 阅读 · 0 评论 -
Java泛型、元组、类型参数推断、擦除、擦除的补偿、通配符等的学习及运行
简单泛型(基本都是介绍设计代码的用法)public class Holder3<T> { private T a; public Holder3(T a) { this.a = a; } public void set(T a) { this.a = a; } public T get() { return a; } public static void main...原创 2022-10-24 23:58:56 · 234 阅读 · 0 评论 -
Java isAssignableFrom()方法与instanceof()方法区别
instanceof是子->父的过程;isAssignableFrom是父->子的过程。原创 2022-09-18 22:57:56 · 359 阅读 · 0 评论 -
精讲高并发异步解耦利器RocketMQ技术架构,及运行原理,及分析RocketMQ究竟强在哪里?RocketMQ集群是如何做数据分区的?如何做数据分区的?
前言RabbitMQ,其功能也是挺强大的,那么,为啥又要搞一个RocketMQ出来呢?是重复造轮子吗?本文我们就带大家来详细探讨RocketMQ究竟好在哪里。高并发异步解耦利器:RocketMQ究竟强在哪里? | IT宅-arthinking's blogRocketMQ是一个分布式消息中间件,具有低延迟、高性能和可靠性、万亿级别的容量和灵活的可扩展性。它是阿里巴巴于2012年开源的第三代分布式消息中间件。随着阿里巴巴的电商业务不断发展,需要一款更高性能的消息中间件,Rocket.原创 2021-12-15 00:01:38 · 2451 阅读 · 0 评论 -
通过模板方法模式——对短信中的文本内容进行敏感词过滤,及将文本内容与敏感词词库做匹配的实现
前言模板方法模式是最为常见的几个模式之一(也比较简单),是基于继承实现代码复用的基本技术。模板方法模式(TemplateMethod Pattern)的定义是:首先定义了一个由若干执行步骤组成的执行过程(形成模板),而将一些步骤延迟在子类中实现,使得子类能够对其中一个或者多个具体步骤进行重新定义,从而改变最终的执行结果。模板方法模式的UML类图如下:这里涉及到了两个角色:抽象模板 AbstractTemplate定义并实现了一个模板方法。这个模板方法一般是一个具体的方法,它定.原创 2021-12-14 01:43:26 · 746 阅读 · 0 评论 -
原型模式的结构与多种实现,包括实现Cloneable接口,并重写clone方法,和复制构造器实现深拷贝,浅拷贝,及使用Serializable实现深拷贝
不要问我,深拷贝与浅拷贝有什么区别?直接代码gif对比展示原创 2021-10-24 23:43:44 · 474 阅读 · 1 评论 -
java后台开发必备的9大类基础工具,你集齐了?
前言对于java后台开发人员,内功深厚关键是看对关系型数据库,领域驱动设计(Domain-Driven Design),设计模式Design Pattern,算法Algorithm,面向对象编程OOP(SOLID)线程安全,事件驱动,测试驱动开发依赖注入框架等掌握的深浅,同时不要忘记自己是一个coder,怎样才能写出高质量的代码?站在巨人的肩膀上,持续改进优化,持续debug!通用工具类MD5UtilRSAUtilDateUtilStringUtilNumberUtil集合工具类原创 2021-08-21 20:33:02 · 4487 阅读 · 2 评论 -
采用递归与迭代法思想,分别用java编程去实现欧几里德,斐波那契,牛顿迭代法
前言数学中的欧几里德算法,斐波那契数列和牛顿迭代法求非线性方程的近视解,同时用递归与迭代法分别去实现!递归法递归,就是在运行的过程中调用自己。构成递归需具备的条件:1. 子问题须与原始问题为同样的事,且更为简单;2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程。1.欧几里德算法,典型的迭代法最经典的迭代算法,用于计算两个整数a,b的最大公约数。假如需要求 1997 和 615 两个正整数的最原创 2021-08-08 09:30:21 · 441 阅读 · 0 评论 -
在电商行业,采用flink进行热门实时流量统计,流量PV和UV分析、市场营销分析、恶意登录监控、订单支付实时监控等场景的解决方案
热门实时商品统计•基本需求-统计近1小时内的热门商品,每5分钟更新一次-热门度用浏览次数(〃pv〃)来衡量 》•解决思路一在所有用户行为数据中,过滤出浏览("pv")行为进行统计-构建滑动窗口,窗口长度为1小时,滑动距离为5分钟...原创 2021-06-20 17:12:36 · 1058 阅读 · 1 评论 -
TransmittableThreadLocal相关组件实用解读,及如何达到线程池中的线程复用,及使用在哪些线程数据传递场景?
transmittable-thread-local以下简称:TTL,由于InheritableThreadLocal在线程池中上下文传递的问题,可以知道这个threadLocal的值传递,在父子线程之间若使用了线程池的技术,会导致子线程的threadLocal信息错乱,而TTL在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。它是一个Java标准库,为框架/中间件设施开发提供的标配能力,项目代码精悍,只依赖了javassist做字节码增原创 2021-06-19 03:26:23 · 1573 阅读 · 4 评论 -
debug底层java代码,对list中的数据去重的正确姿势,及对比java list remove正确使用方法与错误使用
前言List中主要有2种数据结构的实现,一种是数组,另一种是链表。数组,均实现RandomAccess类数组的实现有ArrayList、Vector、Stack、CopyOnWriteArrayList他们都继承了AbstractList,AbstractList实现了List中的部分接口,并且实现了数组结构的遍历,也就是上边说到的迭代器设计模式中Iterator部分,Stack实现了一个LIFO,Vector实现了线程安全,CopyOnWriteArrayList则是线程安全的一个变体,读原创 2021-05-19 10:14:05 · 574 阅读 · 5 评论 -
分析Threadlocal内部实现原理,并解决Threadlocal的ThreadLocalMap的hash冲突与内存泄露
前言ThreadLocal 的经典使用场景是数据库连接、session 管理、多线程等……比如在Spring中,发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都不同程度使用了ThreadLocal 。Spring中绝大部分Bean,都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean,就能够以singleton的方式,在多线程中正常工作。知道Threadlocal怎么用,但是不知道为什么要这样用?底层原理是.原创 2021-05-14 22:53:38 · 1815 阅读 · 3 评论 -
Nacos用来做注册中心的话,它是怎么贴合CAP理论的 C/A切换是怎么做的,配置属性是如何实现动态刷新的?
前言Nacos用来做注册中心的话,它是怎么贴合CAP理论的 C/A切换是怎么做的,配置属性是如何实现动态刷新的?什么是CAP理论原创 2021-04-18 02:41:21 · 1222 阅读 · 2 评论 -
springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据
开发目的:提高百万级数据插入效率。采取方案:利用ThreadPoolTaskExecutor多线程批量插入。采用技术:springboot2.1.1+mybatisPlus3.0.6+swagger2.5.0+Lombok1.18.4+postgresql+ThreadPoolTaskExecutor等。具体细节:第一步:application-dev.properties添加...原创 2019-12-25 12:22:52 · 26889 阅读 · 46 评论 -
通过对比ReentrantLock与synchronized不同,研读Reentrantlock的CAS的开销、AQS队列、CLH队列,及实际工作中的运用
前言网上大多对Reentrantlock进行拆分研读,但是具体到实际工作中的运用却很少,同时工作中平时不用,一用都是涉及重要的代码编写,所以有必要清楚来和Reentrantlock做个朋友,混熟关系。Reentrantlock的研读ReentrantLock是基于AQS实现的,AQS很好的封装了同步队列的管理,线程的阻塞与唤醒等基础操作。默认情况下,ReentrantLock使用的是非公平模式获取锁,而不是公平模式。不过我们也可通过ReentrantLock构造方法ReentrantLock(原创 2021-04-11 03:17:03 · 351 阅读 · 1 评论 -
Linux内存使用率高问题排查思路jmap,及Linux 操作系统加固和安全策略设置
本文旨在指导系统管理人员或安全检查人员进行Linux操作系统的安全合规性检查和加固。1. 账号和口令1.1 禁用或删除无用账号减少系统无用账号,降低安全风险。操作步骤 使用命令userdel <用户名>删除不必要的账号。 使用命令passwd -l <用户名>锁定不必要的账号。 使用命令passwd -u <用户名>解锁必要的账号。 1.2 检查特殊账号检查是否存在空口令和root权限的账号。操作步骤...原创 2021-02-18 02:02:39 · 664 阅读 · 0 评论 -
redisson分布式锁与spring注解事务共用产生的一系列问题,及对应解决方案
前言有锁才有自由,生活中不存在绝对的自由,绝对的自由通常对应的无序和混沌,只有在道德、法律、伦理的约束下的相对自由,才能使人感受到自由。而在多线程编程中,锁是至关重要的,锁就是道德,就是法律约束,没有锁的多线程环境将会是混乱的,所有线程都在争夺资源,最后的结果就是导致系统崩溃,而有了锁之后,多线程环境才能稳定高效的工作。事故现场某些原因,获取锁失败-------没有在至少N/2+1个Redis实例取到锁,或者取锁时间已经超过了有效时间),客户端应该在所有的Redis实例上进行解锁(即便某原创 2021-03-10 18:47:13 · 1360 阅读 · 2 评论 -
SessionCallback 或者 RedisCallback,满足在一个redis链接中执行N条命令,及采用spring提供类序列化机制解决redis获取的值乱码问题
SessionCallback 或者 RedisCallback,避免在一个redis链接中执行2条以上的命令问题如下面这样2条命令,实际上会分别前后开启2个不同的链接去设置值redisTemplate.opsForValue().set("azkey0", "azvalue0");redisTemplate.opsForValue().set("azkey2", "azvalue2");为了可以在一个redis链接中执行多条以上的命令,我们可以使用 SessionCallback 或者原创 2021-03-01 03:32:24 · 2078 阅读 · 0 评论 -
Java HashMap双花括号初始化数据的代码解析,及带来的问题分析
引言package com.azdebugit.test.collection;import java.util.HashMap;import java.util.Map;import java.util.Set;public class TestHashMap { public static void main(String[] args) { Map Man = new HashMap<Integer, Integer>(){原创 2021-02-21 18:40:58 · 2289 阅读 · 0 评论 -
编写Gateway内部提供的ReadBodyPredicateFactory的继承过滤器工厂类 ,及解决MediaType逻辑的JSON请求参数里面带有%报错的问题,进而实现动态路由
前言在使用Spring Cloud Gateway的过程中,经常需要获取request body,比如用来做日志记录、签名验证、加密解密等等,Request的Body是只能读取一次的,如果直接通过在Filter中读取,而不封装回去回导致后面的服务无法读取数据。SpringCloud Gateway 内部提供了一个断言工厂类ReadBodyPredicateFactory,这个类实现了读取Request的Body内容并放入缓存,我们可以通过从缓存中获取body内容来实现我们的目的。解读ReadBo原创 2021-02-19 02:10:50 · 617 阅读 · 0 评论 -
用gif动画展示数据库设计三大范式及反范式的记忆技巧,及java后台代码的curd的正确操作姿势,及抽取重构代码技巧
用gif动画展示数据库设计三大范式及反范式的记忆技巧,及java后台代码的curd的正确操作姿势,及抽取重构代码技巧...原创 2021-02-15 00:34:43 · 620 阅读 · 3 评论 -
搭建fastdfs服务,及单机redis服务,springboot实现h5与fastdfs之间的断点续传,大文件上传,秒传文件和批量上传
前言搭建单机redis服务,结合fastdfs,springboot实现h5与fastdfs之间的断点续传,大文件上传,秒传。技术采用:webuploader+springboot+redis+fastdfs(服务端)+FastDFS_Client。本文所需实现工具,皆在此包中https://download.youkuaiyun.com/download/as4589sd/15086474fastdfs服务搭建先要安装gcc编译器:yum -y install gcc-c++下载https:原创 2021-02-06 19:28:46 · 4637 阅读 · 9 评论 -
spark对离线仓库数据库,如hive ,mongdb,hbase等中的特定敏感数据进行脱敏处理,及加解密的解决方案
前言在生产中,难免存在敏感数据,如姓名、职业、职务、年龄、血型、婚姻状况、宗教信仰、学历、专业资格、工作经历、家庭住址、电话号码(手机用户的手机号码)、身份证号码、信用卡号码、指纹、病史、电子邮件、网上登录账号和密码等等,在数据流通过程中,都需要进行数据脱敏,但又要大数据类业务不会受到脱敏的影响,达成脱敏前后的数据一致性和有效性。进行数据脱敏的方法很多,无非对数据进行加解密,若是数据量比较大,就需要离线处理。比如采用spark对离线仓库数据库,如hive ,mongdb,hbase等中的特定敏感数据原创 2021-01-25 23:25:34 · 1661 阅读 · 2 评论 -
采用Java的concurrent包里面的CountDownLatch具有原子操作的计数器,支持并发多线程操作
场景在高并发多线程的场景中,当一个任务想要往下执行,但必须要等到其他的多个任务执行完毕后,才可以继续往下执行,如何处理呢?可以试试,Java的concurrent包里面的CountDownLatch,具有原子操作的计数器,支持并发多线程操作。比如,T想要继续往下执行的任务(调用一个CountDownLatch对象B的await()方法),必须等到其他的任务T1,T2,T3执行完自己的任务后(其他的任务T1,T2,T3调用同一个CountDownLatch对象B的countDown()方法),T调原创 2020-12-24 20:40:31 · 314 阅读 · 1 评论 -
采用并发调用缓存输入输出流和缓存错误输出流,及回调函数来执行系统命令的封装类ShellExecUtil,及思考如何编写一个完美的工具类?
执行系统命令封装类ShellExec原创 2020-12-24 18:05:39 · 697 阅读 · 10 评论 -
采用UUID与Snowflake算法,按照时间自增排序生成唯一ID,使整个分布式系统内不会产生ID碰撞。
前言手动指定主键id的优点(不用id自增),缺点很明显,就是容易出现主键id冲突,当插入频率达到一定程度时,就会出现大量这种问题,一旦出现这种问题,入库就会失败,造成数据丢失(应用层可以做异常处理来避免数据丢失)。多人会想到使用UUID,UUID在唯一性上确实可以达到这个目的,但它也存在很大的缺陷:单一采用uuid优点:性能非常高:本地生成,没有网络消耗。单一采用uuid缺点:不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。 信息不安全:基于MAC原创 2020-12-21 20:43:51 · 1131 阅读 · 0 评论 -
常用java使用工具类EncrypDES,实现DES算法的加解密
前言DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。DES算法的原理1.所需参数key:8个字节共64位的工作密钥 data:8个字节共64位的需要被加密或被解密的数据 mode:DES工作方式,加密或者解密2.原理图示DES算法使用64位的密钥key,将64位的明文输入块,变为64位的密文输出块,并把输原创 2020-12-19 01:23:46 · 3946 阅读 · 1 评论 -
常用的调用API的工具类APIHttpClient,封装了开始时间,调用状态,返回时间,适合API的再开发
前言HttpClient是一个对多个请求配置了公共信息的容器。所有的请求通过一个HttpClient进行发送。HttpClients是不可变的,通过HttpClient的newBuilder()创建返回。请求Builders被HttpRequest#newBuilder()来创建。APIHttpClient是封装org.apache.http.client.HttpClient下的类,来实现的。调用API的工具类APIHttpClientpom实体类package com.g原创 2020-12-18 19:07:01 · 473 阅读 · 1 评论 -
debug古老的Spring的XML配置代码,来看spring现在spring注解代码,及springaop、Advisor、Pointcut、Advice 和 Aspect之间的关系
前言Spring家族发展越来越大,估计10年内,还有很多人可以靠spring吃饭,spring之所以这么强大,集成IOC 容器和 AOP ,及Spring AOP依赖于 IOC 容器来管理,强大的向后兼容性。本博客通过该git进行debug,尝试梳理spring的IOC 容器和 AOP ,https://gitee.com/cosmosLearn/spring-aop-learning.gitAOP 术语Advice、Advisor、Pointcut、Aspect、Joinpoint 等..原创 2020-12-07 23:14:16 · 695 阅读 · 0 评论 -
spring中JAVA配置和注解配置能否全面代替XML配置?
前言Spring Boot是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。spring Boot采用约定大约配置的方式,大量的减少了配置文件的使用,而大量采用JAVA配置和注解配置。是否有了注解配置,我们就可以完全摒除原来 XML 配置的方式呢?注解配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的,(如 Service 使用了哪几个 D原创 2020-12-06 20:56:09 · 855 阅读 · 0 评论 -
在Java层面(window和Linux系统)下的常用性能监控与调优工具的命令及操作
前言总结,学习,发现问题,再总结,避免以后,在需要的时候抓狂!jvm中的gc的参数解释年轻代survivor(幸存区) S0C 年轻代中第一个survivor(幸存区)的容量(kb) S1C 年轻代中第二个survivor(幸存区)的容量(kb) 已使用 S0U 年轻代中第一个survivor(幸存区)目前已使用空间(kb) S1U 年轻代中第二个survivor(幸存区)目前已使用空间(kb) 年轻代中Eden(伊甸园)原创 2020-10-07 20:36:56 · 1073 阅读 · 0 评论 -
使用Java层面的工具定位问题及使用系统层面的工具定位堆外内存,排查Spring Boot引起的“堆外内存泄漏”的经验总结
背景为了更好地实现对项目的管理,我们将组内一个项目,迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常。笔者被叫去帮忙查看原因,发现配置了4G堆内内存,但是实际使用的物理内存竟然高达7G,确实不正常。JVM参数配置是-XX:MetaspaceSize=256M-XX:MaxMetaspaceSize=256M-XX:+AlwaysPreTouch-XX:ReservedCodeCacheSize=128m-XX:InitialCod原创 2020-10-04 23:01:44 · 283 阅读 · 0 评论 -
基于注解使用AOP,实现实时刷新Shiro 过滤器链,验证用户每次访问API接口权限
前言:后端接口的调用,必须受到用户权限的限制,对某个用户是否有权限访问该接口,其角色,部门,等都是影响因素,还有一个用户的状态,也是变化的等,需要做到每次调用接口,都要实时刷新一下,该用户是否有权限访问?步骤:从需求出发,既然是需要做到每次调用接口,都要实时刷新一下,该用户是否有权限访问?肯定要用注解!建自定义注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Refre原创 2020-06-04 18:39:21 · 659 阅读 · 0 评论 -
spring boot配置pom及assembly分离lib和resources及执行jar一起整合到tar.gz包,便于部署,及修改配置资源
前言由于项目中,要求配置太多,又涉及Java调用python等,要根据实际生产环境进行配置,不能像以前直接打个可执行jar完事,故考虑配置pom及assembly分离lib和resources及执行jar,便于部署,及修改配置资源。网上有很多参考资料,鱼龙混杂,反复配置修改,最终成功!工作目录修改pom.xml在pom.xml中,修改build配置项,根据自己的项目实际情况,进行适当修改!<build> <plugins> <plugin&原创 2020-05-31 14:06:18 · 1653 阅读 · 4 评论 -
Java项目生产环境部署,遇到FTP连接加密服务器的踩坑及爬坑过程
前言:由于项目当中的采集模块需要向第三方提供ftp服务器,采集所需数据,另外,由于之前该Java项目代码已经在其他项目都可以跑通,故Java项目代码是现成的!问题:1. 系统的ftp程序无法连接远程的服务器【问题重现】:530 Non-anonymous sessions must use eneryption.【系统报错】:FTPConnectClosedException:Connection closed without indication.2. 在解决问题1后,系统无法对原创 2020-05-23 02:00:58 · 1411 阅读 · 1 评论 -
请求接口访问的枚举定义,及响应返回调用结果的Java代码设计
前言在java开发中,避免不了,接口调用,及异常处理,如何处理简单简洁处理,是一个不大不小的问题ResponseEnum枚举类package com.j20200424.test;public enum ResponseEnum { RP_100("100", "请求成功"), RP_400("400", "请求参数为空"), RP_401("401", ...原创 2020-04-24 19:27:53 · 1014 阅读 · 2 评论 -
File.delete有些文件不能删除,而Files.delete(path)可以,进行深入探究其原因
最近更换deepin系统,在其上做项目,发现运行Java程序,File.delete有的目录下的文件,不能删除,有的能删除,反复对比文件属性及操作权限,均不得其解,最后发现采用Paths和Files得到解决!网上解决方案一一验证...原创 2020-04-24 17:22:02 · 2046 阅读 · 0 评论