自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ThreadLocal如何避免内存泄漏

是 Java 中的一个线程本地存储机制,它允许每个线程拥有一个独立的本地存储空间,用于存储该线程的变量。提供了一种简单的方式来解决多线程环境下共享变量的问题,避免了在多线程环境下出现的线程安全问题。欢迎关注个人公众号【好好学技术】交流学习虽然ThreadLocal可以解决线程安全问题,但是在使用完之后需要手动清除,以避免线程重用时引起的内存泄漏问题。

2023-05-26 15:20:36 229 1

原创 kettle7.1的基本使用总结

Kettle是一款国外开源的ETL工具,纯java编写,可以在Windows、Linux、Unix上运行,数据抽取高效稳定。Kettle家族目前包括4个产品:Spoon、Pan、CHEF、Kitchen。SPOON允许你通过图形界面来设计ETL转换过程(Transformation)。PAN允许你批量运行由Spoon设计的ETL转换 (例如使用一个时间调度器)。Pan是一个后台执行的程序,没有图形界面。CHEF允许你创建任务(Job)。

2023-05-25 15:58:21 334

原创 ForkJoin详解

Fork/Join框架是Java 7提供的一种用于并行执行任务的框架,它将大任务分解为若干个小任务,并行执行这些小任务,最终通过合并每个小任务的结果得到大任务的结果。Fork/Join采用的是分而治之的基本思想,分而治之就是将一个复杂的任务,按照规定的阈值划分成多个简单的小任务,然后将这些小任务的结果再进行汇总返回,得到最终的任务。必须首先创建一个ForkJoinTask对象。在分发任务时,需要注意线程安全问题,防止多个线程同时访问共享资源。

2023-05-24 10:15:52 537

原创 springboot集成规则引擎drools

规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模板编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。欢迎关注个人公众号【好好学技术】交流学习drools是一款由JBoss组织提供的基于java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。Drools中文网 | 基于java的功能强大的开源规则引擎。

2023-05-23 15:55:57 1525 3

原创 springboot+MDCAdapter自定义starter实现日志全链路追踪

MDC(Mapped Diagnostic Context,映射调试上下文)是日志系统提供的一种方便在多线程条件下记录日志的功能一个常用的场景就是Web服务器中给每个请求都分配一个独特的请求id,所有的日志都会打印这个请求id,这样一个请求下的所有日志信息都可以很方便的找到。MDCAdapter其实就是做一些简单的kv操作整体结构TtlMDCAdapter重构{@link LogbackMDCAdapter}类,搭配TransmittableThreadLocal实现父子线程之间的数据传递新建包org

2023-05-22 11:26:30 1481

原创 springboot集成skywalking8.5

负责接收skywalking-agent发送过来的Tracing数据信息,Analysis Core对这些数据信息进行分析,把分析的数据存储到外部的存储器当中,Query Core提供查询数据的功能。中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/下载地址: https://skywalking.apache.org/downloads/官网:https://skywalking.apache.org/

2023-05-18 09:21:57 307

原创 springboot项目部署到k8s上

可以看到serviced的ip为10.96.10.79 对外端口为 31921,安全组需开放该端口才能访问。登录私有仓库需要创建secret,存储docker registry的认证信息。快速创建一个deployment,导出yaml文件。到这里我们服务部署就算完成了,看一下所有的节点。创建好之后,后续需要挂载到pod上。修改k8sdemo.yaml文件。

2023-05-06 15:38:02 226

原创 springboot构建docker镜像并推送到阿里云

springboot构建docker镜像并推送到阿里云镜像仓库

2023-05-05 09:10:51 475

原创 k8s常见组件详解

Pod是Kubernetes中最小的单元,它由一组、一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容器可以使同一个Pod里面的多个容器共享存储、网络、PID、IPC欢迎关注个人公众号【好好学技术】交流学习。

2023-04-27 13:43:04 426

原创 springboot整合rabbitmq实现延迟队列

简单点说就是消息百分百发送到消息队列中。我们可以开启confirmCallback生产者投递消息后,mq会给生产者一个ack.根据ack,生产者就可以确认这条消息是否发送到mq.开启confirmCallback修改配置文件#NONE:禁用发布确认模式,是默认值,CORRELATED:发布消息成功到交换器后会触发回调方法 spring : rabbitmq : publisher-confirm-type : correlated测试代码/**

2023-04-25 14:23:54 161

原创 Rabbitmq入门

Producter生产者创建message消息,然后投递到mq中Message消息生产者生产的消费内容,有消息头和消息体,包含多个属性配置,比如RoutingKey路由键等。RoutingKey路由键生产者发送消息到交换器时,需要指定一个RoutingKey,用来指定消息的路由规则。RoutingKey最大长度为255字节。Exchange交换器生产者将消息发送到Exchange,交换器将消息路由到一个或者多个队列中。交换机和队列是多对多的关系。Queue队列用于存储消息。

2023-04-23 19:36:41 102

原创 分布式限流框架sentinel

前两篇文件介绍了四种常见服务限流算法解析和RateLimiter+AOP自定义注解限流。我们通过自定义注解可以对我们的服务进行保护,但是这样的实现方式有没有需要完善的地方呢?

2023-04-16 11:28:44 382

原创 RateLimiter+AOP自定义注解限流

pom.xml引入guava依赖</</</<//*** 限流注解/*** 不进行限流/*** qps (每秒并发量)/*** 超时时长,默认不等待/*** 超时时间单位,默认毫秒/*** 返回错误信息*/ String msg() default "系统忙,请稍后再试";

2023-04-14 10:46:28 398

原创 四种常见服务限流算法解析

限定固定请求数量访问服务端,保护服务接口欢迎关注个人公众号【好好学技术】交流学习定义一个单位时间(如1秒钟)的阈值,每收到一次请求,增加一次计数。判断 请求总数 <= 当前单位时间内的阈值,则执行正常流程如果请求总数 > 当前单位时间内的阈值, 则触发限流处理进入到下一个单位时间,计数清零,开始新一轮的计数将单位时间划分为多个时间区间每个时间区间内,每有一次请求计数就加1单位时间内的所有时间区间的请求计数之和,就是整个滑动窗口的请求总数。

2023-04-07 09:55:50 176

原创 redis集群数据存储方式

redis集群就是借鉴了hash一致性算法,16384个哈希槽,就是对应的16384个虚拟节点。新增节点时,就是对这些哈希槽重新分配,影响的数据量就为集群数量分之一。

2023-04-05 17:58:50 855

原创 redis之缓存淘汰策略

我们set key的时候,都可以给一个expire time,就是过期时间。如果假设你设置一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?redis内存满了之后会发生什么事情呢?生产上应该设置哪种缓存淘汰策略呢?好了,今天我们就来讲讲redis的缓存淘汰策略。

2023-04-03 11:27:34 1795

原创 redis之分布式锁详解

我们都知道分布式环境下要使用分布式锁才行。那么分布式锁都需要有哪些特点呢?单机redis怎么加锁?redis集群加锁有哪些坑呢?别急,下面我们一步步解开Redis分布式锁的面纱。

2023-03-30 18:05:48 196

原创 缓存穿透、雪崩、击穿详解

正常来讲,每次查询数据库时,都会先去缓存中查询是否存在,如果存在则返回,不存在则取查db。如果去查询数据库不存在的数据,则缓存肯定不存在,那么每次查询都要访问数据库,这就是缓存穿透。欢迎关注个人公众号【好好学技术】交流学习缓存雪崩是指在某一个时间段,缓存集中过期失效。是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。很多时候容易搞混缓存击穿和缓存穿透,其实只要记着缓存击穿的前提是先击中,才能穿透。

2023-03-30 10:04:10 70

原创 java实现布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出来的。它实际上是由一个很长的二进制数组+一系列hash算法映射函数,用于判断一个元素是否存在于集合中。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2023-03-29 10:56:09 123

原创 redis九大数据类型及场景案例实现

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多 种类型的数据结构,如 字符串(strings)、散列(hashes)、 列表(lists)、 集合(sets)、 有序集合(sorted sets)等。

2023-03-28 12:06:23 144

原创 jvm调优工具详解及调优实战

还不会jvm调优?快进来看看吧。详解如何利用调优工具进行调优,线上内存溢出,cpu飙高,系统卡顿如何解决?

2023-03-21 10:37:48 387 1

原创 jvm内存模型及垃圾回收机制

jvm内存模型,类加载器,垃圾回收算法和垃圾回收器。

2023-03-20 11:25:58 278

原创 java常见排序算法实现

列举java中比较常见的几种排序:冒泡排序、快速排序、插入排序、希尔排序、选择排序、归并排序以及基数排序。

2023-03-16 11:07:47 35

原创 java下一个排列

千里之,行始于足下如果大家有更好的解法或者疑问,欢迎留言一起交流学习。

2023-03-15 16:03:29 185

原创 java三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

2023-03-14 10:03:39 857

原创 java两数之和

算法对程序员而言重要吗?图灵奖获得者,Pascal之父尼克劳斯·维尔特曾经说过:程序 = 数据结构 + 算法。其实编程从本质上来说就是算法加上数据结构。然而现实生活中大部分工作很少会直接用到算法或数据结构,多数都是写CRUD或处理业务逻辑。即使完全不懂算法和数据结构,也可以把工作做好。所以对于初入门的程序员来说,算法和数据结构似乎是可有可无的。很多人算法的巅峰水平可能就是大学毕业的时候,随着工作年限增长,不常用的算法与数据结构知识基本就忘光了。但是矛盾的是面试中常常会碰到算法和数据结构。

2023-03-13 09:34:22 478

原创 java并发之多线程基础总结

当多个线程访问某个类,不管运行时环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的。----《并发编程实战》当多个线程共享同一个全局变量,做写的操作,可能会受到其他线程的干扰,发生线程安全问题。或者说:多线程并发访问时,得不到正确的结果。一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。volatile关键字仅仅保证可见性,并不保证原子性。

2023-03-09 10:39:26 48

原创 Spring之循环依赖

什么是循环依赖?很简单,A依赖了B,B依赖了A,在Spring中循环依赖就是一个问题了。spring中一个对象并不是简单new出来的。而是经过一系列的Bean的生命周期,就是因为bean的生命周期才会出现循环依赖问题。要搞明白spring的循环依赖,得先从bean的生命周期说起。

2023-03-08 16:15:36 118

原创 Spring之依赖注入原理

依赖注入是 spring 框架核心 IOC 的具体实现,也是面试常问的考点。

2023-03-07 14:05:27 1062

原创 Spring之Bean的生命周期

spring最重要的功能就是帮助我们创建对象,也就是IOC。启动spring就是为创建Bean对象做准备,所以我们必须先明白Spring到底是怎么去创建Bean的,也就是要先弄明白Bean的生命周期。

2023-03-06 12:09:00 199

原创 解决线程池本地变量问题,TransmittableThreadLocal详解

实际工作中可能会出现 父线程创建几个子线程并发执行任务,那么父线程的本地变量如何传递到子线程呢?

2023-03-03 15:23:40 320

原创 MySQL索引底层数据结构与算法

索引是帮助MySQL高效获取数据的排好序的数据结构。B+Tree通过把data不放在非叶子节点来增加度(小节点),从而一次IO可以查询出更多的索引数据,减少查询次数。并且,叶子节点之间会有指针,数据又是递增的,这使得我们范围查找可以通过指针连接查找,而不再从上面节点往下一个个找。可以看出B+树即减少了查询次数,又提供了很好的范围查找,对比二叉树、红黑树、B树都更适合作为MySQL的索引数据结构。MySQL也支持hash数据结构的索引。

2023-03-02 09:14:04 33

原创 RSA + AES对前后端数据进行加密

在前后端交互时,常常采取http方式进行传输,而明文传输通常会被网络抓包、反编译等手段得到htpp通讯接地址和参数等。为了确保信息的安全,在生产中使用了很多种加密手段。 最终采用 AES+RSA 组合进行接口参数加密和解密的方式脱颖而出,成为了当今主流手段。

2023-03-01 15:20:22 4472

原创 docker部署Prometheus+Grafana+node-exporter

Prometheus(普罗米修斯)是一个开源的系统监控和报警系统。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker。

2023-02-28 15:43:11 786

原创 spring@Value字符串类型转换为对象

工作中经常会碰到各种奇奇怪怪的需求,比如从配置文件读取出来的值转换为对象。

2023-02-28 15:09:07 641

空空如也

空空如也

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

TA关注的人

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