自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

乐乐的博客

分享技术

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

原创 jmap导出快照和分析

导出jvm内存快照到指定目录jmap -dump:live,format=b,file=/data/simpleWebServer/xxxx.hprof 1用jvisualvm进行快照分析jvisualvm 使用文件装入,进行对应的分析

2022-01-28 09:12:33 1089

原创 linux 批量创建表命令

#第一种:#!/bin/sh#creat tablesfor i in `seq 1 511`do var=`printf "%02d\n" $i` echo '''CREATE TABLE `pt_account_'''$var'''` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `domain_id` bigint(20) NOT NULL COMMENT '账号域id', PRIMAR

2021-10-11 19:20:05 740

原创 springboot访问接口自动跳转到登陆页面问题排查

1.怀疑是某个filter进行了拦截人工排查了各个Filter,怀疑可能是漏了,使用jvisualvm对该程序进行dump分析其中的filter相关的对象,但是没有找到然后想一下,一个http请求的过程,tomcat -> engine -> host -> context -> wrapper -> ApplicationFilterChain(各种filter) ->springframework.web.servlet(DispacherServlet.

2021-09-09 23:03:52 2067

原创 内存管理学习总结

为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套的虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。那既然有了虚拟地址空间,那必然要把虚拟地址「映射」到

2021-09-06 15:24:52 322

原创 rocketmq部署-保证消息不丢失的实操

1.我们都知道要保证消息不丢失需要从以下三个方面去保证1)保证发送端必须发送成功,最好是broker端给了ack之后才表示发送成功,不然就需要重试发送。2)保证broker端保存成功,一方面是master节点持久化成功,另一方面是follower节点也要持久化成功,不然master节点挂了消息就丢失了3)保证消费者短消费成功,如果消费者刚接收到消息还没进行业务处理就挂了,然后broker就认为消息成功消费了,那么消息也丢失了。rocketmq部署操作https://github.com/apa

2021-09-03 10:01:50 458

原创 秒杀活动系统简单分析

问题点:1.高并发:时间短,瞬间并发量大,考虑缓存雪崩,缓存击穿,缓存穿透。2.超卖:3.恶意请求:搞很多服务器脚本疯狂请求。4.链接暴露:相信是个开发同学都对这个画面一点都不陌生吧,懂点行的仔都可以打开谷歌的开发者模式,然后看看你的网页代码,有的就有URL,但是我写VUE的时候是事件触发然后去调用文件里面的接口看源码看不到,但是我可以点击一下查看你的请求地址啊,不过你好像可以对按钮在秒杀前置灰。不管怎么样子都有危险,撇开外面的所有的东西你都挡住了,你卖这个东西实在便宜得过分,有诱惑力,你能

2021-08-31 16:57:04 220

原创 Java内存模型与JVM内存结构

Java内存模型在JVM内存结构的描述中,我们知道了堆和方法区是线程共享的。而局部变量,方法定义参数和异常处理器参数就不会在线程之间共享,他们不会有内存可见性问题,也不受内存模型的影响。Java线程之间的通行由Java内存模型(简称JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存

2021-08-31 13:50:51 353 1

原创 分库分表要注意选型和流程

数据库到了需要分库分表的时候,那么公司的数据也是发展到了一定的量了,需要考虑高可用了。但是分库分表需要考虑哪些因素,拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接踵而至,以至失控。本文介绍数据库中间件的广度而不是深度。切入层次,一下范围限定在mysql和java中,我们先说下分库分表切入的层次1.编码层在同一个项目中创建多个数据源,采用if else的方式,直接根据条件在代码中路由。Spring中有动态切换数据源的抽象类,具体参见AbstractRoutingDataSource

2021-08-26 08:34:41 368 1

原创 shardingjdbc源码之结果合并

1.首先入口是这行代码result = new ShardingResultSet(resultSets, new MergeEngine(resultSets, (SelectStatement) routeResult.getSqlStatement()).merge());org.apache.shardingsphere.core.merge.dql.DQLMergeEngine#merge 方法如下所示@Override public MergedResult merge() th

2021-08-24 17:36:30 417

原创 shardingjdbc源码解析

入口分析:org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement#executeorg.apache.shardingsphere.core.BaseShardingEngine#shard3. org.apache.shardingsphere.core.PreparedQueryShardingEngine#route4. org.apache.shardingspher

2021-08-24 11:29:10 1273

原创 mysql在扫描情况下会选择全表扫描而不是走索引

1.有一张表t_accountCREATE TABLE `t_account` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT '', `age` int DEFAULT '0', `phone` varchar(20) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `goods` int DEFAULT '0', `update_time` d

2021-08-22 23:06:20 3526 3

原创 深入elasticsearch分片搜索原理

在分布式集群中,我们介绍了分片,把它描述为底层的工作单元。但分片到底是什么,它怎 样工作?在这章节,我们将回答这些问题:为什么搜索是近实时的?为什么文档的CRUD操作是实时的?ES怎样保证更新持久化,即使断电也不会丢失?为什么删除文档不会立即释放空间?什么是 refresh,flush, optimize API ,以及什么时候你该使用它们?为了理解分片如何工作,最简单的方式是从一堂历史课开始。我们将会看下,为了提供一个 有近实时搜索和分析功能的分布式、持久化的搜索引擎需要解决哪些问题。1

2021-08-20 17:50:04 697 2

原创 JWT了解并使用

1. JSON Web Token是什么JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。2.什么时候你应该用JSON Web Token下列场景中使用JSON Web Token是很有用的:Authorization (授权) :这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。

2021-08-18 08:02:38 228

原创 kafka命令及启动

先启动zookeeper,默认自带的bin/zookeeper-server-start.sh config/zookeeper.properties然后启动kafka服务bin/kafka-server-start.sh config/server.properties列举拥有哪些topicsbin/kafka-topics.sh --list --bootstrap-server localhost:9092在服务器上打开一个生产者,然后把输入的每行数据发送到kafka中的命令bin

2021-08-14 11:03:14 908

原创 2021 java 最新面试总结

cpu -> 占用过多 怎么排查redis cluster集群: client端 进行redirect -> mastermysql联合索引怎么存储, 单个索引,一个节点存放的是单个索引的字段内容,联合索引存放的是多个索引字段的内容。netty 为什么怎么快? 基于主从reactor多线程模型设计。 mainReactor 负责客户端连接请求,并将请求转交给subReactor,subReactor负责读写io,非io操作直接放入队列等待worker threads进行处理。项目:re

2021-08-05 21:49:11 335 1

原创 nacos配置数据库加载

### Connect URL of DB:# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC# db.user=nacos# db.password=nacos

2021-08-05 16:49:02 1118

原创 threadLocal为什么会导致内存泄露

每个线程都有一个ThreadLocalMap, 该ThreadLocalMap 中有许多entry,每个entry的key就是当前的threadLocal的弱引用,value是填入的值当系统发生gc的时候,当没有地方强引用该threadLocal,那么这个弱引用的key就会被回收,但是这个entry仍旧被threadLocalMap强引用,threadLocalMap被当前线程强引用,因此无法回收,导致内存泄露所以每次用完threadLocal之后都需要去remove它,并且threadLocal在.

2021-07-28 22:33:26 356

原创 Redis - RDB、AOF和复制时对过期键的处理

在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。举个例子,如果数据库中包含三个键k1、k2、k3,并且k2已经过期,那么当执行SAVE命令或者BGSAVE命令时,程序只会将k1和k3的数据保存到RDB文件中,而k2则会被忽略。因此,数据库中包含过期键不会对生成新的RDB文件造成影响。rdb.c 的rdbsave()源码/* Iterate this DB writing every entry

2021-07-28 08:16:00 601

原创 rocketmq事务消息

传统发送消息模式:先执行本地事务,成功之后,后发送消息给第三方,问题1.发送消息失败:第三方就没有收到消息,例如发送消息失败了(异常情况:mq宕机,网络异常),但是本地事务又成功了,就需要人工处理了。人工重发消息等传统发送消息的模式存在的问题是,无论你先发送消息再执行事务,还是先执行事务再发送消息,都存在问题。1.先发送消息,然后再执行事务,如果中间出现异常,事务执行失败,则出现了不一致2.先执行事务,再发送消息,如果中间出现异常,消息发送失败,也会导致不一致,因此:我们需要一个凭..

2021-07-21 17:23:43 271

原创 springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect解析

想着把各个aop的实现功能排个顺序,filter -> interceptor -> controllerAdvice -> aspect -> controller2 拦截器与过滤器之间的区别从上面对拦截器与过滤器的描述来看,它俩是非常相似的,都能对客户端发来的请求进行处理,它们的区别如下:拦截机制有三种:过滤器(Filter)能拿到http请求,但是拿不到处理请求方法的信息。拦截器(Interceptor)既能拿到http请求信息,也能拿到处理请求方法的信息,

2021-07-20 08:25:41 226

原创 cpu持续高起,如何定位问题

1.首先top查看进程列表,查找cpu占用率很高的进程top150882.然后再通过ps命令查看这个程序的线程信息,tid代码线程ID,time代表这个线程的已运行时间ps -mp 15088 -o THREAD,tid,time3.进制转换,3b4c再将这3个TID转为16进制,为等会在jstack中查找方便printf "%x\n" 1518015180 3b4cjstack查看线程信息whereis java./jstack 15088 |grep 3b4c5

2021-07-19 10:35:26 505

原创 zookeeper分布式锁

/** * 在指定时间内尝试获取锁 * zookeeper 尝试获取锁,首先获取可重入锁对象,然后尝试获取锁, * 若当前线程已获取该锁,则将该锁的lockCount + 1并返回获取锁成功 * 若不是当前线程,则首先在/mylock目录下创建一个临时顺序节点,然后获取该目录下的所有临时节点, * 判断当前节点是否获取到锁(即是否是最小的节点),若是则返回获取锁成功,若不是则创建一个watcher监听它的上一个节点, * 若直到有效时间截止还没

2021-07-18 11:38:43 59

原创 面试题:一个consumer订阅两个topic,其中一个topic消息过多堆积了,会影响另一个topic消费吗

问题:一个consumer订阅两个topic,其中一个topic消息过多堆积了,会影响另一个topic消费吗答案:不影响。为什么呢?因为rocketmq首先对消息进行负载均衡(rebalance),就是将topic中的队列按照consumer进行分配之后,将pullRequest(里面存放了topic,brokerName,queueId)放入到一个linkedBlockingQueue中,这个时候已经排好了后面消费的顺序。例如100个request中有大概50个是TopicTest1, 另外50个是

2021-07-15 11:28:49 2436 1

原创 动态代理模式&Spring AOP源码阅读

1.清楚jdk和cglib这两种动态代理模式创建代理对象的原理和代码2.要搞清楚jdk和cglib这两种代理模式产生的代理对象被调用时的执行原理和代码3.要搞清楚xml方式中aop标签底层时如何被解析及解析的结果是什么(十个BeanDefinition)4.通过画图去说明上一步解析出来的十个BeanDefinition的作用5.清楚创建aop代理对象的入口在哪及相关的类是哪个?6.清楚创建aop代理对象的流程7.清楚aop代理对象的执行流程(连接器链–MethodInterceptor/Meth

2021-07-12 10:23:00 129 1

原创 spring循环依赖问题

spring循环依赖问题:循环依赖是针对成员变量—单例才可以解决setter方法循环依赖,多例是无法解决循环依赖的- 构造器方法依赖—无法解决 - setter方法依赖—可以解决循环调用针对方法是无法解决的。@Componentpublic class CommonService { public CommonService(UserAService userAService) { this.userAService = userAService; }

2021-07-12 09:42:20 85

原创 aop核心概念及动态代理

spring循环依赖解决问题分息&spring aop核心概念解析&动态代理课程目标:1.明白什么是循环依赖?2.明白Spring中的循环依赖是如何解决的?3.明白Spring中的循环依赖是如何解决的?4.Spring aop核心概念详解(通知、切面、切入点等等)5.要明白aop到底是什么回事?6.要明白aop的底层原理是如何结合动态代理去实现的7.掌握动态代理的两种方式的写法三级缓存获取对象的顺序先从一级缓存中查找再从二级缓存中查找最后没有则从三级缓存中获取(Ob

2021-07-11 14:44:27 135

原创 spring refresh详解

@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. // 容器状态设置,初始化属性设置,检查必备属性是否存在 prepareRefresh(); // Tell the subclass to

2021-07-10 10:00:56 312

原创 spring创建bean对象三步走

1.第一步org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean // bean初始化第一步:默认调用无参构造实例化Bean // 构造参数依赖注入,就是发生在这一步 if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); }2.第二

2021-07-09 18:41:33 190

原创 ConcurrentHashMap 1.7与1.8的区别

1.锁结构不同在JDK1.7中,ConcurrentHashMap基于Segment+HashEntry数组实现的。Segment是Reentrant的子类,而其内部也维护了一个Entry数组,这个Entry数组和HashMap中的Entry数组是一样的。所以说Segment其实是一个锁,可以锁住一段哈希表结构,而ConcurrentHashMap中维护了一个Segment数组,所以是基于分段锁实现的。 而JDK1.8中,ConcurrentHashMap摒弃了Segment,而是采用synchroniz

2021-07-08 14:11:45 10682

原创 Error:java: 无效的标记: -parameters

Error:java: 无效的标记: -parameters需要将这里面的东西删掉即可

2021-07-08 10:44:37 724 2

原创 分布式服务接口的幂等性如何设计(比如不能重复扣款)?

判断redis中是否有订单记录,有则返回已支付完成查询数据库判断没有订单,先插入订单,支付中【单号是唯一索引】有订单,判断是支付中,进入下一步如果是完成,则返回开启事务,加悲观锁:再次判断状态是支付中:然后下一步,不然返回支付完成支付完成,修改状态为支付完成提交redis:设置为已支付set order_id payd...

2021-07-05 15:20:34 146

原创 intern方法解析-字符串常量池

String str3 = new String("ab");// falseSystem.out.println(str3.intern() == str3);String e = new String("jo") + new String("hn");// intern 在常量池中寻找john,// 如果没有,则将e在堆中的内存地址放入到常量池中的stringtable中,并返回// 如果有,则直接返回在常量池中的地址// trueSystem.out.prin

2021-05-13 21:46:56 126

原创 @DateTimeFormat 和 @JsonFormat 注解

1.在Content-type为form表单的情况下Spring 的 @DateTimeFormat 注解格式化参数public class DateVo { @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date date; public void setDate(Date date){ this.date = date; } public Date getDate(){

2021-04-13 11:21:02 115

原创 解决双重校验锁的线程安全问题

package com.example.springdemo.test.serlize;import com.example.springdemo.domain.Student;/** * 解决双重校验锁的线程安全问题 * 当前代码有安全问题,有三种解决方法 * 1)在方法签名上添加synchronized, 使方法变为同步方法 * 2)在存在线程安全问题的成员变量声明前添加volatile * 3)若在线程安全问题的成员变量为Integer、Long、Boolean等,可以将他们定义为A

2021-04-12 22:39:55 269

转载 消息摘要、数字签名与数字证书的区别

文章目录前言一、消息摘要(Digest)二.数字签名(digital signature)前言一、消息摘要(Digest)什么是消息摘要?对一份输入数据进行一个不可逆的 Hash计算,生成一个固定长度的 Hash 值,这个值就是这份数据的摘要(Digest),也称为指纹。摘要算法(Digest)又称 哈希算法(Hash)摘要算法常见的摘要算法有 MD5、SHA-1、SHA-256等特点:同一个摘要算法,无论输入的数据是什么,输出都是相同长度的值。 如: MD5,无论数据有多大,输

2021-04-07 17:39:01 1033 1

原创 获取真实ip代码

public class IPUtils { private static final Logger LOGGER = LoggerFactory.getLogger(IPUtils.class); private static final String LOCAL_HOST_V4 = "127.0.0.1"; private static final String LOCAL_HOST_V6 = "0:0:0:0:0:0:0:1"; private static f

2021-04-01 10:50:36 858

原创 maven scope

Maven Scope就是用来控制依赖和三种classpath(编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖。test:测试依赖范围。使用次依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码

2021-04-01 09:31:33 150

原创 cxf报错 Cannot find any registered HttpDestinationFactory from the Bus

错误信息:Cannot find any registered HttpDestinationFactory from the Bus.报错主要是因为缺少jetty依赖一般添加如下依赖即可<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <

2021-01-13 16:17:33 2143

原创 缺少org.apache.commons.collections.CollectionUtils?

也许你正在寻找的jar是apache commons-collections: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.1</version> </dependency>要么&l

2021-01-08 13:46:39 6381

原创 Redis IO多路复用技术以及epoll实现原理

系列文章目录文章目录系列文章目录前言1. redis是基于缓存的2. Redis为什么这么快?3.IO多路复用技术4.Redis线程模型4.1 I/O多路复用程序、文件事件分派器前言redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统。 redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。1. redis是基于缓存的官方文档介绍说,Redis的操作都是基于内存的,CPU不是 Redis性能瓶颈,,Redis的瓶颈是机器内存和网络带宽。Reds是C语言

2021-01-07 20:39:02 787

空空如也

空空如也

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

TA关注的人

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