自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringCloud相关

SpringCloud五大组件分别对应(1)服务注册与发现(2)客服端负载均衡(3)断路器(4)服务网关(5)分布式配置。

2023-11-20 22:51:26 327

原创 redis中hash数据结构

目录hash的数据结构ziplist底层实现字典底层实现扩容缩容引用hash的数据结构hash底层数据结构的实现包括两种:ziplist和字典当保存的所有键值对字符串长度小于 64 字节并且键值对数量小于 512 时使用ziplist ,否则使用字典的方式ziplist底层实现字典底层实现字典(dict):其中包含长度为2的哈希表数组dictht,rehashIdx(默认-1)如果为-1说明当前没有扩容,如果不为 -1 则表示正在进行扩容,记录了原hash表需rehash的数组下标h

2022-05-04 00:33:12 6191 2

原创 反射含义与原理

目录含义作用怎么使用反射通过反射获取对象获取类的成员变量的信息获取类的方法获得构造函数反射原理类加载含义反射是指在项目运行过程中,对于任意一个类可以获取其属性和方法信息,对于任意一个对象都可以调用其所有属性和方法,这种动态获取类信息以及动态调用对象方法的能力称为反射作用获取类名、package信息、所有属性、方法、注解、类型、类加载器等判断对象所属的类获取/修改对象中的属性值调用对象中的方法怎么使用反射通过反射获取对象获取Class对象Class class = Class.f

2022-05-02 21:38:25 583

原创 CyclicBarrier

目录CyclicBarrier是什么用例实现原理内部属性构造方法await方法breakBarrier()CyclicBarrier是什么CyclicBarrier又被称为同步屏障,可以让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,所有被阻塞的线程才被唤醒,继续执行举个例子:CyclicBarrier类似一扇门,默认情况下关闭状态,堵住了线程执行的道路,直到所有线程都就位,门才打开,让所有线程一起通过用例public class CyclicBarrierUsing { p

2022-02-16 09:31:20 358

原创 CountDownLatch

目录简介原理解析newawaitcountDownQA简介java.util.concurrent.CountDownLatchCountDownLatch是一种一次性同步辅助工具,它实现了一个或一组线程等待被其他线程唤醒的机制使用场景举例:服务启动时,会同时加载多个组件,主线程需等待组件加载,当所有组件加载完毕之后,主线程才能去完成某个任务(去吃饭,等上菜、等人齐,之后才可以吃饭)核心方法:await: 阻塞调用线程,直到CountDownLatch中计数器到0;才会被唤醒countDow

2022-02-15 09:30:17 358

原创 Thread及Object中的一些方法

wait、notifywait和notify方法是Obejct类中的方法,相当于所有的对象均有这两个方法。当一个线程持有了锁对象object使用权之后才能object的wait、notify方法,因此需要将方法调用放在synchronized同步方法或代码块中,保证当前线程持有了锁的使用权,若线程没有持有锁对象obejct使用权,调用了object的wait、notify方法则会抛出 java.lang.IllegalMonitorStateExceptionwait() 线程会释放当前持有的所有锁,

2021-05-04 22:22:40 193

原创 mysql相关知识点总结

性能监控show profilesshow precesslist 命令查询数据库连接数量,command字段可以查看该线程状态,正在做什么设计的时候?

2021-04-12 23:12:17 344

原创 Spring Bean的生命周期

如上图所示为Spring中Bean的一个完整生命周期,大体上可以分为实例化Instantiation、填充内部属性(属性赋值)Populate、初始化Initialization、销毁Destruction四个阶段。实例化前准备阶段从我的理解来说,它并不包含在bean的生命周期中,因为此时bean实例尚未创建,beanFactory中存储的仅是beanDefinition。通过实现BeanFactoryPostProcess接口的postProcessBeanFactory方法可以对beanDefin.

2021-03-22 23:15:44 284

原创 Spring中的设计模式

工厂模式Spring IOC就是通过工厂模式来实现的,将对象的创建和管理过程交由Spring去完成,主要通过springFactory来实现,根据传入bean的名字来获取对象。当spring启动时会先通过注解或xml配置获取bean的beanDefinition信息,然后将其放在springFactory的beanDefinitionMap中,key为bean的名字;在这个地方Spring为为我们提供了一个切入点可以用来修改beanDefinition,可以通过实现接口BeanFactoryPost

2021-03-21 21:24:37 2384

原创 redis缓存与数据库的一致性一种解决方案

以抢购活动中商品的库存为例,大家可以想一下在淘宝上买东西,当把商品放到购物车里面的时候,并没有真正的扣减库存;因为可能很多用户都有加购物车的习惯,但真正购买人数其实远没有这么多,当我们点击购买,到达支付页时才会真正的判断库存是否足够,满足条件时,扣减库存生成待支付订单。通常情况下如果用户的并发量不高时,代码中可以在库存操作上使用redis 分布式锁或mysql for update的方式,来防止超卖;但一旦并发量大起来将有大量的用户阻塞在这一过程中,导致请求超时,进而整个系统奔溃,且这种方式对数据库库存

2021-02-06 19:11:34 1342 2

原创 consul和eureka的区别

consul和eureka为服务注册中心,它们一般是集群部署的1.consul提供了cp一致性、分区容错性,对于consul集群来说,consul注册中心分为leader和fellow,服务注册和发现会落地到leader去提供,当一个项目A想要注册到consul时,leader需要保证A服务注册信息同步到半数以上的fellow consul节点才算注册成功,之后才可以被其他服务发现并调用。当leader挂掉后,需要选举出新的leader节点,选举过程中consul集群不可用;eureka提供ap可用性、分

2020-09-14 23:41:41 4501

原创 分布式事务数据一致性解决方案

2PC 两阶段提交 由一个事务协调器器去通知各事务执行者准备事务、提交或回滚事务,它解决了数据一致性问题,但是通信时间、资源锁定时间太长,系统的可用性受到影响利用RocketMq的消息事务机制,将生产者本地数据库事务与发送消息到broker绑定在一起,保证当生产者本地数据修改成功之后,通知与其协作的其他服务数据修改的消息一定会被写入到broker中;之后由消费者从broker中读取消息,进行处理,在broker端需要保证幂等,避免重复进行数据处理。当消息处理完毕之后,需要写入到一张记录表中,每一..

2020-09-03 01:01:53 6300

原创 mysql alter添加列

当表中的数据量不是很大的时候可以直接使用alter命令添加新列,5.6及其之前的版本会将表锁住,它的alter的执行过程如下:1.将原表锁住,不能进行更新、插入、删除等修改操作2.创建了一个临时表,添加想要的字段3.将原表中的数据复制到临时表中4.将临时表改名,并删除原表在5.6之后的版本mysql数据库做了很多优化,像onlinDDL在执行alter时可以指定algorithm和lock字段,用于选择ddl修改标结构时的算法和是否对原表加锁,algorithm为inplace表示添加字段时不再创

2020-08-22 15:06:31 2560

原创 mysql checkPoint和bin-log小计

为了提高操作效率,mysql中对数据进行增删改操作后并没有立即写入到磁盘中,而是记录到了buffer pool缓冲池中,这也就会导致缓冲池中的数据会与磁盘中数据不一致,为了避免数据库宕机时发生缓冲池数据没有被同步到磁盘中,还使用了(redo log)重做日志去记录操作,数据库在故障重启之后会根据该日志重做来恢复数据,保证数据持久化。但是redo log的空间并不能无限扩大,缓冲池中未同步的记录即脏页也需要及时写入磁盘,checkPoint就是指什么时候将缓冲区中的脏页刷新到磁盘中去。redo log分为

2020-08-19 23:50:24 374

原创 分布式限流实现

当前大多数项目都是分布式架构,某些情况下高并发的场景需要对请求进行限流。如果是单节点我们可以使用google为我们提供的guava包下的RateLimiter进行限流,它使用的是令牌桶算法,分布式场景下也可以使用网关进行限流,如Spring Clound Gateway,其实还有很多开源的限流框架如阿里的Sentinel,甚至我们可以利用redis+lua脚本自己来实现限流。下面简单介绍一下常见的限流算法1.固定窗口计数法在这种算法中,将一段时间划分为多个时间窗口,在每个窗口内进行请求时会进

2020-08-19 01:08:39 905

原创 一致性hash和redis中hash槽的区别

一致性hash主要用于分布式系统中,用于解决数据选择节点存储、选择节点访问、增删节点后数据的迁移和重分布问题。redis集群并没有使用一致性hash,而是使用了hash槽来解决数据分配的问题。一致性hash:它是一个0-2^32次方的圆,主要操作步骤:将每一个节点进行hash(如ip),让其落在这个闭合的圆环上;当我们进行数据存储或访问时,计算key的hash值,让其也落在这个闭合圆环之中;那么它顺时针找到的第一各服务节点就是存储key的节点当添加节点时,例如再节点2和4之间添加了一个节点5

2020-08-15 16:31:11 4648 3

原创 redis中热点数据及大value处理

1.redis的热点数据是什么,可能出现什么问题?某个key的访问频率很高,当一个key的qps到达1000的时候就需要关注了。redis中数据分布在集群的不同节点上,当某个key的qps过高,容易出现大量的读请求落在某一个redis数据分片节点上,造成负载不平衡,即访问倾斜从而将该节点打挂,那么该节点的所有缓存都不可用了,就会出现缓存雪崩等情况,造成大量的请求直接落到数据库上,造成数据库的查询阻塞甚至宕机。比较严重的就像微博某个明星宣布离婚,粉丝涌入留言,造成品论功能失效。2.该如何定位热点数据?

2020-08-14 00:13:56 3951

原创 java中的引用

java中引用分为强引用、软引用、弱引用、虚引用4种,下面分别针对这4种引用介绍一下(1)FinalReference 强引用,就是我们平常经常使用的类似于Object o = new Object(),这种就是强引用,该引用存在栈中,jvm进行垃圾回收时,如果堆中的对象被强引用指向它,那么是不会被回收的(2)SoftReference 软引用,被软引用指向的对象,当堆中内存不足的情况下,会被列入到可回收范围内,也就是说软引用指向的对象并非是安全的,在垃圾回收的过程中是有可能被回收掉的。Sof

2020-07-27 00:30:40 134

原创 mybatis缓存

mybatis中有一级缓存和二级缓存一级缓存:一级缓存是默认打开的,它是sqlSession级别的缓存,不同session之间的缓存是不共享的。当执行查询之后,会将查询结果存入sqlSession为我们开辟的一块区域之中,它是一个map结构,当我们再次查询同样的数据时就不会再查询数据库,而是直接从缓存中获取,当sqlSession关闭时,其中的缓存也就消失了。当使用的sqlSession删除、修改、添加或执行commit操作时,就会清空一级缓存。一级缓存中存储的是对象。二级缓存:二级缓存默认不.

2020-07-26 23:15:14 126

原创 mysql主键id不连续

唯一键冲突 、事务回滚、批量插入时申请主键的策略造成mysql中自增主键不连续批量申请自增主键时它的申请数量是乘2递增的,比如插入4条数据,第一条申请1个主键、第二个申请2个满足第二和三条数据插入时使用,第四条数据插入时还需要再申请一次,这次会分配4个主键,但是只用了1个,有3个就浪费了,并出现了id不连续。Char和varchar的区别:char是固定长度的,如果存入的数据长度不够则会使用空格补全,当检索char类型数据时会将尾部的空格去掉,varchar是可变长字符串,除了存储数据之外,还会存储

2020-07-26 22:08:11 768

原创 kafka为什么吞吐量高

1.使用了顺序读写,不需要磁盘的寻道时间,速度要比顺序读写快很多2.零拷贝,跳过了将数据复制到用户缓冲区的过程,减少的数据传输的时间3.文件分段处理,一个topic由多个patition组成,发送到该partition的消息日志以segment的形式分段存储,处理时也是以segmnet为基础,更加轻便,并易于并行处理。4.消息批量发送,在produce端发送到某partition的数据可以设置成批量发送,提高吞吐量,于batch.size linger.ms等参数有关5.消息在kafka传输

2020-07-26 16:10:14 265

原创 redis中的string数据结构

redis是使用c语言编码的,string的实现是使用了一种称为sds动态字符串的结构体,如下所示struct sdshdr { int len; int free; char buf[]; }len就是当前redis中key对应value的长度(已使用字节数),free指存储字符串数组buf的剩余空间(未使用字节数),即buf的长度为len+free+1,在C语言中字符串是由空字符为结尾的,这个1正是指结尾的空字符。结构如下图所示:因为redis中value值会经常发生变化

2020-07-25 16:34:24 637

原创 select、poll、epoll相关

select、poll、epoll都是IO多路复用机制,由单个线程处理多个文件描述符,由内核帮助我们监控文件事件是否准备就绪(一般是读写就绪),就绪后可以通知用户线程去进行相应读写操作。可以举个简单的例子(可能不是很恰当),在饭馆,有客人(文件描述fd)、服务员(内核)、老板(用户程序),在select、poll模式下,当客人准备结账时,服务员会告诉老板有人要结账,但没告诉老板是哪一桌,需要再轮询一遍;epoll模式下,服务员告诉老板1、2号桌结账,老板就可以去直接收钱。1.selectint

2020-07-25 11:25:38 189

原创 http相关

http与https的区别:1.https需要CA(Certificate Authority证书颁发机构)申请证书2.http使用的超文本传输协议,数据是明文传输,https是使用了ssl+http,数据为加密传输3.http端口为80,https是4434.http是无状态的,https会对传输内容进行加密、验证身份和数据完整性https请求流程1.首先服务器会利用非对称加密算法,生成自己的公私钥对2.服务器将自己的公钥,发送至CA证书颁发机构,利用颁发机构私有进行加密生

2020-07-15 22:56:03 118

原创 bean中字段获取配置文件中的数据

如果想要将配置文件中的配置信息赋于bean中字段可以使用@Value和@ConfigurationProperties这两种形式。在@Value中一般使用的是@Value(“${xxx.yyy.zzz:defaultValue}”)这种形式,我们可以获取配置文件中key对应的值,如果找不到该配置则使用后面跟的那个默认值。例如配置文件application.properties中有spring.application.name=myProjectfeign.hystrix.enabled=true

2020-06-29 23:37:18 2650

原创 AtomicInteger和volatile

由volatile关键字修饰的变量拥有的可见性和部分顺序性,更书面化的语言叫做不允许线程内部缓存和重排序AtomicInteger中的方法线程安全,它拥有一个volatile修饰的int类型的value值,我们通过AtoicInteger对象对value进行操作是线程安全的,以getAndIncrement()方法为例说明它是如何实现的,我们先看下源码public final int getAndIncrement() { return unsafe.getAndAddInt(th

2020-06-15 00:31:16 1909 1

原创 SpringBean依赖和三级缓存

spring中的bean依赖有大体上可以分为两类,共3中形式,下面简单介绍一下。第一类是构造方法中的循环依赖,这种会报错@Servicepublic class ServiceA { private ServiceB serviceB; public ServiceA(ServiceB serviceB) { this.serviceB = serviceB; } public void methodA(){ System.o

2020-06-11 01:04:09 6041 9

原创 LinkedHashMap简介

LinkedHashMap继承了HashMap类,默认情况下使用entryset获取的集合顺序是与节点的插入顺序一致的,需要特别指出的是,如果将要插入的节点key是已存在的,那么是不会对原顺序产生影响的。除去hashmap的逻辑之外,它其中维护了一个双向链表,头节点为head、尾节点为tail,默认是按照插入的顺序进行排列的,最先插入的节点(即最老的节点)为head.after,最新插入的节点为tail.before。LinkedHashMap中有一个参数为accessOrder,表示双向列表的排列顺序

2020-06-03 23:14:43 3388

原创 Spring Boot启动流程简介

每个spring boot项目都有一个启动类,如下所示:@SpringBootApplicationpublic class AppApplication { public static void main(String[] args) { SpringApplication.run(AppApplication.class, args); }}从上面可以看出来,项目的启动主要与@SpringBootApplication注解和SpingAppliction.r

2020-05-25 23:30:28 744 1

原创 redis-sorted set(zset)实现

redis数据结构与底层实现 string dict字典 list sds hash ziplist set quicklist sort set skiplist redis支持多种数据结构,本文仅就sorted set展开讨论。 sorted set与set结构一样均为string类型的对象,且不允许重复的元素,...

2020-04-06 20:42:16 4764

原创 线程池运行及拒绝策略

java中创建线程池的核心是使用ThredPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue)(1)当一个任务到来的时候如何它的核...

2019-06-30 20:54:44 2149

原创 synchronzied锁升级、锁粗化、锁消除

synchronized锁可以分为:偏向锁、轻量级锁、重量级锁。(1)偏向锁:根据研究发现,大部分的同步方法都是只有一个线程来重复的获取它,并不存在多线程来竞争锁的使用权,为了避免直接加锁造成的资源消耗,一开始获取同步方法使用权的时候使用的是偏向锁。当一个线程A想要获取同步方法使用权时,会先获取锁对象头部mark word区域的threadId变量,如果它为空或者threadId指向的是当...

2019-06-30 20:17:16 305

原创 ThreadLocal

ThreadLocal可以保存一个共享变量,在多线程环境下,每个线程可以对自己所获取的变量副本进行操作,而不会影响其他线程的变量副本。在ThreadLocal中主要有get()获取当前线程共享变量副本的值,set(T value)设置当前线程共享变量副本的值,intialValue()初始化当前线程共享变量副本的值。ThreadLocal初始化时可以重写intialValue进行初始化,否则默...

2019-06-25 23:22:47 289 1

原创 spring中BeanFactory和FactoryBean的区别

BeanFactory是一个factory,是spring的IOC的工场,而FactoryBean是个bean,它们两个只是名字很相似。BeanFactory是一个IOC工场,用于管理和创建Bean,它是IOC最基本的接口,为其他的IOC工场提供规范,很多其他的spring容器都实现了它,如ApplicationContext、XMLBeanFactory等。它提供了通过bean的名字获取实例...

2019-06-17 22:45:44 3818

原创 concurrentHashMap及CopyOnWriteArrayList、Collections.synchronizedList

concurrentHashMap是线程安全的hashmap,在java1.8之前的版本,concurrentHashMap结构为一个segment数组默认初始长度为16,每一个segment都是一个hashmap,Segment继承了ReentranLock来加锁,它的put、remove操作都需要获取segment数组的reentranLock锁,get操作不加锁,因为每个键值对的value是...

2019-06-16 21:57:15 430

原创 RPC原理

远程方法调用(RPC)的结构如图所示,一般我们还会有一个注册中心如zk、dubbo、eureka等,服务提供方将自己的向外提供的服务等信息注册在上面并暴露IP、端口等信息,而消费方通过在注册中心注册获取可以使用的服务列表,获取想要使用服务的各种信息,从而调用服务方提供的各种方法。简单来说,服务提供者将服务注册,并监听调用该服务的socket请求,当请求到来时,创建一个子线程获取想要调用的方法、...

2019-06-15 15:55:08 189

原创 HashMap相关

我们知道hashmap的扩容因子是0.75如果hashmap的数组长度已经使用了75%就会引起扩容,会新申请一个长度为原来两倍的桶数组,然后将原数组的元素重新映射到新的数组中,原有数据的引用会逐个被置为null。就是在resize()扩容的时候会造成线程不安全。另外当一个新节点想要插入hashmap的链表时,在jdk1.8之前的版本是插在头部,在1.8后是插在尾部那么hashmap什么时候进行...

2019-06-13 22:47:25 7018 1

原创 java中锁和synchorized的底层实现

java中要实现线程同步有两种方式:(显性锁)锁和(隐性锁)synchorized。synchnorized关键字:包括两种方式同步方法和同步代码块,它包括两种加锁方式,锁对象和锁类。(1)如果一个synchnorized的锁作用域是一个实例对象,假如该实例对象有多个synchorized方法或代码块,只要一个线程访问了该对象的一个synchorized方法(代码块),其它线程就不再能访问...

2019-06-12 23:40:25 1792

原创 CMS和G1垃圾回收器

Serial收集器:是一个单线程的年轻代收集器,当它运行进行垃圾回收时,其它工作线程必须被停止,直到它收集完成。serial依然是JVM client模式下的默认收集器,对于client模式是一个很好的选择。preNew收集器:它也是一个年轻代收集器,preNew收集器是serial收集器的多线程模式,除了使用多个线程进行垃圾回收外,其余与serial基本完全相同,preNew是jvm ser...

2019-06-12 18:48:42 3386 1

原创 数据库索引

在mysql中主键必须是聚集索引,而sql server中创建表的主键时必须依赖于索引,默认是聚集索引但是可以选择为非聚集索引。数据库中的数据的物理存储顺序与数据表中聚集索引的顺序相同,假设在mysql中id为主键也就是聚集索引,也就是说当我们查询id顺序在表中比较靠后的一条数据时,它在磁盘中存储的物理地址也比较靠后,同时又因为物理地址顺序与聚集索引的顺序相同,因此只能在一个表中建一个聚集索引...

2019-06-11 14:09:35 236

空空如也

空空如也

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

TA关注的人

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