自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Java面试】——常见面试题汇总

JDK 是 Java 开发工具包,是 Java 开发环境的核心组件,并提供编译、调试和运行一个 Java 程序所需要的所有工具,可执行文件和二进制文件,是一个平台特定的软件。JRE 是 Java 运行时环境,是 JVM 的实施实现,提供了运行 Java 程序的平台。JRE 包含了 JVM,但是不包含 Java 编译器 / 调试器之类的开发工具。JVM 是 Java 虚拟机,当我们运行一个程序时,JVM 负责将字节码转换为特定机器代码,JVM 提供了内存管理 / 垃圾回收和安全机制等。这种独立于硬

2020-07-13 09:40:55 1019 1

原创 Next-Key Lock(临键锁)

在 InnoDB 默认的隔离级别 REPEATABLE-READ 下,行锁默认使用的是 Next-Key Lock。但是,如果操作的索引是唯一索引或主键,InnoDB 会对 Next-Key Lock 进行优化,将其降级为 Record Lock,即仅锁住索引本身,而不是范围。

2024-04-20 20:01:53 116

原创 续传查询SQL不规范导致漏数的问题

查询交易记录的时候,,用户需要一页一页往下翻,每点击一次就会将续传接口包发到后端接口进行查询返回下一页的数据,续传接口有几个字段,是续传键值,后端的SQL会根据上次读取到的最后一条往后捞数据。还有的场景就是,续传语句中筛选的顺序是A,B,C,但是在order by的时候掺杂了其他字段D进去,也会导致漏数出现。因为三个字段在order by中的顺序与续传语句中筛选不一致,导致在查数时数据会错乱、漏数。结论:order by的顺序要与续传语句的筛选顺序保持一致,否则会导致漏数。

2024-04-20 10:19:44 297

原创 如何保证消息有序

3、按键分区:Kafka允许根据消息的键(key)来决定将消息发送到哪个分区。如果消息的键是相同的,Kafka会将它们发送到同一个分区。因此,可以根据消息的键来保证消息的顺序消费。1、单个分区消费:创建一个单独的消费者实例来消费一个分区的消息。这样可以确保在单个分区内的消息按顺序消费。但是需要注意,如果有多个分区,不同分区的消息仍可能以并发方式进行消费。2、指定分区消费:通过指定消费者订阅的特定分区,可以确保只消费指定分区的消息。这样,可以通过将相关消息发送到同一个分区来保证消息的顺序消费。

2024-04-20 09:53:16 342

原创 分布式限流——Redis + Lua实现滑动窗口算法

通过以上步骤,Zset能够有效地维护一个时间窗口内的请求数量,从而达到限流的目的,确保服务在高峰期不会因为过多请求而导致性能瓶颈。Zset的score字段用来存储每个请求的时间戳。

2024-04-17 21:19:28 1000

原创 分布式限流——Redis + Lua脚本实现令牌桶算法

这个Lua脚本简化了令牌桶算法的实现,实际应用中可能还需要考虑更多细节,例如如何精确地按照时间间隔补充令牌、如何处理多个请求同时竞争令牌等情况。客户端在调用这个Lua脚本时,应当传递正确的参数,包括令牌桶的键名以及令牌相关的配置信息。此外,在高并发场景下,为了避免多个客户端同时修改令牌数,Lua脚本的执行必须是原子性的,这正是Redis.eval/evalsha命令所提供的功能。

2024-04-17 21:09:52 486

原创 如何解决集群部署环境下 Session 不共享的问题

由于JWT的大小是有限制的,并且整个令牌会在每次请求中被发送,所以不适合存储大量的或者频繁变化的数据。当用户从集群中的一个节点跳转到另一个节点时,原先节点上的Session数据无法在新的节点上获取,从而导致登录状态或其他会话相关的状态丢失。另外,如果你的应用采用了JWT进行身份验证,可以将JWT与服务端存储的Session模式相结合使用:JWT负责身份验证和部分用户状态信息的传递,而购物车等大量复杂状态数据则存储在服务端,以保持前后端数据的一致性和减轻网络传输负担。

2024-04-16 21:03:25 358

原创 抽奖系统设计

如何设计一个百万级用户的抽奖系统? - 掘金

2024-04-15 21:46:59 283

原创 引用拷贝、浅拷贝、深拷贝

在这个深拷贝的例子中,我们利用了Java的序列化和反序列化机制。通过将对象写入字节流再从字节流读取,可以实现深拷贝,确保所有嵌套的对象也都会被复制一份新的实例。因此,即使修改了原始对象内嵌对象的属性,也不会影响到深拷贝后的对象。另外,对于复杂的数据结构,可能需要设计更复杂的深拷贝逻辑,尤其是涉及循环引用或非序列化对象时。的引用拷贝,它们指向相同的内存地址,因此当原始对象的属性发生改变时,通过引用拷贝得到的对象也会反映出这些变化。因此,即使进行了浅拷贝,修改原始对象内嵌对象的属性仍会影响到拷贝后的对象。

2024-04-15 20:28:31 208

原创 InnoDB中高度为3的B+树最多可以存多少数据?

考虑到磁盘IO是非常高昂的操作,计算机操作系统做了预读的优化,当一次IO时,不光把当前磁盘地址的数据,而是把也都读取到内存缓冲区内,因为当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page),具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO。MySQL每个节点大小默认为16KB,也就是每个节点最多存16KB的数据,可以修改,最大64KB,最小4KB。

2024-04-14 16:50:31 882

原创 Oracle分区表和Mysql的水平分表有何区别

综上所述,Oracle分区表在物理存储和查询优化方面提供了更为强大的原生支持,而MySQL水平分表的灵活性较高,但管理复杂度相对较大,需要更多应用层的介入。MySQL 5.5以后增加了分区表的支持,其特点与Oracle分区表相似,但具体实现和功能细节上仍存在差异。

2024-04-14 16:20:52 515

原创 Raft算法

通过这种Gossip协议的方式,Redis Cluster实现了去中心化的集群管理,每个节点都持有部分集群状态信息,并通过不断交流达到整个集群状态的最终一致性。其主要设计目标是易于理解且易于实现。总之,Raft算法通过领导者选举确保任何时候都有一个明确的节点负责处理客户端请求和管理日志复制,并通过严格控制日志同步和提交过程来确保整个集群中各节点状态的一致性。Gossip 协议是一种允许在分布式系统中共享状态的去中心化通信协议,通过这种通信协议,我们可以将信息传播给网络或集群中的所有成员。

2024-04-13 10:08:23 746

原创 记录一次引用拷贝导致的缺陷

问题:同一事务,跨月查询(如查1月31日的下一工作日,此时会查询1月和2月的假期表数据),然后再查回1月的假期表数据,此时一月的假期表数据就有问题。根本原因是浅拷贝使用不规范,A浅拷贝给B,然后A还在被使用,同时B的信息也在被更改。导致B信息的修改直接影响到了A,即:此时查出来的假期表对象workDay已经被修改为2月份的对象了,这个时候想要查询1.31就会有问题,因为2月份最多只有29天,对应的假期表对象:YYYYYNNNNYYNNN....(只有29个标志位)

2024-04-11 22:59:07 191

原创 Spring中的适配器模式

在Spring MVC框架中,适配器模式主要体现在对不同类型的处理器(即Controller)的统一处理上。Spring MVC通过适配器模式来保证无论Controller的实现方式如何多样化,都能够被DispatcherServlet统一调用和管理。通过适配器模式,Spring MVC框架能够很好地支持控制器的不同实现方式,并保持框架本身的稳定性和扩展性,符合开闭原则,即在不修改原有代码的基础上,能够添加新的Controller类型和相应的适配器来支持新的功能。是处理大部分注解驱动控制器的核心适配器。

2024-04-10 22:17:16 465

原创 Spring循环依赖

假设A、B循环引用,实例化A的时候就将其放入三级缓存中,接着填充属性的时候,发现依赖了B,同样的流程也是实例化后放入三级缓存,接着去填充属性时又发现自己依赖A,这时候从缓存中查找到早期暴露的A,没有AOP代理的话,直接将A的原始对象注入B,完成B的初始化后,进行属性填充和初始化,这时候B完成后,就去完成剩下的A的步骤,如果有AOP代理,就进行AOP处理获取代理后的对象A,注入B,走剩下的流程。实例化的过程又是通过构造器创建的,如果A还没创建好出来怎么可能提前曝光,所以构造器的循环依赖无法解决。

2024-04-09 21:46:09 659

原创 Synchronized

Synchronized

2024-04-05 15:12:41 241

转载 mysql:聚簇索引和非聚簇索引区别

在非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID,所以当我们使用非聚簇索引进行查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上找到真正的行数据,我们把这个过程称之为回表查询。在聚簇索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。非聚簇索引的叶子节点不直接包含数据记录,而是包含了指向数据行的指针。聚簇索引直接将数据存储在 B+树的叶子节点中,而非聚簇索引的叶子节点存储的是指向数据行的指针。MyISAM 采用的是非聚簇索引,InnoDB 采用的是聚簇索引。

2024-04-02 22:21:55 21

原创 Synchronized锁升级过程

当一个线程首次访问同步块时,如果此对象无锁状态且偏向锁未被禁用,JVM 会将该对象头的锁标记改为偏向锁状态,并记录下当前线程的 ID。如果持有偏向锁的线程还活跃,则需要撤销偏向锁,升级为轻量级锁。进行偏向锁撤销时,会遍历堆栈的所有锁记录,暂停拥有偏向锁的线程,并检查锁对象。如果这个过程中发现有其他线程试图获取这个锁,JVM 会撤销偏向锁,并将锁升级为轻量级锁。轻量级锁通过线程自旋来等待锁释放。当有两个或以上线程竞争同一个偏向锁时,偏向锁模式不再有效,此时偏向锁会被撤销,对象的锁状态会升级为轻量级锁。

2024-04-02 22:02:38 297

原创 SpringBoot自动装配原理

配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration 对应的配置项通过反射实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。如果不设值的话默认扫描@ComponentScan注解所在类的同级类和同级目录下的所有类,所以对于一个Spring Boot项目,一般会把入口类放在顶层目录中,这样就能够保证源码目录下的所有类都能够被扫描到。

2024-03-24 22:08:21 1134

原创 Spring Boot 加载配置文件的优先级

综上所述,Spring Boot 加载配置时会综合考虑配置文件的位置、名称及格式,并遵循上述优先级顺序。如果同一个配置项在不同优先级的配置文件中都存在,则采用优先级较高的配置文件中的值。:这种方式加载的配置具有较低的优先级,但是可以直接指向具体的配置文件。:Spring Boot包含一些内建的默认配置,其优先级最低。是激活的Spring Boot配置环境。另外,在同一位置下,.properties。指定的配置文件路径拥有最高的优先级。开头的环境变量会被转换为配置属性。形式存在的环境变量,以及以。

2024-03-24 20:49:18 296

原创 Redis I/O多路复用

I/O多路复用

2024-03-24 10:15:01 465

原创 RedisObject是什么?

Redis底层数据结构

2024-03-23 22:05:24 95

原创 Redis的String类型为什么重新设计使用了SDS数据结构呢

综上所述,SDS 设计旨在提高 Redis 的性能、安全性及对不同场景的适应能力,尤其对于高并发环境下频繁进行字符串操作的服务端数据库系统来说,这些优化显得尤为重要。

2024-03-23 21:59:56 398

原创 手写一个LRU

在这个例子中,因为没有其他键值对被访问过,所以最早插入的键值对1 -> One是当前最久未使用的项。)时,由于缓存容量限制为3个元素,且之前已经有三个键值对(1 -> One, 2 -> Two, 3 -> Three)存在,此时缓存已满。由于LinkedHashMap的特性,在插入新的键值对时,它会自动将新插入的项移动到链表尾部,表示它是最近被访问或修改的。方法,我们设置了当缓存大小超过设定容量(即size() > cacheSize)时,应当移除最旧的条目(即最近最少使用的条目)。

2024-03-23 16:43:57 233

原创 Redis如何删除大key

命令可以删除多种类型的数据,不仅限于 String 类型。无论是 String、Hash、List、Set、Sorted Set 或其他任何类型的数据,只要它们是存储在 Redis 中的键(key),都可以使用。命令类似,但它会在后台异步删除key,不会阻塞当前客户端,也不会阻塞Redis服务器的主线程,因此可以更安全地删除大key。执行删除操作的方式是非阻塞异步的。因此,无论数据类型如何,只要你想异步删除一个或多个 Redis 键,都可以使用。命令删除任何类型的单个键或者一批键,就如同使用。

2024-03-23 10:15:00 572

原创 Kafka批量消费

当批量处理消息时,需要注意的是,一旦消息处理完成且没有错误,应当手动提交偏移量,以确认这些消息已经被成功消费。如果有消息处理失败,则可能需要根据业务需求选择不同的策略,比如重新尝试处理整个批次、跳过错误消息或者记录错误信息稍后处理。注解处理批量信息时,首先需要开启批量监听模式,并配置相应的consumer参数来控制批量消费行为。请求从Kafka服务器获取的最大记录数。就能按照批处理的方式接收并处理Kafka主题中的消息了。定义一个方法,其参数是一个包含多条消息的列表,注解下的方法将会接收到批量的消息。

2024-03-22 23:05:45 880

原创 MySQL 索引:索引为什么使用 B+树?

B 树中每个节点(包括叶节点和非叶节点)都存储真实的数据,B+树中只有叶子节点存储真实的数据,非叶节点只存储键。红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍):通过舍弃严格的平衡和引入红黑节点,解决了 AVL 旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO 次数太多;从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。

2024-03-21 22:54:43 569

原创 Mysql——索引下推

这意味着存储引擎在遍历索引的过程中,不仅可以利用索引快速定位记录,而且可以在读取索引的同时就完成一部分WHERE条件的判断,只取出那些真正满足所有条件的行数据,而不是先返回所有引用主键的记录,再由服务器层进一步筛选。例如,在一个带有多个列的索引中,即使查询条件包含了索引列和非索引列,ICP也能发挥作用,存储引擎可以直接在索引内部进行多列条件的初步筛选,减少不必要的回表操作(即减少访问实际数据页的次数),从而降低IO成本,提高查询性能。在没有启用索引下推的情况下,MySQL可能会首先使用复合索引。

2024-03-21 21:48:31 387

原创 Redis的脑裂问题

具体来说,在Redis环境下,当主节点与一部分从节点之间因网络问题而失去联系,但主节点依然可以与另一部分从节点或者客户端通讯时,原本的主节点可能继续接受写操作,而与它失去联系的从节点或哨兵可能认为主节点已不可达,并重新选举出一个新的主节点,这时就形成了两个独立的主节点,每个主节点都能接受写请求,从而导致数据冲突和不一致。我们这里配置的是 10 秒,也就是说 master 10 秒都得不到一个从节点的响应,就会认为这个从节点失联,停止接受新的写入命令请求。

2024-03-20 21:33:00 609

转载 MySQL自增主键一定是连续的吗

【代码】为什么MySQL的自增主键不单调也不连续?

2024-03-18 21:32:43 25

原创 Mysql的行级锁

只针对当前操作的行记录进行加锁。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。行级锁和存储引擎有关,是在存储引擎层面实现的。但是,如果操作的索引是唯一索引或主键,InnoDB 会对 Next-Key Lock 进行优化,将其降级为。InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。不过,很多时候即使用了索引也有可能会走全表扫描,这是因为 MySQL 优化器的原因。这个在我们日常工作开发中经常会遇到,一定要多多注意!,即仅锁住索引本身,而不是范围。

2024-03-17 22:09:21 545

原创 explain命令详解

Using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql中无法利用索引完成的排序成为文件排序。key_len:表示索引中使用的字节数(可能使用的,不是实际的),可通过该列查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。range:只检索给定范围的行,使用一个索引来选择行,一般就是在where语句中出现了between、、in等的查询。ref:显示索引的哪一列被用到,如果可能的话是一个常数,哪些常量被用于查找索引列上的值。

2024-03-17 20:23:28 795

转载 最大努力通知

最大努力通知也是一种解决分布式事务发起方通知方通过一定的机制最大努力将业务处理结果通知到接收方。具体包括:1.有一定的消息重复通知机制。因为接收通知方可能没有接收到通知,此时要有一定的机制对消息重复通知。2.消息校对机制如果尽最大努力也没有通知到接收方,或者接收方消费消息后要再次消费,此时可由接收方主动向通知方查询消息信息来满足需求。最大努力通知和可靠消息最终一致性有什么不同?1.解决方案思想不同。

2024-03-17 17:14:28 20

转载 openFeign原理

4、基于上面加载的每一个 FeignClient 接口,会生成一个动态代理对象,指向了一个包含对应方法的 MethodHandler 的 HashMap。6、从动态代理对象 Proxy 中找到一个 MethodHandler 实例,生成 Request,包含有服务的请求 URL(不包含服务的 IP)。提供了HTTP请求的模板,编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。8、服务 B 处理服务 A 发起的远程调用请求,执行业务逻辑后,返回响应给服务 A。

2024-03-17 16:18:34 18

原创 令牌桶算法和漏桶算法

令牌桶算法和漏桶算法都是计算机科学中用于流量整形和流量控制的策略,它们主要应用于网络流量控制、API调用速率限制、服务请求限流等多个场景。

2024-03-17 11:03:01 345

原创 GataWay网关

然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(Pre)或之后(Post)执行业务逻辑。在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;

2024-03-17 10:37:52 339

原创 loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别

在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。

2024-03-17 10:24:33 345

转载 分布式事务——本地消息表和MQ消息事务

本地消息表的方案最初由ebay的工程师提出,核心思想是将分布式事务拆分成本地事务进行处理。本地消息表实现最终一致性。

2024-03-14 23:14:27 119

原创 Kafka消费者重平衡

kafka消费者重平衡

2024-03-12 22:46:20 1188

原创 Caffeine缓存

本地缓存基于本地环境的内存,访问速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度。类的远程缓存间的数据交互,减少网络 I/O 开销,降低这一过程中在网络通信上的耗时。Redis + Caffeine = 王炸!使用本地缓存能够减少和。

2024-03-12 21:08:39 637

空空如也

空空如也

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

TA关注的人

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