自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java的UUID使用

System.out.println("格式前的UUID : " + UUID.randomUUID().toString());System.out.println("格式化后的UUID :" + getUUID());生成出来的结果是:ae3c33ad-1f28-4a93-9320-c912f46171fc。鉴于我们一般用作ID的话,不带中间的"-",所以我们将中间的"-"去除。最后生成出来的是长度为32的16进制无序唯一字符序列。进一步封装成UUID工具类UUIDUtil。

2024-01-15 16:00:01 493

原创 ThreadPoolExecutor中的keepAliveTime详解

(2)当wc(当前工作者数量)大于 最大线程数 或 空闲线程的空闲时间大于keepAliveTime(timed && timeout),以及wc>1或(workQueue)任务队列为空时,会进入compareAndDecrementWorkerCount方法,对wc的值减1。重新设置线程池的keepAliveTime属性,如果发现将要设置的值比原来的keepAliveTime值要小(即减小keepAliveTime),则触发interruptIdleWorkers(),中断空闲线程。

2024-01-05 16:13:10 999

转载 基于幂等表思想的幂等实践

极端情况下,如果插入幂等记录成功,并且正常执行了业务流程,此时更新幂等状态为success时出现异常(比如存储幂等记录的存储介质宕机了),此时是否需要处理该异常,还是说抛出异常中断流程?如果用户存在则幂等处理。比如:消费MQ消息时,为了避免消息重复消费,消费消息前可以先插入一条幂等记录,然后再执行消费逻辑,消费完成后修改幂等记录的幂等状态为消费成功!2、可靠:不仅仅在正常运行的情况下要保证幂等的可靠性,在某些异常场景下也要尽量保证幂等的可靠性,否则该幂等设计的意义将大打折扣。【幂等表 + 幂等状态机】

2024-01-03 17:26:31 60

原创 java线程池ThreadPoolExecutor详解

创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等,threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号)当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize。线程池所允许的最大线程个数。

2024-01-02 21:29:50 858

原创 Redis常用命令

: 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score。在有序集合中保留了不能有重复成员的特性,但其中的成员是可以排序的,每一个元素都会关联一个double类型的分数(score)作为排序依据,score相同时按字典顺序排序。字符串类型是Redis最基础的数据结构,其它的几种数据结构都是在字符串类型基础上构建的,字符串的值可以是:字符串、数字、二进制,但其值最大不能超过512M。

2024-01-02 18:04:33 820

原创 Redis数据结构(常用5+4种特殊数据类型)

我画了一张 Redis 数据类型和底层数据结构的对应关图,左边是 Redis 3.0版本的,也就是《Redis 设计与实现》这本书讲解的版本,现在看还是有点过时了,右边是现在 Redis 7.0 版本的。String 类型的底层的数据结构实现主要是 SDS(简单动态字符串)。List 类型的底层数据结构是由。Hash 类型的底层数据结构是由。Zset 类型的底层数据结构是由。Set 类型的底层数据结构是由。String 类型内部实现。List 类型内部实现。Hash 类型内部实现。Set 类型内部实现。

2023-12-25 21:01:31 962

原创 Redis基本介绍和使用场景

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。除此之外,Redis 还支持。

2023-12-25 20:01:28 963

原创 Redis过期删除策略和内存淘汰策略

通过上面的介绍,相信大家对Redis的过期数据删除策略和内存淘汰策略有一定的了解了。这里总结一下:Redis过期删除策略是采用惰性删除和定期删除这两种方式组合进行的,惰性删除能够保证过期的数据我们在获取时一定获取不到,而定期删除设置合适的频率,则可以保证无效的数据及时得到释放,而不会一直占用内存数据。但是我们说Redis是部署在物理机上的,内存不可能无限扩充的,当内存达到我们设定的界限后,便自动触发Redis内存淘汰策略,而具体的策略方式要根据实际业务情况进行选取。

2023-12-25 18:08:31 924

原创 如何在生产环境正确使用Redis

因此,合理控制n的大小,避免复杂度过高的操作,是保持JIMDB服务的稳定性和可用性的重要考虑因素。:创建JIMDB集群时结合业务场景选择合适的淘汰策略,如volatile-lru(设置了过期时间的Key按照lru进行逐出)、allkeys-lru(所有Key按照lru进行逐出)、noeviction(不淘汰数据,但写入会失败)等,确保高效利用有限资源,同时提高缓存命中率。集群,确保业务间的隔离性,以便更容易定位和解决潜在的问题,提高系统的稳定性和可维护性。集群,通过双写的形式满足更高的高可用需求。

2023-12-25 16:39:18 593

原创 Redis 大/热Key故障处理流程

应用持续访问又大又热的key,会造成Redis实例CPU高、流量被打满、数据在内存积压,甚至导致实例达到配额限制被oom-kill。在异步调用、pipeline、mget等批量调用场景比较常见。大key分为两种情况。

2023-12-25 16:16:14 607

原创 java 反射相关API使用

Java-反射

2023-12-04 19:48:35 385

原创 软件架构度量

稳定性是指改变的难易程度,对于希望类足够稳定的类,要控制依赖其他类的次数,提高被依赖的次数。圈复杂度用来评估函数的复杂度,如果函数圈复杂度过高,表明函数有太多的决策变量,逻辑拆分不够,难以理解和维护。超大函数处理太多业务,职责不单一,业务耦合严重,不利于扩展和维护。超大类处理太多业务,职责不单一,业务耦合严重,不利于扩展和维护。调用链越长,组件间依赖深度越大,依赖关系越复杂,排查问题越难。对于一些公共功能,没有抽象组件,复制粘贴代码,维护难度大。基础设施资源,数据库,缓存的使用量。

2023-01-09 11:44:45 569

原创 实战字节码-01-基础知识

字节码开发并不需要太多储备知识,虽然总共有200多种指令,但其实主要就分为存取(load/store)、运算(add)、跳转(jump)、调用(invoke)、常量(ldc)、异常(try-catch-finally)这几大类,每种类型理解一个就可以以此类推其他的,比如加载int类型用iload指令,加载对象类型用aload指令,大部分指令都是不同类型的重载而已。JVM是基于栈技术实现的虚拟机,源代码被编译成字节码指令后,所有指令都按照入栈、出栈的方式执行,栈顶永远是当前正在执行的指令。

2023-01-06 19:47:13 384

原创 Java - JIT即时编译

在程序运行期间,JVM 将这些热点代码编译为与本地平台相关的机器码,并进行各层次的优化,从而提升热点代码的执行效率。Java前端编译器:javac 编译,在程序运行前,将 源文件 转化为 字节码 即 .class 文件。即计数器的阈值,默认为10000,即方法计数器和回边计数器的总和达到了10000就触发 JIT 编译。-XX:FreqInlineSize=325byte:频繁调用的方法能被内联的最大字节码大小。将方法的代码复制到发起调用的方法里,以消除方法调用。

2023-01-06 17:45:17 361

转载 etcd:从应用场景到实现原理的全方位解读

在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。收集器通常是按照应用(或主题)来分配收集任务单元,因此可以在 etcd 上创建一个以应用(主题)命名的目录 P,并将这个应用(主题相关)的所有机器 ip,以子目录的形式存储到目录 P 上,然后设置一个 etcd 递归的 Watcher,递归式的监控应用(主题)目录下所有信息的变动。

2023-01-06 17:16:58 272

原创 Java基础五大机制 —— SPI机制基础(一)

Java SPI 的实现流程。

2022-11-22 16:02:27 1678

原创 京东神灯文档:JVM参数GC线程数ParallelGCThreads合理性设置

过多的GC线程数抢占了业务线程的CPU时间,加上线程切换的开销,较大的降低了吞吐量。JVM会使用特定的GC收集线程,当GC开始的时候,GC线程会和业务线程抢占CPU时间,吞吐量定义为CPU用于业务线程的时间与CPU总消耗时间的比值。为了安全的垃圾回收,在GC或者GC某个阶段,所有业务线程都会被暂停,也就是STW(Stop The World),STW持续时间就是停顿时长,停顿时长影响响应速度,因此越小越好。这两个优化目标是有冲突的,在一定范围内,参与GC的线程数越多,停顿时长越小,但吞吐量也越小。

2022-11-21 15:59:52 400

原创 Java基础五大机制 —— 异常机制基础(一)

Java异常是一个描述在代码段中发生异常的对象,当发生异常情况时,一个代表该异常的对象被创建并且在导致该异常的方法中被抛出,而该方法可以选择自己处理异常或者传递该异常。异常指不期而至的各种状况,如:文件找不到、网络连接失败、除0操作、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误;如果你用,那么你是因为你用0做了除数,会抛出的异常。

2022-11-18 15:36:18 94

原创 Java基础五大机制 —— 泛型机制解析(二)

原始类型就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型,无论何时定义一个泛型,相应的原始类型都会被自动提供,类型变量擦除,并使用其限定类型(无限定的变量用Object)替换。看一个例子}}}因为在Fruit中,T是一个无限定的类型变量,所以用Object替换,其结果就是一个普通的类,如同泛型加入Java语言之前的已经实现的样子。在程序中可以包含不同类型的Pair,如Fruit或Fruit

2022-11-16 16:22:33 190

原创 Java基础五大机制 —— 泛型机制解析(一)

说明一下,定义泛型方法时,必须在返回值前边加一个,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。Class的作用就是指明泛型的具体类型,而Class类型的变量c,可以用来创建泛型类的对象。为什么要用变量c来创建对象呢?既然是泛型方法,就代表着我们不知道具体的类型是什么,也不知道构造方法如何,因此没有办法去new一个对象,但可以利用变量c的newInstance方法去创建对象,也就是利用反射创建对象。泛型方法要求的参数是Class类型,而。

2022-11-15 16:16:53 231

原创 Java基础(一)—— Java概述

Java 编程语言的风格十分接近C++语言。继承了 C++ 语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。在 Java SE 1.5 版本中Java又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

2022-11-03 16:00:28 421

原创 java多线程详解(二)之创建线程的方式

实现Runnable接口创建的线程,ThreadNameThread-1线程状态stateRUNNABLE线程的上下文类加载器sun.misc.Launcher$AppClassLoader@b4aac2线程Id10线程所属分组java.lang.ThreadGroup[name=main,maxpri=10]线程的优先级5。从结果上可以看到,线程执行的顺序是随机的,只要不改变最终的结果,执行的顺序可以进行调整的。2、getState()获取当前线程的运行状态。......

2022-07-22 11:24:39 253

原创 Java之多线程(一)—技术简介

进程(process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 例如上图所示,当通过windows打开任务管理时,你所有正在使用的软件都会对应一个进程。无论是看不到的,还是看的到的程序,都会有一个进程。 现在操纵系统在运行一个程序时,比如:在Wind

2022-07-12 17:49:20 335

原创 二叉树之层序遍历

遍历规则:二叉树的层次遍历就是按照从上到下每行,然后每行中从左到右依次遍历,得到的二叉树的元素值。思路:对于层次遍历,我们通常会使用队列来辅助:因为队列是一种先进先出的数据结构,我们依照它的性质,如果从左到右访问完一行节点,并在访问的时候依次把它们的子节点加入队列,那么它们的子节点也是从左到右的次序,且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点具体做法: 代码:...

2022-06-29 18:15:28 836

原创 二叉树之后序遍历(非递归)

遍历规则:优先访问根节点的左子树的全部节点,然后再访问根节点的右子树的全部节点,最后再访问根节点。对于每棵子树的访问也按照这个逻辑,因此叫做“左右根”的顺序。思路:既然二叉树的前序遍历和中序遍历都可以使用栈来代替递归,那后序遍历是否也可以呢?答案是可以的,但是会比前二者复杂一点点。根据后序遍历“左右中”的顺序,那么后序遍历也与中序遍历类似,要先找到每棵子树的最左端节点:然后我们就要访问该节点了嘛?不不不,如果它还有一个右节点呢?根据“左右根”的原则,我还要先访问右子树。我们只能说它是最左端的节点,它左

2022-06-29 17:38:18 2771 1

原创 二叉树之中序遍历(非递归)

二叉树中序遍历遍历方式:优先访问它的左子树,等到左子树全部节点都访问完毕,再访问根节点,最后访问右子树。同时访问子树的时候,顺序也与访问整棵树相同。口诀:根左右。思路:与前序遍历类似,我们利用栈来代替递归。如果一棵二叉树,对于每个根节点都优先访问左子树意味着:从根节点开始不断往左,放进栈中,直到没有左节点,那么第一个被访问的一定是最左的节点。然后访问该节点的右子树,最后向上回到父问题。因为每次访问最左的元素不止对一整棵二叉树成立,而是对所有子问题都成立,因此循环的时候自然最开始都是遍历到最左,然后访问

2022-06-29 16:56:47 2023

原创 二叉树之前序遍历-非递归

口诀:根左右知识点:栈栈是一种仅支持在表尾进行插入和删除操作的线性表,这一端被称为栈顶,另一端被称为栈底。元素入栈指的是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;元素出栈指的是从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。思路:我们都知道递归,是不断调用自己,计算内部实现递归的时候,是将之前的父问题存储在栈中,先去计算子问题,等到子问题返回给父问题后再从栈中将父问题弹出,继续运算父问题。因此能够递归解决的问题,我们似乎也可以用栈来试一试。根据前序遍历“根左右

2022-06-29 16:46:54 3084

原创 数据结构之二叉树

1、基本概念:树就是一种类似现实生活中的树的数据结构(倒置的树)。任何一颗非空树只有一个根节点。2、一棵树具有以下特点:3、树的形状如下图所示: 4、区别: 层数:从根节点开始算,为第一层。 高度:从最下面的叶子节点开始算,且从0开始计数。 深度:从根节点开始算,从0开始计数。树的基本名词解释:二叉树(Binary tree)是每个节点最多只有两个分支(即不存在分支度大于 2 的节点)的树结构。二叉树 的分支通常被称作“左子树”或“右子树”。并且,二叉树 的分支具有

2022-06-27 17:28:17 5711

原创 Volatile关键字

一、Volatile关键字说明Volatile是Java提供的轻量级同步工具,它能保证可见性和做到禁止指令重排做到有序性,但是它不能保证原子性,如果你的程序必须做到原子性的话,那么可以考虑使用JUC的原子包下的原子类或者加锁的方式来保证,但是我们假设如果使用volatile来修饰共享变量,那么它能够保证的是一个线程对它所修饰的变量进行更改操作后总是能对其他线程可见,如下:对于如上代码,虽然我们对成员变量i使用volatile修饰,意味着,对于执行addOne()方法的任意线程来说,看到这个变量的值是一

2022-06-23 17:18:56 281

原创 Java 反射详解(二)

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的法的功能称为java语言的反射机制。 通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)通过反射机制可以操作代码片段。(class文件。) .class说明:在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。J

2022-06-22 21:41:27 159

原创 JVM之Java字节码(.class)文件详解

我们在使用IDEA工具编写java代码时,当执行程序时,IDEA会使用JDK帮我们执行编译命令,在target目录下生成对应的.class文件,为了加深对.class文件的理解。写了这篇文章,加深对字节码文件的理解。编译前: 执行程序后:这一步操作,就是将.java文件编译成JVM可执行的.class文件,也叫做字节码文件。 在 Java 中,JVM 可以执行的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过

2022-06-17 16:54:04 4066 1

原创 Java对象拷贝的那些事以及必坑指南

在工作中经常会涉及到对象的复制和拷贝。特别是在调用外部的RPC接口时,经常不会直接使用调用结果的dto,而是按照需要自己定义的需要的字段,包装成新的dto,用于后续的业务,进行逻辑处理。在这中间就涉及到对象复制的问题。不仅仅局限于调用远程接口,在实际的开发中的一些增删改查操作,也涉及到对对象复制的操作。总之,对象复制是在工作中非常常用的一个操作。需要我们重视。 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的

2022-06-06 17:52:50 713 1

原创 SpringIOC的引入

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。一、分享Iteye的开涛对Ioc的精彩讲解  首先要分享的是Iteye的开涛这位技术牛人对Spr...

2021-08-24 10:27:19 96

原创 MAVEN中项目构建的一些概念和思想

一、Maven的基础知识回顾 官网的英文介绍:Maven, a Yiddish word meaning accumulator of knowledge, began as an attempt to simplify the build processes in the Jakarta Turbine project. There were seve...

2019-08-18 16:14:08 408

原创 java精确除法运算(BigDecimal)

一、BigDecimal介绍Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.  其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.  BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDeci......

2019-08-12 10:01:28 61018

原创 Java基础5大机制——反射机制详解(一)

一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.下面是详细说明:...

2019-08-09 16:07:25 550 1

原创 UML类图详解

一、前言在软件开发过程中会经常整理文档,不是所有的信息都可以通过文字来表达,而换成图之后会更加的直观、有效,其中频繁使用的就是UML图。结合自己实践总结一下,希望对大家都能有所帮助。本文中的UML图都是用visio 绘制,source code展示是Java 语言二、UML简介Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于199...

2019-08-08 10:15:45 357

原创 详解Class.forName和ClassLoader

一、问题产生这本来是工作上的一个需求:将两个domain对象的字段进行适配,这两个实体类都是根据数据库表的映射,我要做的就是将这两个对象中的字段几个进行映射。虽然有的字段的方法名是一样的但有好多是不同的(其中set/getXxx()都是自动生成的),所以我想先写一个方法将那些同名的字段过滤出来,这样大概率能保证映射的正确性。为了拿到这些类对象对应的属性名我想到了用Class.forName获取...

2019-08-07 14:07:18 368

原创 关于Android开发的几个小知识

一.v4包与V7及V13包的区别1.android-support-v4 是谷歌推出的兼容包,最低兼容Android1.6的系统,里面有类似ViewPager等控件。ViewPager在Android 1.6以下的版本是不自带的,所以要实现ViewPager需要使用v4包中的ViewPager。其余控件类似。Gradle引用方法:compile 'com.android.support:suppo...

2018-05-23 14:00:27 150

转载 如何正确导入github上的项目

具体做法:第一步 下载一个Demo,先打开每个 module下的 gradle 文件,即 app 目录下的 build.gradle 以及各个 library 下的 build.gradle ,首先查看 compileSdkVersion 和 buildToolsVersion,因为有些时候你本地的版本和下载的版本不一致,那么就会导致失败。项目的gradle 第三方库的gradle 打开本地的项目...

2018-05-07 11:11:27 4654

空空如也

空空如也

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

TA关注的人

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