自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

男儿当自强

人生来平凡,因奋斗进取而不凡。

  • 博客(749)
  • 资源 (1)
  • 收藏
  • 关注

转载 top命令系统平均负载

比如最常见的是等待硬件设备的 I/O 响应,当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时候的进程就处于不可中断状态。不可中断状态的进程 则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。三个不同时间间隔的平均值,其实给我们提供了,分析系统负载趋势的数据来源,让我们能更全面、更立体地理解目前的负载状况。

2022-11-10 20:07:45 1099 1

转载 【无标题】

下图中A支配F,且F占据大量内存,但优化时F的直接支配对象A无法修改。有些情况下可能并没有支配起点对象的RetainedHeap占用很大内存(比如classX有100个对象,每个对象的RetainedHeap是10M,则classX所有对象实际支配的内存是1G,但可能Dominatortree的前20个都是其他class的对象),这时可以按class、package、classloader做聚合,进而定位目标。...

2022-07-28 16:48:27 747

转载 JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

MAT(全名MemoryAnalyzerTool),是一款快速便捷且功能强大丰富的JVM堆内存离线分析工具。其通过展现JVM异常时所记录的运行时堆转储快照(Heapdump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。......

2022-07-28 15:23:05 3251

原创 XXL-JOB调度中心HA及高可用方案

xxl-job 调度中心HA方案

2022-06-01 18:10:40 2581 1

原创 java中使用JWT

JWT:JSON Web Token,是通过数字签名,以JSON对象为载体在服务间安全传输信息的方式。JWT由三部分组成:头信息、有效载体和签名。头信息包括:令牌类型和签名算法信息;有效载体是使用一个JSON对象作为数据内容,由于只是采用base64运算,并没有进行加密,因此通常存放一些非敏感数据;签名是采用不可逆签名算法对base64后的头信息拼接上点拼接上base64后的有效载体及签名秘钥进行运算得出,防止token信息被篡改,最后生成的Token是由base64后的头信息拼接上点拼接上base64后的

2022-01-04 11:34:38 6900 1

原创 基于Redis实现秒杀系统

系统架构客户端发起秒杀请求,请求经网关处理转发到对应的服务节点上,进行业务层处理,最后数据入库。业务处理: 验证秒杀活动是否已经开启; 对流量进行限制; 验证订单信息(验证重复秒杀、验证库存是否足够); 订单数据异步入库;验证秒杀活动是否开启,需要用到Redis实现,因为服务是分布式的,多个节点上的系统时间可能存在略微差异,可以采用Redis来管理秒杀活动的开启状态。由于秒杀开启后,会有大量流量进入,需要对访问流量进...

2021-12-22 16:11:53 2415

原创 BloomFilter布隆过滤器

布隆过滤器是一种数据结构,由一个很长的二进制位数组和一系列随机映射函数组成,用于判断某个key一定不存在或者可能存在于某个集合中,它在存储空间占用和查询效率上非常有优势,但是存在一定的误算率,数据越多误算率越高。 当使用布隆过滤初始化一个key时,先对key使用一系列的映射函数映射后得出它在二进制数组中的一系列位置,然后把这些位置上的值设置为1。当进行查找时,同样对key使用一系列的映射函数进行映射得出它在数组中的一系列位置,如果这些位置上存在为0的值说明key一定不在集合...

2021-12-21 14:03:11 802

转载 雪花算法的原理和实现Java

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。给大家举个例子吧,比如下面那个 64 bit 的 long 型数字:第一个部

2021-12-17 15:52:18 137

转载 Redis过期key是怎么清理的

过期删除策略删除到达过期时间的 key 。第一种:定时检查删除对于每一个设置了过期时间的 key 都会创建一个定时器,一旦达到过期时间都会删除。这种方式立即清除过期数据,对内存比较好,但是有缺点是:占用了大量 CPU 的资源去处理过期数据,会影响 redis 的吞吐量 和 响应时间。第二种:惰性检查删除当访问一个 key 的时候,才会判断该 key 是否过期,如果过期就删除。该方式能最大限度节省 CPU 的资源。但是对内存不太好,有一种比较极端的情况:出现大量的过期 key 没有

2021-12-16 18:14:43 803

转载 redis过期策略和内存淘汰机制

定期删除redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key。Redis 默认会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。从过期字典中随机 20 个 key;删除这 20 个 key 中已经过期的 key;如果过期的 key 比率超过 1/4,那就重复步骤 1;redis默认是每隔 100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注

2021-12-16 18:13:32 156

原创 Redis Cluster集群搭建、管理、springboot整合

安装Redis下载Redis源码包到安装目录解压:# 解压 tar -zxvf redis-6.2.6.tar.gz# 进入解压后的redis目录cd redis-6.2.6安装gccyum install gcc-c++ -y执行编译make MALLOC=libc安装make install安装完成,为了方便使用可以拷贝常用的配置和脚本到指定目录[root@localhost redis]# mkdir bin[ro...

2021-12-15 14:39:28 1161

原创 Sentinel主从架构

Redsi主从架构中,从节点可以分摊主节点的读取压力,并且当主机点宕机后可以让从节点充当主节点,实现故障转移,但是普通的主从架构故障转移不是自动完成的,需要手工处理。手工模拟故障转移:创建一个一主两从的主机架构:# 启动3个redis节点 (端口:6379 6380 6381)[root@localhost redis]# ./redis-server 6379/redis.conf[root@localhost redis]# ./redis-server 6380/redis.conf

2021-12-13 14:11:46 1630

转载 Redis面试飞扬跋扈

一、Redis基本概念 面试官心理: 靠!手上活都没干完又叫我过来面试,这不耽误我事么,今儿又得加班补活了........咦,这小伙子简历不错啊,先考考它redis.......... 面试官: 谈谈你对Redis的理解? 我: Redis是 ANSI C 语言编写的一个基于内存的高性能键值对(key-value)的NoSQL数据库,一般用于架设在Java程序与数据库之间用作缓存层来弥补DB性能与Java程序之间的差距所带来的请求阻塞造成的响应缓慢以及DB并发吞吐跟不上系统

2021-12-09 10:46:57 198

转载 Redis如何做数据备份和读写分离

Redis的主从复制是面试中经常会被问的,我最近面试的几家公司只要聊到Redis,都会问我主从复制的原理。1.为什么需要主从复制?在本系列的上一篇博客中,我们讲到了Redis的持久化机制,它很好的解决了单台Redis服务器由于意外情况导致Redis服务器进程退出或者Redis服务器宕机而造成的数据丢失问题。但持久化机制还原数据有个前提:你的Redis服务器得能正常启动。如果遇到极端的断电情况(虽然概率小,但是有可能),Redis服务器启都启动不了,怎么还原数据?怎么保证它的高可用。就算R

2021-12-09 10:36:29 226

原创 Redis分布式锁

简单实现获取锁流程如下:setnx 如果key不存在,设置值成功,否则设置失败;setex 设置值附带过期时间;关键代码: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> .

2021-12-08 14:29:13 892

转载 redis事务

一、事务的四大特性关系型数据库的事务具有四个特性:1. 原子性2. 一致性3. 隔离性4. 持久性二、而在我们redis数据库中,事务回事什么样子的呢?首先我们给出一个定义:redis的事务中,一次执行多条命令,本质是一组命令的集合,一个事务中所有的命令将被序列化,即按顺序执行而不会被其他命令插入在redis中,事务的作用就是在一个队列中一次性、顺序性、排他性的执行一系列的命令。事务的生命周期:1. 事务的创建:使用MULTI开启一个事务2. 加入队列:在开启事务

2021-12-07 15:06:22 791

原创 JMM内存模型 原子性 可见性

JMM java内存模型,它是在多线程访问共享数据时,提供原子性、可见性有序性的规则和保障。原子性原子性:一个原子性操作可以包含一条或多条指令,一个原子性操作中的所有指令要么都不执行,要么全部执行且不会收到其他线程操作的影响。package com.tech.jmm;/** * @author lw * @since 2021/12/6 */public class A { static int i=0; static Object o=new Object()

2021-12-06 11:15:21 399

原创 JIT即时编译器进行的编译优化

解释器逐行将字节码解释成机器码,交由CPU执行。即时编译器,针对与热点代码也就是反复执行的代码进行优化编译,将字节码解释成机器码,保存在codeCache中,当下次执行时直接在codeCache获取,不用再进行编译性能提升。即时编译器分为C1及即时编译器和C2即时编译器,C1即时编译器采集程序的运行状态数据,进行编译优化,C2即时编译器在C1即时编译器上层彻底进行优化,C2即时编译器的优化性能高于C1即时编译器,C1即时编译器性能高于解释器。 即时编译器在优化编译时做出的优...

2021-12-04 11:13:23 967

原创 类加载器的使用及自定义类加载器

package com.tech.load.def;/** * @author lw * @since 2021/12/3 */public class UserImpl { static { System.out.println("UserImpl init ..."); }}package com.tech.load.def;/** * @author lw * @since 2021/12/3 */public class De..

2021-12-03 14:21:54 1083

原创 jvm中类加载器分类

类加载器是分级的,自上而下是:BootstrapClassLoader 启动类加载器,加载java_home/jre/lib下的类,由c++编写,不能通过java程序直接获取。 ExtensionClassLoader 扩展类加载器,加载java_home/jre/lib/ext下的类。 ApplicationClassLoader 应用程序类加载器,加载classpath下的类。 自定义类加载器 加载自义定路径下的类。当加载一个类时,先询问直接上级类加载器,是否加载过这个类,如果加载过那么类加

2021-12-01 12:14:33 801

原创 类的初始化触发的时机

类加载过程:加载、连接和初始化,类的初始化是调用的类的构造方法cinit来完成的,JVM保证了类的构造方法在执行时的线程安全。类的初始化在一定的条件下会触发,它是懒惰的:触发类的初始化的条件:通过new创建类的对象 通过Class.forName创建类的类型对象 首次访问带static修饰的静态变量或静态方法(static final修饰的string类型或基本类型变量除外) 子类在初始化时先对父类初始化 通过子类访问父类的静态变量(static final修饰的string类型或基本类

2021-11-30 11:10:54 368

转载 rocketMq和kafka对比

为什么在RocketMQ和kafka中选型在单机同步发送的场景下,Kafka>RocketMQ,Kafka的吞吐量高达17.3w/s,RocketMQ吞吐量在11.6w/s。kafka高性能原因生产者Kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据。为了优化写入速度Kafak采用了两个技术,顺序写入和MMFile。顺序写入因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最“讨厌”随机I/O,最喜欢顺序I/O。为了提

2021-11-25 17:05:21 10038

转载 rocketMq和kafka的架构区别

概述 其实一直想写一篇rocketMq和kafka在架构设计上的差别,但是一直有个问题没搞明白所以迟迟没动手,今天无意中听人点播了一下似乎明白了这个问题,所以就有了这篇对比。 这篇博文主要讲清楚kafka和rocketMq的两个不同点,1、rocketMq的namesvr和kafka的zookeeper对比;2、kafka为什么比rocketMq有更大的吞吐量。如果能够讲清楚上面两个问题我觉得就已经很满足了。 最后,文章引入的参考文章里面有一些比较好的链接,有兴趣的话可以好好看...

2021-11-25 15:11:38 339

转载 高并发异步解耦利器:RocketMQ究竟强在哪里?

消息队列的发展史:并且详细介绍了RabbitMQ,其功能也是挺强大的,那么,为啥又要搞一个RocketMQ出来呢?是重复造轮子吗?本文我们就带大家来详细探讨RocketMQ究竟好在哪里。RocketMQ是一个分布式消息中间件,具有低延迟、高性能和可靠性、万亿级别的容量和灵活的可扩展性。它是阿里巴巴于2012年开源的第三代分布式消息中间件。随着阿里巴巴的电商业务不断发展,需要一款更高性能的消息中间件,RocketMQ就是这个业务背景的产物。RocketMQ是一个分布式

2021-11-25 14:58:34 494

原创 RocketMQ生产环境操作及优化

线上通常配置多个NameServer,以实现高可用;线上通常采用多主多从至少2主2从同步双写异步刷盘的集群架构,由于从节点只能消费,这样可以保证master宕机,可以在其他master节点写入,同步双写确保数据安全性,异步刷盘提升性能;线上通常关闭自动创建Topic,以免topic命名不规范或与线上其他topic重复,导致一系列问题;性能优化思路:cpu:是否占用过高,可使用top分析;网卡:网络带宽是否存在性能瓶颈,可用sar -n DEV 2 10 分析网络接口信息,如单位时间发

2021-11-24 16:25:53 1582

转载 iostat 磁盘IO统计

iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析常见命令展示iostat 安装 1 # iostat属于sysstat软件包。可以直接安装。 1 yum installs...

2021-11-24 16:04:10 347

原创 RocketMQ双主双从集群搭建

主从采用同步双写,刷盘采用异步刷盘模式,参考集群(broker cluster)架构如下:参考前面的RocketMQ集群搭建,上传RocketMQ源码包到各个服务节点,进行编译部署。由于机器内存限制,需要修改运行脚本(runbroker.sh runserver.sh)的默认jvm内存参。在部署broker前还需启动nameserver。一 部署master a根据安装目录修正如下路径进入修改配置文件/usr/local/java/rocketmq/rocketmq/dis..

2021-11-24 15:22:26 2152

原创 RocketMQ实现分布式事务

基于RocketMQ可以实现分布式事务的最终一致性解决方案,它使用TransactionMQProducer发送事务消息,事务消息的状态包括:Unknown 未知状态,初始发送的消息就是该状态,该状态下事务消息不会被消费者消费;Commit状态 提交状态,该状态下事务消息会被消费者消费;Rollback状态 回滚状态,事务消息会在broker端被移除,不会被消费者消费。它的处理流程是这样:首先生产者通过TransactionMQProducer发送事务消息到broker,此时事务消息的状态是...

2021-11-23 17:51:11 2254

转载 基于RocketMQ实现分布式事务

前言在系统变的复杂后,分布式、微服务等架构技术,就要考虑到应用在系统中了。尤其数据量大了后,就需要对数据库进行拆分。如:注册的用户数据,量大了后,就需要考虑分库分表一旦数据库进行了分拆,那就出现很多头疼的问题,其中之一就是事务问题。那我们就来看看问题是怎么出现的?场景先来上个图进行数据拆分后,就类似上面的架构上图中我们就拿用户的数据进行举例,用户量一旦几千万时,就需要进行分库分表;上图就分了3个库,每个库都保证了高可用。这样的架构设计,会遇到事务.

2021-11-23 15:58:11 282

转载 RocketMQ中的消息存储位置

CommitLog消息内容原文的存储文件,同Kafka一样,消息是变长的,顺序写入生成规则:每个文件的默认1G =1024 * 1024 * 1024,commitlog的文件名fileName,名字长度为20位,左边补零,剩余为起始偏移量;比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1 073 741 824Byte;当这个文件满了,第二个文件名字为00000000001073741824,起始偏移量为1073741824, 消息存储的时候会

2021-11-22 15:27:13 1956 1

原创 RocketMQ 使用TAG进行消息过滤

RocketMQ支持Broker端和Consumer端的TAG过滤,Broker端过滤:减少无用消息的网络传输,但是增加了broker端的负担;Consumer端过滤,增加了无用消息的网络传输,但是减少了broker端的负担。SQL过滤,使用了服务端实现,TAG过滤,主要使用消费端实现。SQL过滤:性能低,支持使用SQL语句复杂的过滤逻辑;TAG过滤:性能高,只支持简单的过滤。Broker端过滤:先变量消息队列中TAG与消费者订阅的TAG使用HASHCODE比较,匹配上则把对应的消息发给消费...

2021-11-19 18:01:05 4387

原创 RocketMQ 消费端核心配置

consumeFromWhere: CONSUME_FROM_FIRST_OFFSET: 初次从消息队列头部开始消费,即历史消息(还储存在broker的)全部消费一遍,后续再启动接着上次消费的进度开始消费 CONSUME_FROM_LAST_OFFSET: 默认策略,初次从该队列最尾开始消费,即跳过历史消息,后续再启动接着上次消费的进度开始消费 CONSUME_FROM_TIMESTAMP : 从某个时间点开始消费,默认是半个小时以前,后续再启动接着上次消费的进度开始消费 allo..

2021-11-19 15:18:35 831

原创 RocketMQ顺序消息

RocketMQ顺序消息是指消息发送顺序与消费顺序一致,包括全局顺序消息和局部顺序消息,全局顺序消息可以使用一个Topic对应1个队列来实现,但是吞吐量特别低;局部顺序消息,是指在一个队列上消息有序的发送和消费,但是对应异步发送和广播消费模式不支持顺序。局部顺序消息,在发送消息时使用MessageQueueSelector让特定的消息到达特定的一个队列上,在消费消息时,使用MessageConsumerOrderly来消费消息,它可以保证有序消费。让特定的消息到达指定的队列(消息在单...

2021-11-19 14:39:48 1584

原创 消息发送到Topic下的某个特定队列

一个Topic默认自动创建4个队列,如果想让某条消息到达Topic的某个特定的队列中,可以在发送消息时使用MessageQueueSelector来指定,消息要到达的队列。在同步发送和异步发送消息时,都支持指定特定的队列。 同步发送时指定队列: // 消息队列选择器指定Topic下的某个队列进行发送 @GetMapping("sendSelect") Object callbackSelect(String text) throws ...

2021-11-18 17:37:06 373

原创 RocketMQ延迟消息

通过给消息设置延迟时间,到达延迟时间后消息才会被消费者消费,在延迟消息中,最先发送的消息不一定最先被消费,而是最早达到延迟时间的消息被优先消费。延迟消息经常用于电商系统,如实现延迟关单功能。 //延迟消息 @GetMapping("sendDelay") Object callbackDelay(String text) throws InterruptedException, RemotingException, MQClientException, MQBr...

2021-11-18 16:35:44 380

原创 RocketMQ中三种发送消息的方式

RockeMQ消息发送有三种方式:同步、异步和OneWay。同步发送: 发送消息后需等待结果,消息的可靠性高发送速度慢; // 同步发送 @GetMapping("send") Object callback(String text) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {// Message message = n...

2021-11-18 15:22:11 1294

原创 RocketMQ发送及消费重试机制

发送重试机制: RocketMQ支持发送失败内部重试,默认是2次,在异步、SendOneWay模式下不支持重试。消费重试机制: RocketMQ在消费失败时,支持消费端重试继续消费消息,默认支持16次重试,每次重试的时间间隔增加,只有在Cluster模式支持重试、广播模式不支持重试。 在重试期间,消息的key和ID不会发生改变,应用程序可以以此做好幂等性控制。 在重试期间,还可以继续消费其它新消息。package c...

2021-11-18 14:30:26 2096

原创 RocketMQ发送状态

SendStatus类作为发送消息后结果状态,SendStatus状态说明信息如下:SEND_OK:消息投递成功FLUSH_DISK_TIMEOUT:同步刷盘超时FLUSH_SLAVE_TIMEOUT:同步双写,写Slave节点超时SLAVE_NOT_AVAILABLE:同步双写,获取不到从节点,如从节点宕机...

2021-11-17 17:48:22 726

原创 生产者常见核心配置

2021-11-17 16:25:32 69

转载 分代收集算法详解

前提概要这篇文章算是对前一篇文章的一个补充,主要地讲一下涉及知识点较多的分代收集算法。分代收集概念根据对象的存活周期不同将内存划分为新生代和老年代,存活周期短的为新生代,存活周期长的为老年代。这样就可以根据每块内存的特点采用最适当的收集算法。新生代的中每次垃圾收集中会发现有大批对象死区,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。老年代中因为对象的存活率高,没有额外的控件对它进行分...

2021-11-17 09:34:23 1510

rocketmq-console.zip

RocketMQ控制台,下载后对资源解压,修改Pom中RocketMQ版本修改配置文件中RocketMQ nameServer地址,用Maven编译,运行target目录下的jar即可

2021-11-09

空空如也

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

TA关注的人

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