自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

如不來的博客

知幻即离,不假方便;离幻即觉,亦无渐次。

  • 博客(404)
  • 收藏
  • 关注

原创 记一次TheadLocal使用方式不正确导致内存泄漏问题的排查和修复过程

又再通过Jprofiler查看宕机时的线程的情况,定位到了出现问题的线程,然后查看代码,发现代码中有一个使用流的地方,但这个流在使用完之后没有关闭,就误以为是流未关闭导致的。代码的本意是想避免对象的多次反序列化,想将已经反序列化过的对象放在一个全局的Map里面,下次如果这个Map中已经有了该对象就直接从Map里面获取,若没有则先将该对象反序列化之后置入这个Map中,再从该Map中获取。在将内存溢出的dump文件导出之后,通过Jprofiler进行分析,发现HashMap对象占用的内存很大,而且一直在增加。

2023-10-20 18:26:48 247

原创 分账算法代码

【代码】分账算法代码。

2023-07-13 18:09:15 145

原创 Linux保留最近30天文件的shell脚本

结合crontab或supervisor使用,即可实现文件的定时清理。

2023-07-13 17:37:41 562

原创 Linux系统中Java进程守护脚本

配合Crontab或Supervisor使用。

2023-06-27 16:10:05 440

原创 Java中调用C或C++的so文件方法

Java调用C或C++的方法

2022-06-01 23:13:26 1006 2

原创 Netty22——用Netty实现RPC

一、RPC介绍 RPC(Remote Procedure Call)— 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序, 而程序员无需额外地为这个交互编程。两个或多个应用程序分布在不同的服务器上,它们之间的调用像是本地方法调用一样。 常见的 RPC 框架有:阿里的Dubbo、google的gRPC、Go语言的rpcx、 Apache的thrift,以及Spring 旗下的 Spring Cloud。 在RPC 中, Client 叫服务消费者,Serv

2022-03-17 00:27:45 1545 2

原创 Netty21——Netty中处理耗时任务的方式

 如果在 Netty 中做耗时的、不可预料的操作,比如数据库、网络请求等,会严重影响 Netty 对 Socket 的处理速度。解决方法就是将耗时任务添加到异步线程池中。但就添加线程池这步操作来讲,有2种方式: 在Handler 中加入线程池; 在Context 中添加线程池;一、在Handler中将任务加入线程池 将EchoServerHandler的channelRead()方法进行修改,该为异步的方式:@Sharablepublic class EchoServerHandler exte

2022-03-15 23:57:52 2499

原创 Netty20——Netty 核心组件 EventLoop 剖析

一、EventLoop的继承关系EventLoopGroup bossGroup = new NioEventLoopGroup(1); 在使用Netty时,上面的代码是必不可少的,即创建一个EventLoop对象,EventLoop的类继承关系如下: ①ScheduledExecutorService接口表示是一个定时任务接口,即EventLoop可以接受定时任务。 ②EventLoop接口:Netty接口文档说明了该接口的作用,一旦Channel注册了,就处理该Channel对应的所有IO操

2022-03-14 23:53:02 332

原创 Netty19——Netty心跳服务剖析

一、Netty连接的有效性检测 Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一个服务-----心跳机制(heartbeat)。通过心跳检查对方是否有效,这是 RPC 框架中必不可少的功能。下面我们分析一下Netty内部心跳服务的实现。 Netty 提供了 IdleStateHandler、ReadTimeoutHandler和WriteTimeoutHandler 三个检测连接的有效性的 Handler ,此处重点分析 IdleStateHandler。

2022-03-14 21:37:26 712

原创 Netty18——ChannelPipeline 调度 handler的剖析

 当一个请求进来的时候,ChannelPipeline 是如何调用内部的这些 handler 的呢? 当一个请求进来的时候,会第一个调用 pipeline 的 相关方法,如果是入站事件,这些方法由 fire 开头,表示开始管道的流动。从head节点开始,每个handler处理完成后,接着让后面的 handler 继续处理。一、ChannelPipeline调度Handler的过程 在DefaultChannelPipeline中有个fireChannelActive()方法,是请求入站的开始,源码如下

2022-03-10 22:46:45 425

原创 Mysql精华总结08——主从复制

十、主从复制 复制的基本原理:slave 会从 master 读取 binlog 来进行数据同步。 ①master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events; ②slave 将 master 的 binary log events 拷贝到它的中继日志(relay log); ③slave 重做中继日志中的事件,将改变应用到自己的数据库中。MySQL 复制是异步且是串行化的。10.1 复制的基本原则 1、每个 slave只有

2022-02-23 22:29:43 511

原创 Mysql精华总结07——分区、分库、分表

九、分区、分库、分表 9.1 MySQL分区  一般情况下我们创建的表对应一组存储文件,使用MyISAM存储引擎时是一个.MYI和.MYD文件,使用Innodb存储引擎时是一个.ibd和.frm(表结构)文件。当数据量较大时(一般千万条记录级别以上),MySQL的性能就会开始下降,这时我们就需要将数据分散到多组存储文件,保证其单个文件的执行效率。这么做有以下好处: 逻辑数据分割 提高单一的写和读应用速度 提高分区范围读查询的速度 分割数据能够有多个不同的物理文件路径 高效的保存历史数据  

2022-02-23 22:16:47 790 1

原创 Mysql精华总结06——MySQL调优

八、MySQL调优 8.1 影响mysql性能的因素1、业务需求对MySQL的影响(合适合度)2、存储定位对MySQL的影响 系统各种配置及规则数据 活跃用户的基本信息数据 活跃用户的个性化定制信息数据 准实时的统计信息数据 其他一些访问频繁但变更较少的数据 二进制多媒体数据 流水队列数据 超大文本数据 不适合放进MySQL的数据 需要放进缓存的数据3、Schema设计对系统的性能影响 尽量减少对数据库访问的请求 尽量减少无用数据的查询请求4、硬件环境对系统性能的影响 

2022-02-21 23:33:42 781

原创 Mysql精华总结05——Mysql锁机制

七、MySQL锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。数据库锁机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问时变得有序所设计的一种规则。 打个比方,我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么如何解决是你买到还是另一个人买到的问题?这里肯定要用到事物,我们先从库存表中取出物品数量,然后插入订单,付款后插入付款表信息,然后

2022-02-21 09:58:52 494

原创 Mysql精华总结04——事务

六、MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务。 6.1 ACID — 事务基本要素  事务是由一组SQL语句组成的逻辑处理单元,具有4个属性,通常简称为事务的ACID属性。  A (Atomicity) 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会

2022-02-17 16:57:01 622

原创 Mysql精华总结03——查询

五、MySQL查询 1、count(*) 和 count(1)和count(列名)的区别?  执行效果上:count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL的列;count(1)包括了所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL的列;count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。  执行效率上:列名为主键,count(列名)会

2022-02-17 15:35:26 100

原创 Mysql精华总结02——索引

四、索引 MYSQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。所以说索引的本质是:数据结构。 索引的目的在于提高查询效率,可以类比字典、 火车站的车次表、图书的目录等。 可以简单的理解为“排好序的快速查找数据结构”,数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 左边的数据表,一共有两列七条记录,最左边的是数据记录的物理地址。为了加快Col2

2022-02-09 16:18:35 904

原创 Mysql精华总结01——架构、存储引擎和数据类型

一、Mysql架构 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。 连接层:最上层是一些客户端和连接服务。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证.

2022-02-09 15:15:57 2180

原创 Netty17——Pipeline、Handler和HandlerContext的创建

 Netty中的ChannelPipeline、ChannelHandler和ChannelHandlerContext是非常核心的组件。一、三者间的关系 每当ServerSocket创建一个新的连接,就会创建一个Socket,对应的就是一个目标客户端;每一个新创建的Socket都会分配一个全新的ChannelPipeline;每个ChannelPipeline内部都含有多个ChannelHandlerContext,这些ChannelHandlerContext组成了一个双向链表,用于包装我们调用ad

2022-01-04 21:44:47 477

原创 Docker09——本地镜像发布到阿里云

一、本地镜像发布到阿里云流程二、镜像的生成方法 镜像有两种生成方式:  ①前面自己编写的Dockerfile  ②直接从容器创建一个新的镜像docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]   OPTIONS说明:-a :提交的镜像作者-m :提交时的说明文字三、将本地镜像推送到阿里云 1、本地镜像素材原型 2、阿里云开发者平台(https://dev.aliyun.com/search.html) 3、创建仓库镜像:选择或填

2021-12-31 17:01:34 270

原创 Docker08——常用安装示例

一、总体步骤 搜索镜像->拉取镜像->查看镜像->启动镜像->停止容器->移除容器->删除镜像二、安装tomcat 1、docker hub上面查找tomcat镜像docker search tomcat 2、从docker hub上拉取tomcat镜像到本地docker pull tomcat 3、docker images查看是否有拉取到的tomcat 4、使用tomcat镜像创建容器(也叫运行镜像)docker run -it -p 80

2021-12-31 16:46:52 827

原创 Docker07——镜像构建案例

一、Base(scratch)镜像 Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。二、案例 1、自定义镜像mycentos  ①编写Dockerfile   Docker Hub中默认的CentOS镜像的情况:登录后的目录为/;不支持vim和ifconfig命令   自定义mycentos使我们自己的镜像具有如下功能:登陆后的默认路径;vim编辑器;查看网络配置ifconfig支持。   编写Dockerfile文件:注意文件的名称必须

2021-12-31 15:33:10 1200

原创 Docker06——Dockerfile

一、DockerFile Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。 构建三步骤:  ①编写Dockerfile文件  ②docker build  ③docker run Centos的dockerfile如下:二、DockerFile构建过程...

2021-12-30 17:54:41 278

原创 Docker05——Docker容器数据卷

一、容器数据卷 Docker的理念是:将应用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们希望运行过程中产生的数据能被持久化;我们还希望容器之间希望有可能共享数据。 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。 为了能保存数据,在docker中我们使用卷。有点类似Redis里面的rdb和aof文件。 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件

2021-12-30 17:38:11 102

原创 Docker04——docker镜像

 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。 1、UnionFS(联合文件系统)  Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持将对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union

2021-12-30 15:44:35 165

原创 Docker03——常用命令

一、帮助命令 1、docker version 2、docker info:查看docker中的容器、镜像、版本等的基础信息 3、docker --help:命令帮助详情二、镜像命令 1、docker images:列出本地主机上的镜像  REPOSITORY:表示镜像的仓库源  TAG:镜像的标签  IMAGE ID:镜像ID  CREATED:镜像创建时间  SIZE:镜像大小 注意:同一仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用 REPOSITORY:TAG

2021-12-29 17:57:50 404

原创 Docker02——Docker的安装

一、系统版本要求 Docker支持以下的CentOS版本:  CentOS 7 (64-bit)  CentOS 6.5 (64-bit) 或更高的版本二、Docker的基本组成 1、镜像(image)  Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。  镜像和容器的关系类似于面向对象中类和对象的关系:Docker面向对象镜像类容器对象 2、容器(container)  Docker

2021-12-29 17:00:16 413

原创 Dokcer01——Docker简介

一、Docker的出现 一款产品从开发到上线,从操作系统到运行环境,再到应用配置,期间很多配置信息需要开发和运维之间的协作沟通。这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代,不同版本环境的兼容,对运维人员都是考验。 Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。 环境配置如此麻烦,换一台机器,还要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除

2021-12-29 15:34:02 87

原创 Kafka11——Kafka监控

 Kafka Eagle启动步骤如下: 1、修改kafka的服务端启动脚本  将kafka-server-start.sh命令中的如下代码:if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"fi  修改为:if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="server -Xmx2G -Xms2G -XX:P

2021-12-27 10:01:59 1199

原创 Kafka10——自定义Interceptor和流式计算

一、拦截器原理 Producer 拦截器(interceptor)是 Kafka 在 0.10 版本被引入的,主要用于实现 clients 端的定制化控制逻辑。 对于 producer 而言,interceptor 使得用户在消息发送前以及 producer 回调逻辑前有机会对消息做一些定制化需求,比如修改消息等。同时,producer 允许用户指定多个 interceptor 按序作用于同一条消息从而形成一个拦截链(interceptor chain)。Intercetpor 的实现接口是 org.a

2021-12-24 13:36:21 1333

原创 Kafka09——Kafka的API

一、Producer API 1、消息发送流程  Kafka 的 Producer 发送消息采用的是异步发送的方式。在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程,以及一个线程共享变量——RecordAccumulator。main 线程将消息发送给 RecordAccumulator,Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka broker。  相关参数:   batch.size:只有数据积累到 batch.size

2021-12-23 17:29:01 116

原创 Kafka08——kafka的事务

 Kafka 从 0.11 版本开始引入了事务支持。事务可以保证 Kafka 在 Exactly Once 语义的基础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。一、Producer 事务 为了实现跨分区跨会话的事务,需要引入一个全局唯一的 Transaction ID,并将 Producer 获得的PID 和 Transaction ID 绑定。这样当 Producer 重启后就可以通过正在进行的 Transaction ID 获得原来的 PID。 为了管理 Transaction,

2021-12-23 10:32:57 2277

原创 Netty16——接收请求过程分析

 服务器启动后肯定是要接收客户端请求并返回客户端想要的数据的。那么Netty服务端在启动之后是如何接收客户端请求的呢? 服务端启动之后,最终会注册一个 Accept 事件等待客户端的连接。NioServerSocketChannel 将自己注册到了 bossGroup线程池(reactor线程)上,也就是EventLoop(实际类型为NioEventLoop)上。在上一节《Netty启动过程分析》的末尾,我们有提到 NioEventLoop,其中有个run()方法,源码如下:@Overrideprot

2021-12-23 00:05:40 1307

原创 Kafka07——zookeeper在kafka中的作用

 kafaka集群中的 Broker 和 Consumer 都需要连接 Zookeeper,而 Producer 则直接连接 Broker。zookeeper在kafka中的作用如下: 1、Broker的注册  Broker是分布式部署的,并且相互之间是独立的。但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper。在Zookeeper上会有一个专门用来进行Broker服务器列表记录的节点:/brokers/ids  每个Broker在启动时,都会到Zook

2021-12-22 17:24:11 525

原创 Kafka06——高效读写数据

一、写数据(生产数据-顺序写磁盘) Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。二、读数据(消费数据) Kafka 高吞吐量的其中一个重要功臣就是“零拷贝”。从字面上理解就是数据不需要多次拷贝,系统性能大幅度提升。其实,不仅在kafka中,Java NIO,netty,rocketM

2021-12-22 16:44:46 1000

原创 Kafka05——消费者

一、消费方式 consumer 采用 pull(拉)模式从 broker 中读取数据。 push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成 consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以根据 consumer 的消费能力以适当的速率消费消息。 pull 模式不足之处是,如果 kafka 没有数据,消费者可能会陷入循环中,一直返回空数据。针对这一点,Kafka

2021-12-21 08:39:45 350

原创 Kafka04——生产者

一、分区策略 1、分区的原因  ①方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic 又可以由多个 Partition 组成,因此整个集群就可以适应任意大小的数据了;  ②可以提高并发,因为可以以 Partition 为单位进行读写; 2、分区的原则  我们需要将 producer 发送的数据封装成一个 ProducerRecord 对象,ProducerRecord 类中提供了如下 6 种构造:public ProducerRecord(@NotNu

2021-12-20 10:17:46 849

原创 Kafka03——Kafka 工作流程及文件存储机制

 Kafka 中消息是以 topic 进行分类的,生产者生产消息、消费者消费消息,都是面向 topic 的。 topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到该 log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。 该文件可.

2021-12-17 17:51:25 704

原创 Kafka02——命令行操作

一、topic的操作 1、查看当前服务器中的所有 topic./kafka-topics.sh --bootstrap-server 192.168.56.93:9092 --list# 或./kafka-topics.sh --list --bootstrap-server 192.168.56.93:9092 2、创建 topic./kafka-topics.sh --create --bootstrap-server 192.168.56.93:9092 --topic topicTes

2021-12-17 17:04:19 1304

原创 JUC04——CompletableFuture

 CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息。 CompletableFuture 实现了 Future,CompletionStage 接口,实现了 Future 接口就可以兼容现在有线程池框架,而 CompletionStage 接口才是异步编程的接口抽象,里面定义多种异步方法,通过这两者集合,从而打造出了强大的 Compl

2021-12-14 20:26:19 85

空空如也

空空如也

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

TA关注的人

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