自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是代理模式,有哪些应用?

代理模式是一种结构设计模式,它允许通过创建代理对象来控制对其他对象的访问。代理对象充当原始对象的接口,客户端通过代理对象间接地访问原始对象,并可以在访问过程中添加额外的逻辑或控制。代理模式的主要目的是通过引入代理对象,为原始对象提供一层间接访问的方式,以实现对原始对象的控制、保护或增强。他的常用场最有以下几个: 1.远程代理:在分布式系统中,代理模式可用于代理远程对象。远程代理隐藏了远程对象的实际实现细1、3节,使客户端可以像访问本地对象一样访问远程对象。如Dubbo的实现就是用到了代理模式。2、动态代理

2024-05-06 16:09:29 361

原创 什么是模版方法模式,有哪些应用?

模板方法模式是一种行为设计模式,他的主要作用就是复用代码。在很多时候,我们的代码中可能会有-些公共的部分并且还有一些定制的部分,那么公共这部分就可以定义在一个父类中,然后将定制的部分实现在子类中。这样子类可以根据需要扩展或重写父类的方法,而不需要改变算法的结构。我们通常会把模板方法模式和策略模式一起使用,因为当我们使用策略模式的时候,会把具体的策略实现在策略服务里面,但是还剩下一些通用的逻辑,就可以通过模板方法模式进行复用。以上是一个抽象类,这个类中有一个具体的方法applyCoupon,其中定义了一个优

2024-05-06 16:04:41 270

原创 什么是设计模式?有什么好处?

首先,设计模式是一些前人经验的一些总结,所以,当遇到相似的问题的时候,我们可以直接借鉴好的设计模式来实现,这样可以。设计模式是在软件开发过程中经常遇到的问题的。它们是经过无数的验证和经验积累的。

2024-04-24 13:07:02 272

原创 Git如何回滚代码?reset和revert什么区别?

Git的代码回滚考察的是纯纯的实操了,根据代码所在的位置不同,回滚的方式也不一样。,如果你只是想撤销本地文件的修改并恢复到上一次提交时的状态,可以使用。本地文件修改-》commit到分支上-》push到仓库中。,想要撤销这一次的提交的话,那么可以使用。如果你的代码本地修改后,使用了git。

2024-04-24 12:55:05 396

原创 Git和SVN有什么区别?

Git可以轻松地创建、合并、删除分支,支持多个分支并行开发,并提供了一些高级分支管理工具,如rebase、cherry-pick等。Git和SVN在内部实现上也存在差异。,每个开发者本地都有一份完整的代码仓库,可以离线工作、本地提交、本地回滚等操作,不依赖于中央服务器。Git可以处理非常大的代码仓库,因为每个开发者都有一份完整的仓库,不需要集中式仓库的所有数据。Git和SVN都是版本控制系统,它们都是用来帮助团队协同开发,管理代码版本的。但是,git和svn在实现方式,使用方法,特性等方面都存在一些差异。

2024-04-24 12:47:31 780

原创 Maven如何解决jar包冲突的问题?

如果在应用中,我们同时依赖了两个第三方的jar包A,B,而A,B中又都依赖了C包,但是依赖的C的版本不同,那么就可能发生jar包冲突,导致最终编译打包后,应用的classpath中只有一个C的jar包。那么,因为maven有一定的Jar包依赖传递原则,所以有可能他最终选择的jar包并不是我们真正想用的,那这时候怎么办呢?打印出来的就是整个项目的jar包依赖的一个树形结构,我们找到发生了冲突的jar包就可以查看他的多种不同版本的依赖路径了。这样,在项目中,就只会依赖X,而X依赖的Y的对应版本就会被排除了。

2024-04-24 12:43:06 871

原创 什么是Redis的数据分片?

当我们的存取的 Key 的时候,Redis 会根据 CRC16 算法得出一个结果,然后把结果对16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。Redis Cluster将整个数据集划分为16384个槽,每个都有一个编号(0~16383),集群的每个节点可以负责多个hash槽,客户端访问数据时,先根据key计算出对应的槽编号,然后根据槽编号找到负责该槽的节点,向该节点发送请求。

2024-03-11 17:22:21 1456

原创 Redis的集群模式

它会从所有健康的从节点中选举一个新的主节点,并将所有从节点切换到新的主节点,实现自动故障转移。哨兵节点定期向所有主节点和从节点发送PING命令,如果在指定的时间内未收到PONG响应,哨兵节点会将该节点标记为主观下线。当一个节点失去连接或不可达时,RedisCluster会尝试将该节点标记为不可用,并从可用的从节点中提升一个新的主节点。在原来的主从架构中,引入哨兵节点,其作用是监控Redis主节点和从节点的状态每个Redis实例都可以作为哨兵节点,通常需要部署多个哨兵节点,以确保故障转移的可靠性。

2024-03-08 16:27:15 1035

原创 什么场景只能用HTTP,不能用RPC?

1、在异构系统(跨语言和跨平台),HTTP具有更好的兼容性,因为HTTP是一种通用的协议,几乎所有的编程语言和操作系统都支持HTTP协议,而不是所有的编程语言和操作系统都支持相同的RPC协议。2、RPC适合用在企业内部,要求使用同一套注册中心进行服务治理,如果是跨组织,或者跨公司,这种情况只能用更加通用的HTTP进行通信。

2024-03-08 16:13:21 895

原创 RocketMQ如何保证消息的顺序性?

这时候客户端A就需要把自己加在Broker上的锁解掉,而在这个解锁的过程中,就需要确保消息不能在消费过程中就被移除了,因为如果客户端A可能正在处理一部分消息,但是位点信息还没有提交,如果客户端B立马去消费队列中的消息,那存在一部分数据会被重复消费。即同一个队列内的消息可以做到有序,但是不同队列内的消息是无序的!通过上面的介绍,我们知道了Rocket的顺序消费是通过在消息者上多次加锁实现的,这种方式带来的问题就是会降低吞吐量,并且如果前面的消息阻塞,会导致更多消息阻塞,使用,顺序消息需要慎用。

2024-03-08 16:02:30 922

原创 RocketMQ的事务消息是如何实现的?

那如果用事务消息,先提交一个半消息,然后执行本地事务,在发送一个commit的半消息。4.回滚事务消息:如果本地事务执行失败,应用程序通知RocketMQ Broker 回滚该事务,RocketMQ将该消息的状态从‘prepared’改为‘rollback’,并将该消息从事务消息日志中删除,从而保证该消息不会被消费者消费。在发送事务消息时,首先向RocketMQ Broker 发送一条‘half消息’(半消息),半消息将被存储在broker端的事务消息日志中,但是这个消息还不能被消费者消费。

2024-03-08 15:34:53 648

原创 RocketMQ的架构是怎么样的?

一个Topic可以有多个Queue,每个Queue都是独立的存储单元,Producer 发送的消息会被存储到对应的Queue中,Consumer从指定的Queue中消费消息。4.NameServer:名称服务,负责维护Broker 的元数据信息,包括Broker地址,TGopic和Queue等消息。5.Topic:消息主题,是消息的逻辑分类单位。producer将消息发送到特定的Topic中,Consumer从指定的Topic中消费消息。3.Consumer:消息消费者,负责从Broker消费消息。

2024-03-08 14:41:06 405

原创 如何优化ElasticSearch搜索性能?

如果某个节点拥有 30GB 的堆内存,那其最多可有 600 个分片,但是在此限值范围内,您设置的分片数量越少,效果就越好。需要注意的是: text 类型用于全文搜类型用于精确值匹配,过滤索,它会被分析(analyzed),即分解为单个词项。keyword排序和聚合。但是这个说起来比较玄学,毕竟没有一种“一刀切”的方法来确定最优的分片和副本数量,因为这取决于多种因素,包括数据的大小、查询的复杂性、硬件资源和预期的负载等。很多人用ES很慢,是因为自己的查询本身就用的不对,我们可以尝试着优化一下你的查询。

2024-03-06 19:30:01 576

原创 什么是ElasticSearch的深度分页问题?如何解决?

这就是ES的深度分页的问题,深度分页需要数据库在内存中维护大量的数据,并对这些数据进行排序和处理,这会消耗大量的CPU和内存资源。当你开始一个scroll时,Elasticsearch会保持搜索时刻的数据快照,这意味着即使数据随后被修改,返回的结果仍然是一致的。但是这个方案有一些局限,一方面需要有一个全局唯一的字段用来排序,另外虽然一次分页查询时不需要处理先前页面中的数据,但实际需要依赖上一个页面中的查询结果。在传统的分页方式中,每次分页请求都需要对所有匹配的数据进行排序,以确定分页的起点。

2024-03-06 19:10:08 1207

原创 如何保证ES和数据库的数据一致性?

在应用中,如果我要更新数据库了,那么久抛出一个消息出去,然后数据库和ES各自有一个监听者,监听消息之后自去做数据变更,如果失败了就基于消息的重试在重新执行。如果写数据库成功,写ES超时,实际上ES操作成功,这时候数据库会回滚,导致数据不一致。或者像之前那个方案一样,先操作数据库,然后异步通知ES去更新,这时候就可以借助本地消息表的方式来保证最终一致性了。在业务中,我们通常需要把数据库中的数据变更同步到ES中,那么如何保证数据库和ES的一致性呢?在以上逻辑中,如果写数据库成功,写ES失败,那么事务会回滚。

2024-03-06 13:14:41 1934

原创 倒排索引是什么?

对于一个包含多个词汇的文档,倒排索引会将每个词汇作为一个关键字(Term),然后记录下该词汇所在的文档编号(Document ID)及该词汇在文档中的位置(Term Position)。倒排索引的结构于传统的索引结构相反,传统的索引结构是由文档构成的,每个文档包含若干个词汇,然后根据这些词汇建立索引。以上三个文本内容,我们经过分词之后,就会包含了“深入”,“理解”,“java”,“核心”,“技术”,“编程”,“思想”,“Hollis”等词。将分开的词,当做索引,与对应的文档ID进行关联,形成倒排表。

2024-03-06 12:38:02 395

原创 ElasticSearch为什么快?

6.预存储结果:ElasticSearch在插入数据时,对数据进行预处理,把结果预存储到索引中,从而在查询时不需要在重新计算,提高查询速度。例如它支持索引覆盖,索引下推等优化技术,使得查询速度更快。7.高效的查询引擎:ElasticSearch使用了高效的查询引擎,支持各种类型的查询,并对复杂度查询提供了优化策略,从而提供查询速度。总之,ElasticSearch快的原因在于它使用了各种高效的技术,使得数据存储,查询,处理都变的更加高效,从而实现了快速的搜索体验。

2024-03-06 12:13:52 2011 1

原创 为什么要使用ElasticSearch?

3.灵活性:ElasticSearch支持多种数据类型,支持多种语言,支持动态映射,允许快速的调整模型以适应不同的需求。4.实时分析:ElasticSearch支持实时分析,可以对数据进行实时查询,这对于快速检索数据非常有用。1.高性能:ElasticSearch具有高性能的搜索和分析能力,其中涵盖了多种查询语言和数据结构。5.实时监控:帮助企业实时监测系统性能,监控数据变化,以保证系统正常运行。2.日志分析:通过分析日志数据,帮助企业了解其业务的性能情况。1.搜索引擎:用于快速检索文档,商品,新闻等。

2024-03-06 11:48:52 864

原创 介绍下RabbitMQ的事务机制

我们需要先通过txselect开启事务,然后就可以发布消息给MQ了,如果txCommit提交成功了,则消息一定到达了RabbitMQ,如果在txCommit执行之前RabbitMQ实例异常崩溃或者抛出异常,那我们就可以捕获这个异常然后执行txRollback 进行回滚事务。RabbitMQ的事务机制,允许生产者将一组操作打包一个原子事务单元,那么全部执行成功,要么全部失败。想要保证发送者一定能把消息发送给RabbitMQ,一种是通过confirm机制,另外一种就是通过事务机制。

2024-03-05 16:58:39 798

原创 RabbitMQ如何保证消息不丢

1.非持久化 这是默认的传递模式,如果消息被设置为非持久化,RabbitMQ将尽力将消息传递给消费者,但不会将其写入磁盘,这意味着如果RabbitMQ服务器在消息传递之前崩溃或重启,消息可能会丢失。2.持久化 如果消息被设置为持久化,RabbitMQ会将消息写入磁盘,以确保即使在RabbitMQ服务器重启时,消息也不会丢失。在声明队列的时候,可以通过设置durable 参数为true 来创建一个持久化队列,持久化队列会在Rabbitmq服务器重启后保留,确保队列的元数据不会丢失。

2024-03-05 16:47:38 691

原创 如何保障消息一定能发送到RabbitMQ

一旦消息成功叨叨交换机并被处理,RabbitMQ会向消息生产者发送确认信号(ack)如果由于某种原因(比如 交换机不存在,路由键不匹配)消息无法被处理,RabbitMQ会向消息生产者发送否认信号 (NACK)当RabbitMQ 在无法路由消息时将消息返回给消息生产者,但是如果能正确路由,则不好返回消息。为了解决这个问题,有两个方案,一种是通过confirm机制,另外一种是事务机制,因为事务机制并不推荐,这里先介绍Confirm机制。上面两个丢失的过程,都可以利用confirm机制,注册回调来监听是否成功。

2024-03-05 16:20:23 444

原创 RabbitMQ如何实现消费端限流

我们可以在消费者指定最大的未确认消息数,当达到这个限制时,RabbitMQ将不再推送新的消息给消费者,直到有一些消息得到确认。什么是消费端限流,这个一种保护消费者的手段,假如说,现在是业务高峰期了,消息有大量堆积,导致MQ消费需要不断的进行消息消费,很容易被打挂,甚至重启之后还是会被大量消息涌入,继续被打挂。然后再在消费者处理完一条消息之后,手动发送确认消息给到RabbitMQ,这样就可以拉取下一条消息了;如以上配置,可以实现消费者在处理一条消息后,才会获取下一条消息。

2024-03-05 16:00:44 728

原创 RabbitMQ是如何保证高可用的?

这种集群模式下,每个实例中的元数据是一样的,大家都是完整的数据。在这种模式下,我们创建的Queue,它的元数据(配置信息)会在集群中的所有实例中进行同步,但是 队列中的消息只会存在于一个RabbitMQ实例上,而不会同步到其他队列中。当我们消费消息的时候,如果消费者连接到了未保存消息的实例,那么那个实例会通过元数据定位到消息所在的实例,拉取数据过来发送给消费者进行消费。这样每次在消息写入的时候,就需要在集群中的所有实例上都同步一份,这样即使有一台实例发送故障,剩余的实例也可以正常提供完成的数据和服务。

2024-03-05 15:41:28 1048

原创 什么是RabbitMQ的死信队列

当消息变成死信之后,如果配置了死信队列,它将被发送到死信交换机,死信交换机将死信投递到一个队列上,这个队列就是死信队列。1.消息处理失败:当消费者由于代码错误,消息格式不正确,业务规则冲突等原因无法成功处理一条消息时候,这条消息可以被标记为死信。4.消息无法路由:当消息不能被路由到任何队列时,例如,没有匹配的绑定关系或路由键时,消息可以被发送到死信队列。3.将队列与死信交换机绑定:将主要队列和死信交换机绑定,以便于无法处理的消息能够被转发到死信队列。1.创建死信队列:定义一个用于存储死信消息的队列。

2024-03-05 15:22:50 1181 1

原创 RabbitMQ 如何防止重复消费

这样我们在消费者端,接收到消息以后,只需要解析出消息体中的这个唯一标识,就可以通过 一锁 二判 三更新的方式来判断是否消费成功过了。RabbitMQ的消息消费是有确认机制的,正常情况下,消费者在消息消费成功后,会发送一个确认消息,消息队列接收到之后,就会将该消息从消息队列中删除,下次也就不会再投递了。但是如果存在网络延迟的问题,导致确认消息没有发送到消息队列,导致消息重投了,是有可能,所以当我们使用MQ的时候,消费者端自己也需要做好幂等控制来防止消息被重复消费。

2024-03-05 14:52:43 806

原创 RabbitMQ如何实现延迟消息?

但是,死信队列的实现方式存在一个问题,那就是可能造成队头阻塞,因为队列是先进先出的,而且每次只会判断队头的消息是否过期,那么如果队头的消息时间很长,一直都不过期,那么就会阻塞整个队列,这时候即便排在他后面的消息过期了,那么也会被一直阻塞。基于rabbitmq插件的方式可以实现延迟消息,并且不存在消息阻塞的问题,但是因为是基于插件的,而这个插件支持的最大延迟时间是(2^32)-1毫秒,大约49天,超过这个时间会被立即消费。目前该插件的当前设计并不真正适合包含大量延迟消息(例如数十万或者百万)的场景,

2024-03-05 14:43:41 773

原创 RabbitMQ是怎么做消息分发的?

在路由模式中,一个生产者将消息发送到交换器中,并指定消息的路由键,交换机根据路由键将消息路由到于之匹配的队列中。在主题模式中,一个生产者将消息发送到交换器中,并指定主题 作为路由键,交换器根据通配符匹配将消息路由到匹配的队列中。在发布/订阅模式中,一个生产者将消息发送到交换器中,交换器将消息广播到所有绑定的队列,每个队列对应一个消费者。每个消息只能被一个消费者处理。rabbitMQ一个有6种工作模式(消息分发方式)分别是简单模式,工作队列模式,发布订阅模式,路由模式,主题模式以及RPC模式。

2024-03-04 21:31:22 722

原创 RabbitMQ的整体架构是怎么样的?

每个VHost拥有自己的交换器,队列,绑定和权限配置,不同的VHost之间的资源相互独立,互不干扰。RabbitMQ是一个开源的消息中间件,用于在应用程序之间传递消息。Exchange(交换器):交换器是消息的接收和路由中心,它接收来自生成者的消息,并将消息路由到一个或多个与之绑定的队列(Queue)中。Queue (队列):队列是消息的存储和消费的,它保存着未被消费的信息,等待消费者从队列中获取并处理消息.Binding (绑定):绑定是交换器和队列之间的关联关系,它定义了交换器将消息路由到哪些队列中。

2024-03-04 21:08:49 654

原创 Maven能解决什么问题?为什么要用?

如果没有maven,我们在开发一个应用的时候,需要自己先确定要引入哪些第三方的jar包,并且要去找到这些jar包,把他们导入到项目中,而且最痛苦的时候各个jar包之间的兼容性和冲突的问题。jar包弄好了之后,我们想要把应用打包整一个war包又很麻烦,将一个应用做编译,测试和部署都特别麻烦。2.提供了一套标准化的构建流程(编译,测试,打包,发布)1.提供了一套依赖管理机制(jar 包导入,冲突解决)而有了maven 之后,这些问题都迎刃而解了。3.提供了一套标准化的项目结构。

2024-03-04 20:42:53 762

原创 什么是SpringCloud,有哪些组件?

8.分布式任务调度:提供秒级,精准,高可靠,高可用的定时(基于cron表达式)任务调度服务吗,同时提供分布式的任务执行模型,如网格任务。所以,单体应用使用spring ,需要快速构建,简化开发使用springboot,构建分布式,微服务应用,使用spring cloud。1.服务限流降级,支持webservlet ,webFlux,Openfign,restTemplate,9.阿里云短信服务:覆盖全球的短信服务,友好,高效,智能的互联化通信能力,帮助企业迅速搭建客户触达通道。

2024-03-04 20:35:55 1102

原创 Redis是AP的还是CP的?

然而,WAIT仅能确保数据在Redis实例中有指定数据和副本中确认,它并不能将一组redis实例转变为具有强一致性的cp系统:在故障转移期间,已确认的写操作仍然可能会丢失,这取决于redis持久化的具体配置。但是我不这么认为,我觉得redis就是ap的,虽然在单机redis中,因为只有一个实例,他的一致性是有保障的,而一旦这个节点挂了,那么就没有可用性可言了。,就是说在某个时间点读取的数据可能并不是最新的,但是最终会达到一致的状态。有人说:单机的是redis是cp的,而集群的redis是ap的?

2024-02-29 19:04:17 1145

原创 Tomcat的启动流程是怎样的?

初始化组件:依次初始化tomcat的各个组件,包括server,service,connetor,engine,host,context,它们都是tomcat运行的重要组成部分。以上步骤执行完之后,一个web应用就启动了,后续有请求到达时,会根据请求的url匹配相应的context,然后将请求转发到相应的servlet或jsp进行处理.启动服务:当所有组件初始化完成后,tomcat会依次启动connector ,engine,host,context,最终启动整个tomcat 服务。

2024-02-29 18:19:07 648

原创 什么是多线程中的上下文切换?

在多线程编程中,上下文切换是一种常见的操作,上下文切换通常是指在一个CPU上,由于多个线程共享CPU时间片,当一个线程的时间片用完后,需要切换到另一个线程运行。此时需要保存当前线程的状态信息,包括程序计数器,寄存器,栈指针等,以便于下次继续执行该线程时能够恢复到正常的执行状态,同时需要将切换到的线程状态信息恢复,以便于该线程能够正确运行。上下文切换是指CPU从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于下一次恢复执行该线程时能够正确的运行。

2024-02-29 18:04:08 494

原创 JAVA基础——如何理解面向对象和面向过程?

相反,它们应该依赖于抽象,例如一个接口,这样,数据访问的具体实现可以随时改变,多态是指在父类中定义的方法被子类继承后,可以通过重写,使得父类和子类具有不同的实现,这使得同一个方法在父类及其子类中具有不同的含义。就是说,在进行面向对象的编程开发中,要把属性,行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现。将问题分解成一个一个步骤,对每个步骤进行对应的抽象,形成对象,在通过不同对象之间的调用,组成解决问题。比如封装一个汽车类,类里面就会包含发动机,轮胎,底盘等属性,并且有发动机,前进等方法。

2024-02-28 15:09:45 1215

原创 JAVA基础 Java和C++主要区别有哪些?各有哪些优缺点?

5.JAVA的优点是跨平台能力强,支持自动内存管理减少内存泄漏的风险。有大量的库和框架支持,并且还有较强的社区支持和资源。2.java 是自动内存管理和垃圾回收的, C++需要手动管理内存,支持析构函数,java没有析构函数的概念.JAVA和C++ 都是面向对象的语言,java属于解释型语言,C++属于编译型语言。C++的缺点是内存管理复杂,容易出错。java的缺点是性能不如C++,对系统资源的控制能力较弱。3.C++支持指针,引用,值传递。1.C++ 是平台相关的,java是平台无关的。

2024-02-28 12:29:49 1081

原创 创建多线程的方法

无论有多少种形式,创建多线程的真正的方法,其实只有两种:> 继承 Thread 类> 实现 Runnable 接口其它形式都是这两种方式的变体。第一步:继承 Thread 类第二步:重写 run() 方法第三步:创建 Thread 子类对象第四步:调用 start() 方法启动线程\调用 run() 方法仅仅只是调用了一个子类中重写的父类方法,并没有真正开启一个新的线程,还是在当前线程运行,也就是 main 线程。

2024-02-26 20:39:14 824

原创 Spring中bean的生命周期

其定义为:从对象的创建到销毁的过程。而Spring中的一个Bean从开始到结束经历很多过程,但总体可以分为六个阶段Bean定义、实例化、属性赋值、初始化、生存期、销毁。2.SpringBean生命周期中的增强接口PostProcessor;postProcessBeforeInitialization方法执行前,会执行很多Aware类型的接口,这种类型接口作用是加载资源到Spring容器中。我们在创建一个MyBeanPost的类来实现BeanPostProcessor接口。3.在xm

2024-02-26 20:16:27 385

原创 SpringMVC执行流程

一、SpringMVC 介绍SpringMVC 是一款基于 Spring 框架的 MVC 框架,它采用了 各种设计模式,包括 FrontController、Dispatcher、ViewHelper 等。同时,SpringMVC 与 Spring 框架集成紧密,可以很方便地与其他 Spring 组件(如 Spring Security)进行整合。

2024-02-26 19:49:46 401 1

原创 HashMap的put()方法执行流程

5、如果不是treenode,开始遍历链表,判断链表长度是否大于8,如果大于8就转成红黑树,在树中执行插入操作,如果不是大于8,就在链表中执行插入;3、判断table[i]==null,如果是true,直接新建节点进行添加,如果是false,判断table[i]的首个元素是否和key一样,一样就直接覆盖。HashMap的数据结构在jdk1.8之前是数组+链表,为了解决数据量过大、链表过长是查询效率会降低的问题变成了数组+链表+红黑树的结构,利用的是。

2024-02-26 19:42:10 877

原创 常用的集合有哪些

1) ArrayList 实现了 List 接口,继承了 AbstractList 类,由一个 Object[] 实例实现,即底层为数组结构;2) 默认初始化长度为 16,扩容加载因子为 0.75,一旦大于 0.75*16之后,就会调用resize()进行扩容,扩容2倍,即32;2) 默认初始化长度为 16,扩容加载因子为 0.75,一旦大于 0.75*16之后,就会调用resize()进行扩容,扩容2倍,即32;在实现的方法上,用 synchronized 关键字进行了修饰,即在方法上实现了同步锁。

2024-02-26 19:31:08 1048

java 日志打印+持久化

java 日志打印+持久化

2024-02-28

java实现pdf内嵌自定义水印

java实现pdf内嵌自定义水印

2023-07-26

双端队列 javaCache

双端队列(两头都可以操作),基于此队列记录key的顺序

2023-07-14

java雪花算法生成唯一id

SnowFlake的结构如下(每部分用-分开) 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 6910位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号加起来刚好64位,为一个Long型.

2023-07-06

空空如也

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

TA关注的人

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