自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

冲鸭的博客

主要学习java

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

原创 数据结构之散列表

在散列表中,数组的每个下标位置我们可以称之为桶(bucket)或者槽(slot),每个桶(槽)会对应一条链表,所有散列值相同的元素我们都放到相同槽位对应的链表中。

2024-03-03 16:30:18 1037

原创 数据结构之二叉树

Java中有两个方式实现二叉树:数组存储,

2024-03-03 15:41:16 540

原创 ArrayList和LinkedList的区别

ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】, LinkedList不支持下标查询。其他部分增删需要挪动数组,时间复杂度是O(n)。LinkedList头尾节点增删时间复杂度是O(1),其他都需要遍历链表,时间复杂度是O(n)。查找(未知索引): ArrayList需要遍历,链表也需要链表,时间复杂度都是O(n)。LinkedList 是双向链表需要存储数据,和两个指针,更占用内存。ArrayList底层是数组,内存连续,节省内存。在方法内使用,局部变量则是线程安全的。

2024-03-01 16:12:43 773

原创 数组与list的转化分析

1. 数组转List ,使用JDK中java.util.Arrays工具类的asList方法。2. List转数组,使用List的toArray方法。无参toArray方法返回 Object数组,传入初始化长度的数组对象,返回该对象数组。

2024-03-01 16:08:19 397

原创 集合篇之ArrayList

一些添加的方法。

2024-03-01 15:34:33 936

原创 数据结构之链表

双向链表,顾名思义,它支持两个方向。1. 每个结点不止有一个后继指针 next 指向后面的结点。2. 有一个前驱指针 prev 指向前面的结点。E item;1.单向链表和双向链表的区别是什么?1.1 单向链表只有一个方向,结点只有一个后继指针 next。1.2 双向链表它支持两个方向,每个结点不止有一个后继指针next指向后面的结点,还有一个前驱指针prev指向前面的结点。2.链表操作数据的时间复杂度是多少?

2024-02-28 20:08:20 565

原创 数据结构之数组

1. 在根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引乘以存储数据的类型大小。2. 如果数组的索引从1开始,寻址公式中,就需要增加一次减法操作,对于CPU来说就多了一次指令,性能不高。1. 数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。2. 数组下标为什么从0开始?寻址公式是:baseAddress+ i * dataTypeSize,计算下标的内存地址效率较高。

2024-02-28 18:48:54 933

原创 算法复杂度分析

1. 什么是算法时间复杂度?时间复杂度表示了算法的执行时间与数据规模之间的增长关系。2. 常见的时间复杂度有哪些?具体看上面图。3. 什么是算法空间复杂度?表示算法占用的额外存储空间与数据规模之间的增长关系。

2024-02-27 20:46:09 1283

原创 消息中间件篇之Kafka-高性能设计

消息分区:不受单台服务器的限制,可以不受限的处理更多的数据。顺序读写:磁盘顺序读写,提升读写效率。页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。减少上下文切换及数据拷贝。消息压缩:减少磁盘IO和网络IO。分批发送:将消息打包批量发送,减少网络开销。

2024-02-26 17:25:26 710

原创 消息中间件篇之Kafka-数据清理机制

Kafka中topic的数据存储在分区上,分区如果文件过大会分段存储segment,每个分段都在磁盘上以索引(xxxx.index)和日志文件(xxxx.log)的形式存储,这样分段的好处是,第一能够减少单个文件内容的大小,查找数据方便,第二方便kafka进行日志清理。第二是根据topic存储的数据大小,当topic所占的日志文件大小大于一定的阈值,则开始删除最久的消息。第一,根据消息的保留时间,当消息保存的时间超过了指定的时间,就会触发清理,默认是168小时( 7天)。

2024-02-26 17:11:46 967

原创 消息中间件篇之Kafka-高可用机制

1. Kafka的服务器端由被称为Broker的服务进程构成,即一个Kafka集群由多个Broker组成。2. 这样如果集群中某一台机器宕机,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一。

2024-02-26 16:56:18 683

原创 消息中间件篇之Kafka-消费顺序性

1. 即时消息中的单对单聊天和群聊,保证发送方消息发送顺序与接收方的顺序一致。2. 充值转账两个渠道在同一个时间进行余额变更,短信通知必须要有顺序。

2024-02-26 16:32:48 718

原创 消息中间件篇之Kafka-消息不丢失

我们可以设置参数为all,这样的话,当生产者发送消息到了分区之后,不仅仅只在leader分区保存确认,在follwer分区也会保存确认,只有当所有的副本都保存确认以后才算是成功发送了消息,所以,这样设置就很大程度了保证了消息不会在broker丢失。第三个有可能是在消费者端丢失消息,kafka消费消息都是按照offset进行标记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是每隔5s提交一次,如果出现重平衡的情况,可能会重复消费或丢失数据。,默认是每隔5s提交一次,如果出现重平衡的情况,可能会。

2024-02-26 16:24:43 1110

原创 消息中间件篇之RabbitMQ-高可用机制

在生产环境下,使用来保证高可用性,一般我们采用普通集群、、仲裁队列。

2024-02-24 16:01:23 702 1

原创 消息中间件篇之RabbitMQ-信息堆积

当生产者发送消息的了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列。之后发送的消息就会成为,可能会被丢弃,这就是。解决消息堆积有三种种思路:1. 增加更多消费者,提高消费速度。2. 在消费者内开启线程池加快消息处理速度。

2024-02-24 15:39:17 698

原创 消息中间件篇之RabbitMQ-延时队列

进入队列的消息会被延迟消费的队列。场景:超时订单、限时优惠、定时发布。

2024-02-24 15:26:29 962 1

原创 消息中间件篇之RabbitMQ-消息重复消费

消费者消费消息后,当确认消息还没有发送到MQ时,就发生网络抖动或者消费者宕机。那当消费者恢复后,由于MQ没有收到消息,而且消费者有重试机制,消费者就会再一次消费,这就会导致消息的重复消费。

2024-02-24 13:56:08 928

原创 消息中间件篇之RabbitMQ-消息不丢失

RabbitMQ提供了来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。当消息没有到交换机就失败了,就会返回publish-confirm。当消息没有到达MQ时,就会返回publish-return。消息失败之后如何处理呢?1. 回调方法即时重发。2. 记录日志。3. 保存到数据库然后定时重发,成功发送后即刻删除表中的数据。

2024-02-24 13:43:06 897

原创 微服务篇之任务调度

1. 解决集群任务的重复执行问题。2. cron表达式定义灵活。3. 定时任务失败了,重试和统计。4. 任务量大,分片执行。

2024-02-23 15:17:44 1324

原创 微服务篇之接口幂等性

多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。基于RESTful API的角度对部分常见类型请求的幂等性特点进行分析:解决方案如下。

2024-02-23 14:57:55 607

原创 微服务篇之分布式事务

你们采用哪种分布式事务解决方案?我们当时是xx项目,主要使用到的seata的at模式解决的分布式事务。seata的AT模型分为两个阶段:1、阶段一RM的工作:① 注册分支事务 ② 记录undo-log(数据快照)③ 执行业务sql并提交 ④报告事务状态。2、阶段二提交时RM的工作:删除undo-log即可。3、阶段二回滚时RM的工作:根据undo-log恢复数据到更新前。at模式牺牲了一致性,保证了可用性,不过,它保证的是最终一致性。

2024-02-23 14:35:41 947

原创 微服务篇之分布式系统理论

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:1. Consistency(一致性)。2. Availability(可用性)。3. Partition tolerance (分区容错性)。Eric Brewer 说,分布式系统无法同时满足这三个指标。这个结论就叫做 CAP 定理。

2024-02-22 17:09:35 1346

原创 微服务篇之限流

1. 并发的确大(突发流量)。2. 防止用户恶意刷接口。

2024-02-22 15:57:46 1482

原创 微服务篇之监控

假设客户端查询一些东西的时候,需要经过网关,然后服务A调用服务H,服务H调用K,服务K调用MySQL,当查询不出来的时候,我们不能快速定位到底是哪个服务的问题,这就需要服务监控,可以更好的找出问题。

2024-02-21 11:50:49 686

原创 微服务篇之雪崩、降级和熔断

一个服务失败,导致整条链路的服务都失败的情形。

2024-02-21 11:20:59 1119

原创 微服务篇之负载均衡

1. RoundRobinRule:简单轮询服务列表来选择服务器。 2. WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小。 3. RandomRule:随机选择一个可用的服务器。 4. BestAvailableRule:忽略那些短路的服务器,并选择并发数较低的服务器。 5. RetryRule:重试机制的选择逻辑。 6. AvailabilityFilteringRule:可用性敏感策略,

2024-02-20 21:06:54 973

原创 微服务篇之注册中心

1. 服务提供者和服务消费者向注册中心注册服务信息,然后注册中心记录了对应的服务器地址。2. 服务消费者从注册中心拉取服务提供者的信息。3. 通过负载均衡找到对应的服务提供者地址。4. 服务消费者远程调用对应的服务提供者。5. 其中,每个微服务都需要向注册中心定期发送心跳,防止服务宕机却不知道。

2024-02-20 20:47:52 966

原创 MySQL篇之分库分表

这个是使用过的,我们当时的业务是(xxx),一开始,我们也是单库,后来这个业务逐渐发展,业务量上来的很迅速,其中(xx)表已经存放了超过1000万的数据,我们做了很多优化也不好使,性能依然很慢,所以当时就使用了水平分库。当然开始的时候,那些旧数据,我们做了一些清洗的工作,我们也是按照id取模规则分别存储到了各个数据库中,好处就是可以让各个数据库分摊存储和读取的压力,解决了我们当时性能的问题。我们一开始先做了3台服务器对应了3个数据库,由于库多了,需要分片,我们当时采用的mycat来作为数据库的中间件。

2024-02-19 14:44:00 1130

原创 MySQL篇之主从同步原理

记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。主从同步分成三步:Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log。slave重做中继日志中的事件,将改变反映它自己的数据。

2024-02-19 13:57:22 517

原创 MySQL篇之MVCC

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突。 事务5查询的记录是哪个事务版本的记录呢?MVCC的具体实现,主要依赖于数据库记录中的隐式字段、undo log日志、readView。 除了自己自定义的字段外,还有隐藏的3个字段。 DB_TRX_ID:修改事务时,就会自增+1。 DB_ROLL_PTR:就是指向上一个版本。 DB_ROW_ID:当字段

2024-02-19 13:43:34 1140

原创 MySQL篇之undo log和redo log

主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。页中存储的是行数据。当服务器宕机了,数据同步失败了,可能内存结构的数据会消失,那操作的数据也就丢失了,也就违背了事务的特性,违背了数据的持久化操作。那怎么解决这个问题呢?我们可以使用日志文件,下面详细讲解。

2024-02-18 12:43:12 936

原创 MySQL篇之事务

是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

2024-02-18 12:18:23 906

原创 MySQL篇之SQL优化

1. 比如设置合适的数值(tinyint int bigint),要根据实际情况选择。2. 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低。

2024-02-17 15:27:02 2518 1

原创 MySQL篇之索引创建与失效

1). 针对于数据量较大,且查询比较频繁的表建立索引。2). 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。4). 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

2024-02-17 15:18:42 540

原创 MySQL篇之覆盖索引

是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。

2024-02-17 14:52:52 732 1

原创 MySQL篇之回表查询

将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据。特点:必须有,而且只有一个。聚集索引选取1. 如果存在主键,主键索引就是聚集索引。2. 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。3. 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

2024-02-09 21:56:08 1600 2

原创 MySQL篇之索引

是帮助MySQL获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足的数据结构(B+树),这些数据结构以某种方式(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是。

2024-02-08 23:51:34 673 1

原创 MySQL篇之定位与优化MySQL慢查询

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志 如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log。

2024-02-08 15:02:44 1063

原创 Redis篇之redis是单线程

可以看到,非阻塞IO模型中,用户进程在第一个阶段是非阻塞,第二个阶段是阻塞状态。虽然是非阻塞,但性能并没有得到提高。而且忙等机制会导致CPU空转,CPU使用率暴增。

2024-02-07 21:29:36 1967 1

原创 Redis篇之集群

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建,实现。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据给从节点。

2024-02-07 15:55:01 1735 1

空空如也

空空如也

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

TA关注的人

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