自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(124)
  • 问答 (18)
  • 收藏
  • 关注

原创 面试项目介绍看这一篇就够了

采用springcloud分布式架构,注册中心及配置中心使用nacos,网关使用gateway,使用redisson做缓存及分布式锁, 采用rockemq做消息推送及解耦,mysql数据库根据担保公司及年份做分库分表,对外数据交互采用加密传输数据。全局异常报警采用发送钉钉信息,项目使用了工厂,代理等常用的设计模式,采用多线程并发处理数据初始化,定时任务采用xxjob。7. redis 分布式锁,集群,哨兵,常见数据结构。8. 什么是缓存击穿,雪崩,穿透,及解决方案。3. mysql事务的七种传播特性。

2023-07-09 16:24:53 225

原创 多线程面试看这一篇就够了

它可以保证对变量的读写操作具有原子性,并且能够利用底层硬件的原子指令或者类似机制来达到高效的并发处理。AtomicLong 是 Java 并发包中的一个类,它提供了一种线程安全的方式来进行长整型数据的原子操作。公平锁会根据线程等待的时间先后顺序来分配锁资源,而非公平锁则不保证线程获取锁的顺序。否则,不做任何操作。这使得在复杂的线程协作场景中,使用 Lock 可以更加灵活地控制线程的执行顺序。ReentrantLock)提供了更细粒度的控制,可以只对特定代码块进行加锁,从而减小了锁的粒度,提高了并发性能。

2023-07-07 16:21:52 164

原创 jvm面试题看这一篇就够了

缓存一致性协议(如MESI)确保了多个处理器之间对于共享数据的操作的一致性。内存屏障(Memory Barriers):内存屏障是硬件或指令级别的机制,用于控制指令执行的顺序以及对内存的读写操作的可见性。有序性(Ordering):JMM保证程序执行的顺序按照开发者编写代码时的顺序执行,但允许编译器和处理器进行重排序来提高性能,只要重排序不会改变单线程程序的执行结果即可。需要注意的是,虽然堆、方法区和运行时常量池是线程共享的,但对于具体的数据访问和操作,可能会涉及到同步机制,以确保数据的一致性和线程安全。

2023-07-07 09:40:22 195

原创 redis面试题看这一篇就够了

这样可以保证 Redis 中的数据与 MySQL 的变更保持一致。需要注意的是,在进行槽迁移时,可能会对集群产生一定的网络和计算负载,因此在设计和操作集群时要考虑到这些因素。3 volatile-lru:当内存空间不足以容纳新写入的数据时,Redis 会优先删除具有 TTL 的键中最近最少使用(Least Recently Used,LRU)的键,然后再删除其他键。5 volatile-random:当内存空间不足以容纳新写入的数据时,Redis 会从具有 TTL 的键中随机选择一个进行删除,并释放空间。

2023-07-06 15:57:59 100

原创 rocketmq面试题 整理

偏移量是一个表示消息在消息队列中位置的数字值。消费者可以根据偏移量来记录自己已经消费了哪些消息,并且在下次拉取消息时指定起始的偏移量,从而实现消息的精确消费控制。在RocketMQ中,每个消息都有一个唯一的消息ID,用于标识消息的唯一性。因此,RocketMQ中的偏移量和消息ID是两个不同的概念,分别用于消息的消费进度跟踪和消息的唯一标识。为了加速消息的检索,RocketMQ使用索引文件来记录消息的偏移量和关键词索引。索引文件中的索引条目包含消息的关键词和消息在CommitLog中的物理偏移量。

2023-07-06 14:08:53 931

原创 Kafka读这一篇就够了

这包括重新选举分区的领导者、分配新的副本等操作,以确保集群的高可用性和数据的持久性。Segment 文件的大小可以事先配置,当文件达到指定大小时,会创建一个新的 Segment 文件来接收新的消息。这个索引结构采用稀疏索引的方式,记录了一些关键点的位置,以便在查询消息时能够快速定位到所需的位置,而不需要遍历整个文件。然后,新的分区分配将发生,将可用的分区重新分配给消费者。6.通过使用分区的 Segment,Kafka 实现了高效的消息存储和检索,并能够支持大规模的数据处理和容错性。

2023-07-05 16:10:11 118

原创 rockeqMQ 消息存储机制整理

消息队列文件是指存储具有相同属性(如Topic、队列ID等)的消息的文件,一个 Topic 包含多个消息队列,每个消息队列对应一个消息队列文件,RocketMQ采用了顺序写入、随机读取的方式存储每个消息队列中的消息,确保高效的写入速度和随机读取速度。总的来说,RocketMQ中的topic、消息队列和分区之间的关系是:topic下包含多个消息队列,每个消息队列下又包含多个分区,每个分区包含有序的消息,并由消息消费者进行并发消费和处理。顺序消费者则消费队列中的消息,从而保证消息的消费顺序和发送顺序一致。

2023-06-20 18:13:27 717

原创 springboot shardingSphere 自定义分库分表策略

1}.user_{0…table-strategy和database-strategy用于设置分表和分库策略,其中algorithm-expression表示按照id模2的值路由表和库,即id为偶数时路由到0表/库,id为奇数时路由到1表/库。该方法用于根据分片键的值将数据分配到对应的数据库中,其中availableTargetNames为可用的目标数据源的名称,shardingValue为分片键的值。同理,对于用户id为n的用户,根据n%2的值进行路由,如果为0则路由到db0库,否则路由到db1库。

2023-06-17 16:50:14 1900

原创 SkyWalking全链路追踪,整合elasticSearch例子

SkyWalking是一个面向分布式服务架构的应用性能管理工具,可以通过SkyWalking的Agent来收集服务的信息并进行分析。SkyWalking默认使用Elasticsearch作为数据存储和查询引擎,可以将采集到的数据发送到Elasticsearch进行存储。在以上代码中,我们将采集到的SkyWalking数据写入到了Elasticsearch中。3.启用Elasticsearch传输插件。4.编写SkyWalking数据查询API。2.配置SkyWalking。

2023-06-17 16:41:34 572

原创 【无标题】

点对点模型(Point-to-Point Model):这种模型中,消息的发送者发送消息到一个特定的目标队列中,然后由消息的接收者从该队列中获取消息并将其删除。发布订阅模型(Publish-Subscribe Model):这种模型中,消息的发送者发布消息到一个主题(Topic)中,所有订阅了该主题的接收者都会收到该消息。2存储消息:消息服务器(Broker)接收到生产者所发送的消息后,将消息存储在内存缓冲区中,并在内存缓冲区达到阈值后将消息写入到磁盘中。2.RocketMQ的架构是什么样子的?

2023-06-15 20:59:02 1057

原创 fegin负载均衡策略示例

Ribbon 的原理实际上很简单,主要是通过向服务注册中心(如 Eureka)获取可用的服务实例列表,然后基于配置的负载均衡策略选择一个服务实例进行访问。在轮询的基础上,加入每个服务实例的权重,根据权重计算出实例的响应时间,响应时间越短的实例被选中的概率越大,从而优化了负载均衡的效果。总之,Ribbon 的负载均衡策略实现简单、易于扩展,并且能够提高服务的可用性和可靠性,是服务调用中常用的负载均衡组件之一。按顺序选择一个可用的服务实例进行访问,如果选择的服务实例出现故障,则跳过该实例并继续选择下一个实例。

2023-06-05 16:36:49 1215

原创 Sentinel实现熔断限流降级

相反,Sentinel 更加年轻,其社区活跃度相对较高,功能也在不断增加(例如,Sentinel 2.2 版本加入了热点参数规则、总调用链路限流等功能)。综上,虽然 Hystrix 有着令人信赖的稳定性和经过实际验证的性能优化,但在可扩展性、功能特性和社区活跃度方面,Sentinel 得到了更多的关注。Hystrix 仅仅提供了熔断和限流的基本功能,而 Sentinel 除了这些功能外,还提供了对热点参数的限流、统计信息预警、动态规则等更加丰富和灵活的功能。降级的代码写入调用方或者客户端。

2023-06-05 16:19:37 547

原创 hystrix 熔断限流降级示例区别

这样做的好处是,可以针对不同的业务场景,对不同的方法进行不同的熔断限流降级策略,也方便对不同的性能指标进行细粒度评估和监控。但是,对于一些公共的方法,例如系统的登录、注册等方法,在进行熔断限流降级的时候,可以统一地对所有调用该方法的服务进行熔断限流降级配置,以保证系统的稳定性和可靠性。降级是客户端也就是调用方判断,即调用的方法不可用或超时,调用预制好的降级方法(降级方法由服务端即被调用方提供)熔断是服务端判断的,个人认为难点在于判断熔断的指标配置,当达到熔断阈值,则会直接调用熔断方法。

2023-06-05 15:55:34 701

原创 log4j2.xml配置解析

日志器分根日志器Root和自定义日志器,当根据日志名字获取不到指定的日志器时就使用Root作为默认的日志器,自定义时需要指定每个Logger的名称name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别level,相加性additivity(是否继承下面配置的日志器), 对于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源AppenderRef;NoSql:MongoDb, 输出到MongDb数据库中。

2023-05-04 11:52:56 1846

原创 Lambda的Optional处理null值

2020-09-02 10:09:06 1360

原创 git 常用指令

1、回退命令:回退到上个版本git reset --hard HEAD^回退到前2次提交之前,以此类推,回退到n次提交之前git reset --hard HEAD~2退到/进到 指定commit的sha码git reset --hard commit_id2、强推到远程:git push origin HEAD --forcegit 版本找回方法在 git reset --hard 之后,git 的版本会回退。这个时候,需要使用 git reflog 去查看之前的操作然后, 找到

2020-08-18 18:06:32 143

原创 lambda常用方法汇总

public class AdjustTests {public static void main(String[] args){ Person p1 = new Person(1,"张三","男",18,new BigDecimal(100)); Person p2 = new Person(2,"李四","女",16,new BigDecimal(200)); Person p3 = new Person(3,"王五","男",18,new BigDecimal(300));

2020-08-12 18:21:10 772

原创 Long型比较是否相等的四个方法

Long a = 200L; Long b = 200L; System.out.println(a.equals(b)); System.out.println(a.longValue()==b.longValue()); System.out.println(a-b==0); System.out.println(a.compareTo(b) == 0);共四种方法,前两种较为常用。注意如果比较的值在-128到12..

2020-07-01 14:17:32 7087

原创 关于Controller层向前端返回枚举类型的字段结构优化

经常碰到类似订单状态返回,数据库只存储了状态数字,而前端要展示对应值这种情况,如何在后台进行优雅的处理呢,我来分享一种方案。如果查询返回的是实体类,则新建专门用于返回前端的DTO类,DTO类继承实体类,新增一个属性返回状态对应的文字public class SupplierRebateResDTO extends SupplierRebate { private String rebateTypeStr; }重写实体类中的状态的set方法 @Override public vo

2020-05-13 15:04:49 954

原创 list lamda排序及多次分组

日期类型排序 List<Date> datas = new ArrayList<>(); String s1 = "2019-08-10 22:18:22"; String s2 = "2018-08-10 22:18:22"; String s3 = "2017-08-10 22:19:22"; Date...

2019-12-05 15:43:41 1109

原创 git 常见错误总结

git push 时,报错如下To https://g*********.git ! [rejected] stage -> stage (fetch first)error: failed to push some refs to 'https:/**.git'hint: Updates were rejected because the remote c...

2019-09-20 18:59:00 275

原创 创建线程的四种方式

1.继承于Thread类,重写run()方法;2.实现Runable接口,实现里面的run()方法;前两种不用多说3.使用 FutureTask 实现有返回结果的线程,可以返回线程执行结果public class Test { public static void main(String[] args) throws InterruptedException, ExecutionExc...

2019-08-22 10:40:47 123

原创 session,cookie,token的一点理解

cookie的出现是为了解决http协议的无状态问题,cookie是存储在浏览器中的。用户登录后,将登录信息写入cookie,浏览器每次访问携带,来证明登录的合法性。cookie要携带登录用户的信息,这样造成了不安全性,session就是为了解决这个问题。session将用户信息存储在服务器,将生成的唯一id存入cookie,也就是sessionId。这样cookie每次只携带sessionId...

2019-08-21 14:43:31 143

原创 http协议详解

三次握手第一次握手客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。第二次握手TCP服务器收到请求报文后,如果同意连接,则发出确认报文...

2019-08-20 14:42:49 407

原创 高级java工程师面试题

1.char为什么比varchar快?varchar存储的时候前两个字节会存储整个字符串的长度,最后一个字节会存储标志符。varchar读取到内存中的时候,是最大的设置,比如varchar(200),虽然实际值存储4个字符,但是在内存还是会占用200字符。varchar如果长度过大,还会造成拆分或者分页机制。如果频繁的修改字符串的长度,varchar还要涉及重新计算长度等。总体来说,char快的...

2019-08-20 09:38:04 1075

原创 spring动态代理的实现方式

java动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。cglib动态代理: 利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。JDK动态代理和CGLIB字节码生成的区别?JDK动态代理只能对实现了接口的类生成代理,而不能针对类CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中...

2019-08-15 18:31:25 2191 1

原创 设计模式终篇

18解释器模式解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。用的地方比较少。19备忘录模式备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。介绍意图:在不破...

2019-08-15 18:20:19 145

原创 设计模式中篇

9桥接模式实现的系统可以多角度分类,每一个分类又有多种变化,就把变化分离出来让它们独立变化,减少耦合。适用场景:当需要大量的继承类处理的时候,造成有大量的继承类,可以适用桥接模式。桥接模式用聚合和合成代替继承。例如手机有多个品牌,每个品牌有各自多个功能,这会涉及大量的继承。10模板模式在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类...

2019-08-15 11:41:19 117

原创 设计模式首篇

首先说设计模式六大法则:1.单一原则(Single Responsibility Principle):一个类只负责一项职责,尽量做到类的只有一个行为原因引起变化;  a、业务对象(BO business object)、业务逻辑(BL business logic)拆分;2.里氏替换原则(LSP liskov substitution principle):子类可以扩展父类的功能,但不能改...

2019-08-14 18:29:37 149

原创 spring aop知识点整理

Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。Pointcut(切点):表示一组 joint point,这些 joint...

2019-08-12 18:46:51 312

原创 kafka基础知识扫盲

kafka的主题会分为多个区,生产者发送到kafka的同一主题的消息会分散到多个区,这其中有几个策略实现的原理也很简单List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); return Math.abs(key.hashCode()) % partitions.size();简单来说是通...

2019-08-08 17:03:08 272

原创 countDownLatch与cyclicBarrier的区别

countDownLatch举例说明public class countDownlatchTest { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(5); f...

2019-08-07 11:43:22 119

原创 多线程callable

传统的thread里面,在执行完任务之后无法获取执行结果。通过共享变量或者使用线程通信获取结果,比较麻烦。就是Runnable接口,线程的真正业务在run里面。jdk1.5 开始提供Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。二 futureCallable 和Future位于java.util.concurrent 包下。Callable 是个接口,...

2019-08-07 10:33:02 114

原创 2pc,3pc协议

参考 倪超 所著书籍《从poaxs到zookeeper 分布性一致协议》2pc3PC无论2PC或3PC,均无法彻底解决分布式一致性问题。解决一致性问题,唯有Paxos 。

2019-08-06 21:18:55 936

原创 zookeeper原理解析

zookeeper采用zab协议作为数据一致性的核心算法。所以我们要先去理解zab协议zab协议的核心是定义了那些会改变zookeeper服务器数据状态的事务请求的处理方式:所有的事务请求必须由一个全局唯一的服务器来协调处理,这个服务器被称为leader,而余下的服务器称为follower。leader将客户端的事务请求转换为一个事务Proposal(提议),并将改proposal分发给集群中...

2019-08-06 16:54:12 261

原创 session跨域及解决办法

什么是session共享在分布式系统中,所有服务器的session应该统一管理,不能如传统一般,各个服务器保存各自的session。例如单点登录问题,就用到了session共享。session共享带来的新的问题,就是如何才能session跨域。什么是session跨域客户端请求的时候,请求的服务器,不是同一个IP,端口,域名,主机名的时候,都称为跨域如果跨域,session是无法被浏览器...

2019-07-31 11:48:41 5144

原创 spring事务的传播行为及分析

先明确一个问题,如果设置了事务,同时用try catch捕获异常,那么事务会回滚吗?为什么不会滚呢??是对spring的事务机制就不明白。!!默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。 spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runti...

2019-07-30 20:32:17 247

原创 数据库隔离级别及原理

数据库的隔离级别是通过共享锁和排他锁实现的。锁又可以分为表锁,页锁,行锁数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。脏读:读到的不是最新的数据不可重复读:读到是是最新的数据,但是一个事务中如果多次读取,可能每次读到...

2019-07-30 17:21:46 1763

原创 时区 夏令时造成的问题

记录一次大坑的经过。项目在记录会员生日的时候发现在1974,1975,1979的特定月份,会员的生日信息写入到数据库会早一天。比如实际生日是1974-07-06,写入到数据库就会变成1974-07-05。因为项目是为台湾企业做的,想到是由时区引发的问题。台湾在80年代之前和大陆在1986-1991这些年间实行过夏令时,也就是说这些年份大约在4月某一天会调快一小时,9月初又会调慢一小时。写入到数据...

2019-07-26 18:32:26 2143

原创 redis集群删除从节点命令

本文是因为笔者在查询从redis集群中删除一个从节点引发的,网上好多博客说利用redis-trib.rb命令,但是在redis5.0之后,该命令就已经被废弃,集群操作使用redis-cli闲话少说,下面是集群的常见命令客户端登录redisredis-cli -h 192.168.3.117 -p 6380显示集群信息cluster nodes为集群中的主节点(192.168.3.1...

2019-07-23 16:57:00 5799

空空如也

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

TA关注的人

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