自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 资源 (1)
  • 收藏
  • 关注

转载 【无标题】

UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。

2023-10-25 11:31:32 113

原创 @ResponseBodyAdvice & @RequestBodyAdivce失效

最近项目要有向外部提供服务的能力,但是考虑到数据安全问题,要对接口进行加解密;实现加解密的方案有很多,比如过滤器、拦截器、继承RequestResponseBodyMethodProcessor什么的,不过我最近正在了解@ResponseBodyAdvice @RequestBodyAdvice这俩注解,本着在实践中应用的目的,就准备使用这两个注解来实现加解密功能。然而,配置好后,请求怎么都进不到这两个注解的类里。

2023-10-20 19:01:54 1885

原创 系统调优几个维度考虑

前端:1、CDN前后分离:开发模式 动静分离:动态资源和静态资源分开存储缺陷:更新需要刷新缓存后端:1、jvm调优,需要对jvm参数调优,减少gc,和STW次数;选择合适的垃圾回收器2、使用redis缓存,减少db压力;数据一致性,雪崩、击穿、穿透3、数据库定位慢sql 索引优化、最左匹配原则、分库分表、4、MQ,利用mq削峰避免消息堆积,消费者批量消费+集群;整合K8S,当流量非常大的时候,快速扩容与缩容5、利用网关保护服务限流算法:漏斗、令牌桶、滑动窗口6、大...

2022-03-11 22:35:42 1000

转载 Join执行原理解析

1 概述一个完整的SQL语句中会被拆分红多个子句,子句的执行过程当中会产生虚拟表(vt),可是结果只返回最后一张虚拟表。从这个思路出发,咱们试着理解一下JOIN查询的执行过程并解答一些常见的问题。若是以前对不一样JOIN的执行结果没有概念,能够结合这篇文章往下看mysql2 JOIN的执行顺序如下是JOIN查询的通用结构sqlSELECT <row_list> FROM <left_table> <inner|left|right> J

2022-02-27 23:49:19 745

原创 QPS,TPS

QPS – query per second,单位时间的请求数TPS – transactions per second,单位时间的事务数,也就是吞吐量QPS和TPS有什么不同?要理解QPS和TPS的不同,首先要理解什么是事务,事务表示的是客户机向服务器发出请求直到收到服务器返回响应的过程。一个事务可能包含多个请求,比如浏览器打开URL就是发起了一个访问事务,但是最后返回结果可能需要向服务器发出多个请求,所以1个事务>=1个请求。识别事务,可以理解事务为一个功能单元。TPS表示每秒能够处理的事务数量

2022-01-16 09:55:26 580

转载 kafka 如何存储数据?为什么这么快?

Kafka 依赖于文件系统(更底层地来说就是磁盘)来存储和缓存消息。在我们的印象中,对于各个存储介质的速度认知大体同下图所示的相同,层级越高代表速度越快。很显然,磁盘处于一个比较尴尬的位置,这不禁让我们怀疑 Kafka 采用这种持久化形式能否提供有竞争力的性能。在传统的消息中间件 RabbitMQ 中,就使用内存作为默认的存储介质,而磁盘作为备选介质,以此实现高吞吐和低延迟的特性。然而,事实上磁盘可以比我们预想的要快,也可能比我们预想的要慢,这完全取决于我们如何使用它。有关测试结果表明,一个由6

2022-01-12 23:25:35 449

转载 主题(Topic)与分区(Partition)

在 Kafka 中还有两个特别重要的概念—主题(Topic)与分区(Partition)。Kafka 中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题(发送到 Kafka 集群中的每一条消息都要指定一个主题),而消费者负责订阅主题并进行消费。主题是一个逻辑上的概念,它还可以细分为多个分区,一个分区只属于单个主题,很多时候也会把分区称为主题分区(Topic-Partition)。同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日

2022-01-10 22:02:56 1899

原创 spring容器启动流程?

1. 构造一个beanfactory在调用AnnotationConfigApplicationContext的构造方法之前,会调用父类 GenericApplicationContext的无参构造方法,会构造一个BeanFactory,为 DefaultListableBeanFactory。2. 构造AnnotatedBeanDefinitionReader(主要作用添加一些基础的PostProcessor,同时可以通过reader进行BeanDefinition的注册)3..构造Clas..

2022-01-09 23:09:04 647

原创 spring用到的设计模式

spring面试题总结1) 工厂模式2) 单例模式:存储单例bean的一级缓存3) 代理模式:AOP4) 模板方法:容器刷新refresh()方法5) 观察者模式:spring的事件驱动模型,ApplicationEvent事件,ContextStartedEvent 启动后触发的事件; ContextStoppedEvent 停止后触发的事件; ContextRefreshedEvent 初始化或刷新完成后触发的事件; ContextClosedEvent 关闭后触发的事 件Ap...

2022-01-09 23:08:31 322

转载 spring IOC

spring是一个框架,所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。Spring中提供了两种IoC容器:BeanFactory ApplicationContext我们可以看到,ApplicationContext是BeanFactory的子类,所以,ApplicationContext可以看做更强大的BeanFactory,他们两个之间的区别如下:BeanFactory。基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定.

2022-01-07 23:36:04 68

转载 zk leader选举

zookeeper集群配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。这篇主要分析leader的选择机制,zookeeper提供了三种方式:LeaderElection AuthFastLeaderElection FastLeaderElection默认的算法是FastLeaderElection,所以这篇主要分析它的选举机制。选择机制中

2022-01-02 21:53:02 1549

原创 rocketmq架构简述

1、nameServer类似kafka中的zk。zk有主从,同步数据。nameserver主要维护路由信息,相互之间不通信,性能提高很多;意味着NameServer中任意的节点挂了,只要有一台服务节点正常,整个路由服务就不会有影响2、存储所有的消息是存储在CommitLog文件中,不区分topic;consumerQueue 记录的是基于topic的消息索引文件,是有序的。indexFile记录的是基于key或时间区间的消息的映射文件,也是有序的。3、broker与kafka..

2021-12-30 23:22:56 1094

原创 kafka、rabbitmq、rocketmq 浅谈

关注知识面1、rabbitmqerlang语言开发,吞吐量低(单机在万级别)、消息积累影响性能、社区活跃,不利于java二次开发,需学习AMQB协议。优势:社区活跃。劣势:吞吐量低,消息积累影响性能,学习成本高。学习什么是AMQB协议2、rocketmq吞吐量高(单机十万级)、 java实现方便二次开发,参考kafka架构,高可靠(消息0丢失)。优势:方便java二次开发、高可靠(适用于互联网、金融)劣势:社区活跃度不高为什么可以做到消息0丢失3、kafk

2021-12-30 22:58:46 1208

原创 RocketMQ 核心源码

RocketMQ 由NameServer 集群、Producer 集群、consumer 集群、broker 集群组成。一、消费生产大致原理1. Broker 在启动的时候向所有NameServer 注册,并保持长连接,每30s 发送一次心跳。2. Producer 在发送消息的时候从NameServer 获取Broker 服务器地址,根据负载均衡选择一个服务器来发送消息3. Consumer 消费消息同样是从NamerServer 获取Broker 地址,然后主动拉取消息。Topic...

2021-12-29 22:18:34 781

原创 设计模式OO原则

设计原则和设计模式原则是在模式之下,比模式更抽象(模式是解决方案层面上),原则是一种指导思想,更难理解。SOLD原则1、单一原则一个类只有一个引起变化的原因;职责-设计类时,关注职责;如果多于一个动机去改变这个类,那就不是单一职责。克制一个类中写多个职责软件设计更多关注的是职责和相互分离2、开闭原则ocp功能对修改关闭,多扩展开放原则实现途径:策略模式(横向扩展)、模板模式(纵向扩展)、桥接模式关键是抽象;OOD核心开发人员应该仅仅对程..

2021-12-29 22:10:22 184

原创 redis 分布式锁

redis的分布式锁,可以按以下步骤进行完善1、使用redis.setnx(key,value)弊端:加锁后,后续业务代码发生异常,所以要加try{}catch{}finally{redis.delete(key)}2、第一种方法,如果加锁后,服务宕机,则finally执行不到该key就无法释放,所以要加过期时间使用redis.setnx(key,value,expire)3、第二种方法存在的问题现象:如果某一线程在加锁后的业务逻辑执行时间超过上锁时间;异常发生:就会导致第一个线

2021-12-27 22:10:53 435

原创 redis过期删除策略

Redis对于过期键有三种清除策略1、被动删除key到过期时间后,不会里面从内存中删除,而是等到下次这个key被查询的时候,通过判断是否过期来删除。缺点:如果key之后永不使用,就会造成内存泄漏。2、主动删除由于被动删除,无法删除一些冷数据,所以会触发主动删除,主动删除又包含:定时删除:在设置键的过期时间的同时,创建一个定时器( timer ). 让定时器在键的过期时间来临时,立即执行对键的删除操作。 定期删除: 每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删

2021-12-27 17:51:15 301

原创 Redis常见问题

一、缓存穿透现象:一些请求,在redis中没有缓存,同时数据库中也没有内容,导致redis和DB都没有查到数据,相当于这两层被请求打穿了。黑客会利用此漏洞,大量发送无效的请求,从而导致redis或db宕机。解决:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力

2021-12-27 17:39:29 789

原创 Redis中跳跃表浅析

一、前言 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。 在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。 Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(m...

2021-12-26 20:00:09 151

原创 redis集群三种架构模式

主从模式可以实现读写分离,数据备份。但是并不是「高可用」的哨兵模式可以看做是主从模式的「高可用」版本,其引入了Sentinel对整个Redis服务集群进行监控。但是由于只有一个主节点,因此仍然有写入瓶颈。Cluster模式不仅提供了高可用的手段,同时数据是分片保存在各个节点中的,可以支持高并发的写入与读取。当然实现也是其中最复杂的。

2021-12-25 20:29:24 880

原创 redis数据同步

salve节点启动同步数据slave断点续传

2021-12-24 22:50:37 243

原创 redis持久化

RDB在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。可以手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件Save是同步的,会阻塞bgSave是异步的Rdb缺陷:在执行rdb前,宕机会丢数据AOF修改配置文件来打开 AOF 功能:# appendonly yes

2021-12-24 22:48:21 345

原创 redis底层数据结构-List

列表对象有两种底层实现结构 压缩列表(zipList)实现的列表对象 压缩列表(zipList)是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值,如图压缩列表的每个节点Entry构成如下previous_entry_ength:以字节为单位,记录了压缩列表中前一个字节的长度。利用此原理即当前节点位...

2021-12-23 19:56:53 2666

原创 redis底层数据结构 -String

redis包含5种常用数据结构String 、List、Hash、Set 、ZsetString字符串不同的外在形式以set为例redis其实可以理解为 K-V数据库,因此对每个键值对都会有一个 dictEntry,里面存储了指向 Key 和 Value 的指针;next 指向下一个 dictEntry,与本 Key-Value 无关key可以看出 key不是直接存的字符串,而是一个SDS结构valuevalue既然不是存的String,也不...

2021-12-22 22:04:00 3587

原创 事务隔离级别

事务具有以下4个特性ACIDA:原子性,事务中的一组操作,一起成功或一起失败C:一致性,事务中的多个操作的数据,数据状态一致I:隔离性,一个事务不会影响另一个事务中的数据D:持久性,事务执行完后,落表事务问题脏写:后面的事务值覆盖了前一个事务内的值脏读:事务B读到了事务A未提交的数据,事务A的数据可能回滚。不可重复读:事务B内相同的查询语句在不同时刻查到的结果不同幻读:事务读取到了其他事务新增的数据,主要说的是新增数据。表锁/行锁表锁 开销小,加锁快

2021-12-21 21:56:27 49

原创 MVCC多版本并发控制保护机制

数据库的默认隔离级别是 Repeat_Read(可重复读),解决了隔离级别为读已提交下,不可重复读的问题;Repeat_Read底层其实用到的是MVCC机制。MVCC机制的基石是:undo日志链和 一致性视图read_view数据库中每个事务对数据的修改,都会生成一条undo日志,用于发生异常时进行回滚。undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联

2021-12-20 23:00:44 731

原创 Spring AOP浅析

AOP初识专业术语:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。简单地去理解,其实AOP要做三类事:在哪里切入,也就是权限校验等非业务操

2021-12-02 23:34:56 322

原创 AQS -1

锁的粗化public synchronized void increase() { System.out.println("1");}public synchronized void increase2() { System.out.println("2");}public synchronized void increase3() { System.out.println("3");}上面代码等价于SynchronizedTest lock = ne

2021-11-13 22:12:13 229

转载 Synchronized

是jvm的内置锁,饮食锁。ReentrantLock 是显示锁synchronized在java<1.6版本的时候,性能很低,依赖java对象锁。synchronized的应用场景有三个:1、修饰实例方法2、修饰静态方法3、修饰代码块应用场景示例:1、修饰实例方法正常场景异常场景结论:synchronized修饰实例方法时,如果实例对象不同,结果会错误;只有相同的实例才能得出正确结果2、修饰静态方法结论...

2021-11-13 13:47:31 166

转载 Redis MGET性能衰减分析

MGET是redis中较为常用的命令,用来批量获取给定key对应的value。因为redis使用基于RESP (REdis Serialization Protocol)协议的rpc接口,而redis本身的数据结构非常高效,因此在日常使用中,IO和协议解析是个不容忽略的资源消耗。通过mget将多个get请求汇聚成一条命令,可以大大降低网络、rpc协议解析的开销,从而大幅提升缓存效率。mget的定义如下(来自REDIS命令参考):MGET key [key ...]返回所有(一个或多个)给定 ke

2021-07-16 22:44:11 3656

原创 idea快捷键设置

1、直接进入方法实现类内keymap -> Navigate -> go to implementation 2、

2021-05-27 11:32:03 223

原创 RPC与HTTP协议理解

其实计算机里面的很多概念都是来源于现实世界的,通过现实里面具体的例子来理解RPC。A:代表一栋大楼(相当于一个大的服务端内网集群),B:代表大楼内的一个个房间(每个房间相当于一个应用框架),C:代表人员管理机构(相当于楼管处或者各级人口管理部门)。首先,在项目架构比较简单的时候,可能一个项目就一个统一的框架,一种语言,这时候我们程序里面的一个方法里面可能会调用N个其他的方法,但因为都是在同一个框架内,都属于框架级的内部调用,这个时候自然用不到RPC,RESTful足以满足当前场景。 但是当你的项目架构越来越

2021-01-27 20:59:58 281 1

原创 多表连接查询和多次单表查询抉择

一般数据不大的情况下多表连接查询和多次单表查询的效率差不多。如果数据量足够大,那肯定是多次单表查询的效率更高。在很多大的公司里面,都会禁用多表连接查询,原因就是一旦数据量足够大的时候多表连接查询效率会很慢,而且不利于分库分表的查询优化。那么看一下下面这个例子。两种查询方式的比较我这里有一个数据库,我们拿里面的客户表和地区表做两种查询的对比。用户表数据是31万条,地区表3511条。1. 使用连表查询成都市用户数2.使用多次单表查询客户总数可以看到,查询出来的结果都是一样,但是第一种的连表查询用了0

2021-01-09 23:05:32 4951

原创 简述redis主从同步的过程

参考答案:1.从服务发送一个sync同步命令给主服务要求全量同步。2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成RDB文件,并将RDB文件发送给从服务。3.从服务再将接收到的RDB文件载入自己的redis内存。4.待从服务将RDB载入完成后,主服务再将缓冲区所有写命令发送给从服务。5.从服务在将主服务所有的写命令载入内存从而实现数据的完整同步。6.从服务下次在需要同步数据时只需要发送自己的offset位置(相当于MySQL bin

2020-08-26 14:38:47 518

原创 如何保证服务不受第三方影响?

上周有个朋友问我说:我们有很多服务依赖第三方接口,他们的接口不稳定,从而影响我们的服务,有没有什么方法避免?今天和大家聊一聊这个问题。首先,可以将第三方接口,收口到一个服务内。这样,可以避免每个调用方都依赖于第三方服务:(1)解除调用方与第三方接口的耦合;(2)当第三方的接口变动时,只有服务需要修改,而不是所有调用方均修改;此时,接口调用流程是什么样的呢?如上图1-4所述:(1)业务调用方调用内部service;(2)内部service跨公网调用第三方接.

2020-07-31 21:47:04 923

原创 volatile底层理解

并发编程中,最常用的两种机制:Synchronized和Volatile;Synchronized是共享资源在并发情况下常用方法来保证数据一致。Volatile是java虚拟机提供的最轻量级的同步机制主要适用于读多写少的场景,作用有一、保证共享变量可见性,二、内存屏障禁止指令重排序。volatile可见性说volatile可见性前,需要先了解java的内存模型,也就是JMM;问题如果多个线程同时去内存读取共享变量到各自的私有内存再做处理,那么多个线程彼此是不知道对共享变量做了什么操作的,可能就会导

2020-07-19 23:29:46 360

原创 CMS流程

口诀法:C初并重清(初始标记、并发标记、重新标记、并发清除)整个过程分为 4 个步骤,包括:初始标记 :仅仅只是标记一下 GCRoots 能直接关联到的对象,速度很快,需要停顿(STW-Stoptheworld)。并发标记:从 GCRoot 开始对堆中对象进行可达性分析,找到存活对象,它在整个回收过程中耗时最长,不需要停顿。重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿(STW)。这个阶段的停顿时间一般 会比初始标记阶段稍长一些,但远比并发标记的

2020-07-16 14:12:20 1510

原创 显示锁&AQS

显示锁主要由lock锁 2. ReentraLock 3.ReadWriteLock 4.Condition锁普通的lock锁使用wait()使线程阻塞。notifyAll()通知阻塞线程;会将所有处于阻塞的线程唤醒。lock获取、释放锁使用public class LockTest { private long count =0; private Lock lock = new ReentrantLock(); public long getCount() { return

2020-06-27 20:30:40 128

原创 CAS基础笔记

CAS的全称是compare and switch (比较并且交换),是解决多线程安全的一种方法;是一种自旋锁也是乐观锁,而synchronized锁是一种悲观锁。CAS其实是计算机的指令,格式为:(变量内存地址,变量旧值,变量新值)。CAS问题:ABA问题线程一:A->B->A线程二:A- - - >C线程一和线程二同时读取到了变量A到各自的私有内存中,线程一运行的比较快,将变量A变为B后,又变为了A;此时线程二才执行到CAS指令,根据自己保存的变量A地址去内存.

2020-06-27 16:13:46 338

原创 ThreadLocal笔记

ThreadLocal会copy一个变量副本放到当前线程中。结构模型每个线程都有ThreadLocal.ThreadLocalMap threadLocals = null;一、写操作我们平常的业务代码里写的:ThreadLocal<String> threadLocal = new ThreadLocal<>();threadLocal.set("bike"+value);threadLocal.set()方法底层的操作:ThreadLo

2020-06-26 17:05:22 134

spring aop详解.docx

第22天 spring aop详解.docx

2021-12-02

空空如也

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

TA关注的人

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