鼬鼬鼬鼬面试了

没准备多久,还得继续加油准备哦

先记录下节后的第一场及第二场面试吧

10.10 上午10点 易宝支付

自我介绍加介绍项目,完了,没问技术问题

-------------------------------------------------------------------

10.10 下午2点 美团-外卖商家

自我介绍,介绍项目,技术问题

1.mysql分库分表的目的

MySQL分库分表的主要目的是通过分散数据存储和负载,解决大规模数据带来的性能瓶颈和系统扩展性问题。 ‌

提升读写性能
分库分表通过将数据分散到多个数据库实例或表中,减少单库/单表的数据压力。例如,将用户订单数据按地区或时间分库/分表,查询时只需访问对应分区,避免全表扫描,显著提高效率。 ‌

优化存储与资源利用
单个数据库的存储容量和计算资源有限,分库分表后可将数据分布到多个服务器,每个实例可独立扩展存储空间和硬件资源,突破单机限制。 ‌

增强系统扩展性
随着业务增长,数据量持续增加可能导致单库性能下降。通过水平或垂直切分数据,可灵活扩容单个节点,降低整体系统扩容成本。 ‌

降低故障风险
部分分库/分表故障时,其他节点仍可正常运行,保障系统可用性。例如,电商订单系统按地区分库后,某区域数据库故障不会影响其他区域业务。 ‌

2.为什么redis高吞吐

1.单线程和单进程
redis是采用单进程和单线程的,因为CPU不是redis的瓶颈;

那么为什么采用单线程和单进程,为何速度还是那么快?

redis具有很高吞吐量的原因:
完全基于内存 :操作数据快
数据结构简单,对数据操作也简单
使用多路 I/O 复用模型:高效处理多个连接请求
解释一下多路 I/O 复用模型:
多路:多个网络连接;
复用:复用同一个线程;
主要是利用epoll机制,也就是在当有一个或多个I/O事件时,程序会进行轮询,当然这个轮询不是把所有的都进行轮询一遍,而是只轮询那些真正发出事件的流;轮询到后会进行依次处理,这样就避免了大量无用的操作;
单线程单进程的好处:
代码更清晰,处理逻辑更简单 ;
不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
不存在多进程或者多线程导致的切换而消耗CPU;
单线程单进程的弊端:
针对多核CPU情况,就无法利用多核的资源;
当然,如果想要利用起来多核CPU,那么可以通过单机多开redis实例。

2.使用Redis有哪些好处?
速度快:数据是存储在内存中的;
支持丰富的数据存储类型:hash,set,zset,list,str;
支持事务,操作是原子性;
有丰富的特性:支持缓存,并可以根据需求设置过期时间;
 

3.kafka高吞吐是为什么

Kafka是一款分布式消息发布和订阅系统,它的特点是高性能、高吞吐量。


4.java9新特性说一下

集合工厂方法

通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:

Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");

除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。

私有接口方法

Java 8 为我们带来了接口的默认方法。 接口现在也可以包含行为,而不仅仅是方法签名。 但是,如果在接口上有几个默认方法,代码几乎相同,会发生什么情况? 通常,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法会成为公共API的一部分。 使用 Java 9,您可以向接口添加私有辅助方法来解决此问题:

public interface MyInterface {

    void normalInterfaceMethod();

    default void interfaceMethodWithDefault() {  init(); }

    default void anotherDefaultMethod() { init(); }

    // This method is not part of the public API exposed by MyInterface
    private void init() { System.out.println("Initializing"); }
}

如果您使用默认方法开发 API ,那么私有接口方法可能有助于构建其实现。

-------------------------------------------------------------------

10.13 10点君航维金

1.springbean创建的过程

在Spring框架中,Bean的创建过程是一个核心概念,涉及到Spring容器的生命周期管理和依赖注入。这个过程通常可以分为以下几个关键步骤:

1. Bean的配置

首先,需要在Spring配置文件中定义Bean。这可以通过XML配置文件、Java注解或Java配置类(使用@Configuration注解)来实现。

XML配置示例:

<bean id="myBean" class="com.example.MyBean"></bean>

Java注解配置示例:

@Component public class MyBean { // ... }

Java配置类示例:

@Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } }

2. Bean的实例化

当Spring容器启动时,它会扫描配置元数据,查找所有定义的Bean。对于每个Bean,Spring容器会负责创建它的实例。这可以通过反射机制实现,根据配置的类来实例化对象。

3.redis数据结构有哪些

Redis是一个开源的高性能键值存储数据库,它提供了多种数据结构来存储数据,如字符串、哈希、列表、集合、有序集合等。Redis将数据存储在内存中,以提供快速的读写访问速度,并且能够通过异步的方式将数据持久化到磁盘上

Redis通过提供超高速的数据访问,常用于缓存网站内容,减轻后端数据库的负担,提高响应速度。它可以缓存网页、数据库查询结果和常用对象。例如,网站可以将热门文章的内容缓存在Redis中,以快速向用户展示,避免每次访问都查询数据库。

  1. 字符串(String)‌:

    • 用于存储简单的键值对。
    • 例如,可以用于存储用户的会话令牌、计数器、配置信息等。
    • 支持的操作包括设置(SET)、获取(GET)、追加(APPEND)等。
  2. 列表(List)‌:

    • 用于存储一系列有序的字符串元素。
    • 例如,可以用于实现消息队列、文章评论列表等。
    • 支持的操作包括在列表头部或尾部插入元素(LPUSH, RPUSH)、从列表头部或尾部弹出元素(LPOP, RPOP)、获取列表中的元素(LRANGE)等。
  3. 集合(Set)‌:

    • 用于存储不重复的字符串元素。
    • 例如,可以用于存储用户的关注列表、共同好友等。
    • 支持的操作包括添加元素(SADD)、删除元素(SREM)、求交集、并集、差集等。
  4. 有序集合(Sorted Set)‌:

    • 用于存储不重复的字符串元素,每个元素都关联一个双精度浮点数分数,表示元素的排序权重。
    • 例如,可以用于实现排行榜、价格优先列表等。
    • 支持的操作包括添加元素(ZADD)、删除元素(ZREM)、获取排名(ZRANK, ZREVRANK)、获取范围元素(ZRANGE, ZREVRANGE)等。
  5. 哈希(Hash)‌:

    • 用于存储键值对集合,其中每个键值对的键都是一个字符串,值也可以是字符串。
    • 例如,可以用于存储对象信息,如用户信息、商品信息等。
    • 支持的操作包括设置字段值(HSET)、获取字段值(HGET)、获取所有字段和值(HGETALL)等。

Redis的单线程架构指的是它的核心数据操作是由一个单一的线程来执行的。这种设计带来了简单性和效率,因为避免了多线程上下文切换的开销,并简化了并发控制,因为不需要考虑数据在多个线程间的同步问题。尽管Redis处理命令的主循环是单线程的,它还是能利用IO多路复用技术来同时处理多个客户端的请求
5.怎么创建覆盖索引

https://blog.youkuaiyun.com/weixin_42263032/article/details/149466696
6.存储引擎有哪些

---------------------------------------------------------------------

10.13 上午11点理想汽车

自我介绍
项目介绍
为什么从央国企离职
在央国企干了什么项目,主要负责什么
优化接口说下
介绍下京喜的项目
做的是商家端,对下单了解吗,做过支付吗
商品的下单支付的一个过程
1.怎么防止高并发商品超卖

防止高并发商品超卖的核心是通过锁机制控制并发修改,确保库存数据一致性。以下是常见解决方案:

数据库锁机制

  • 悲观锁‌:通过数据库排他锁(如:ml-search-more[SELECT FOR UPDATE]{text="SELECT FOR UPDATE"})在读取库存时加锁,避免脏读,更新库存时再次验证锁状态。但可能因数据库事务隔离级别导致并发问题(如MySQL的:ml-search-more[REPEATABLE READ]{text="REPEATABLE READ"}隔离级别)。 ‌12
  • 乐观锁‌:通过版本号或时间戳校验数据一致性,更新库存时不立即加锁,仅在提交时检查数据是否被修改。例如::ml-search-more[UPDATE product_inventory SET stock=stock-quantity, version=version+1 WHERE product_id=productId AND version=version; ‌

分布式锁(如Redis)

在多节点部署时,使用Redis分布式锁保证同一时间只有一个请求能修改库存。例如:使用:ml-search-more[INCRBY]{text="INCRBY"}命令减少库存并配合分布式锁确保操作串行化。 ‌

mysql慢sql优化的方式
mysql的abc 字段建立联合索引 ,查询 bc=1 ab=1,用到了什么索引,

bc=1没用到索引,ab=1用到了联合索引
redis 分布式锁怎么实现

Redis 分布式锁的实现通常依赖于 Redis 的原子性操作,例如 SET 命令的 NX (Not eXists) 和 EX (EXpire) 选项。这种方法可以确保锁的创建是安全的,并且在设置过期时间后,锁会自动释放,防止死锁发生。
接口的幂等性怎么实现

https://blog.youkuaiyun.com/qq_41973594/article/details/109684180

幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。
调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
比如下面这些情况,如果没有实现接口幂等性会有很严重的后果:
支付接口,重复支付会导致多次扣钱
订单接口,同一个订单可能会多次创建。
唯一索引
使用唯一索引可以避免脏数据的添加,当插入重复数据时数据库会抛异常,保证了数据的唯一性。

乐观锁
这里的乐观锁指的是用乐观锁的原理去实现,为数据字段增加一个version字段,当数据需要更新时,先去数据库里获取此时的version版本号

select version from tablename where xxx
AI写代码
sql
更新数据时首先和版本号作对比,如果不相等说明已经有其他的请求去更新数据了,提示更新失败。

update tablename set count=count+1,version=version+1 where version=#{version}
AI写代码
sql
悲观锁
乐观锁可以实现的往往用悲观锁也能实现,在获取数据时进行加锁,当同时有多个重复请求时其他请求都无法进行操作

分布式锁
幂等的本质是分布式锁的问题,分布式锁正常可以通过redis或zookeeper实现;在分布式环境下,锁定全局唯一资源,使请求串行化,实际表现为互斥锁,防止重复,解决幂等。

-----------------------------------------------------------------------------

10.13 下午2点办 贝壳外包

自我介绍
在京东的项目介绍一下,问了项目的一些问题
京喜平平商家端 分机房怎么考虑的,这个项目qps 这个项目是cpu密集还是io密集,io密集
在30的jcyj系统 介绍一下你在里面主要都做了什么,以及这个系统怎么去上线,怎么去解决这个跨部门的沟通的问题
java线程池 tomcat线程池的区别 或者说对于同一请求来了各自的处理流程是什么样的 或者说他们各自配置的核心参数是什么样的

 Java中的线程池(ThreadPoolExecutor)

在Java中,ThreadPoolExecutorjava.util.concurrent包中的一个类,用于创建和管理一个线程池。它提供了一种方式来限制同时运行的线程数量,这对于管理资源、提高性能和响应性非常有用。ThreadPoolExecutor允许你根据需要动态地调整线程池的大小,并且可以配置多种参数,如核心线程数、最大线程数、存活时间等。

Tomcat是一个开源的Web服务器和Servlet容器,它使用自己的线程池来处理HTTP请求。Tomcat的线程池主要负责接收和分发HTTP请求到不同的工作线程上。Tomcat的线程池配置通常在server.xml文件中进行设置,例如设置连接器(Connector)的maxThreads属性来指定最大工作线程数。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="200" />
目的不同‌:Java中的ThreadPoolExecutor主要用于应用程序内部的并发任务管理,而Tomcat的线程池主要用于处理外部的HTTP请求。
‌配置方式不同‌:Java中的线程池通常在应用程序代码中配置和创建,而Tomcat的线程池配置通常在服务器的配置文件中进行。
‌使用场景不同‌:Java线程池适合于需要精细控制并发任务的应用程序内部逻辑,而Tomcat线程池则专注于优化Web应用的性能和资源利用。


mysql索引说一下  索引结构说一下  是b树还是 b+树 b和b+树有什么区别

  1. B-Tree索引‌:

    • 这是最常用的索引类型,适用于全键值、键值范围或键值前缀查找。
    • 适用于=><>=<=BETWEEN以及LIKE(当模式的左侧是常量前缀)操作。
    • 在InnoDB和MyISAM存储引擎中广泛使用。
  2. 哈希索引‌:

    • 基于哈希表实现,仅支持等值比较查询(=)。
    • 适用于等值查询,但不适合范围查询。
    • 在Memory存储引擎中使用。

B树和B+树的核心区别在于‌数据存储位置‌和‌查询效率‌:B树的所有节点(包括根节点、内部节点和叶子节点)均存储数据,而B+树仅叶子节点存储数据,非叶子节点仅存储索引关键字;B+树通过叶子节点的链表连接实现高效范围查询和稳定查询性能,更适合数据库索引等场景。‌‌

Java1.8 1.7中 hashmap结构的区别

 JDK 1.7中,HashMap采用数组加链表的结构,而在 JDK 1.8中,它使用了更复杂的数组、链表和红黑树结合的结构。 红黑树的引入使得查询效率得到提升,通过减少哈希冲突和优化元素的均匀散列程度来实现。但是需要注意的是,链表长度超过8或数组长度超过64时,才会将链表转化为红黑树,因此这种转换并不是一发生冲突就进行的。
 多线程实现有哪些方式

  1. 继承Thread类‌。
    通过继承Thread类并重写run()方法定义线程逻辑,调用start()方法启动线程。优点是简单直观,但缺点是无法扩展其他类(Java单继承限制),且线程间数据共享需额外处理。‌‌1‌‌2
  2. 实现Runnable接口‌。
    实现Runnable接口并重写run()方法,将实例传递给Thread对象后启动。优势是避免单继承问题,支持资源共享,适合多线程协作场景。‌‌1‌‌3
  3. 实现Callable接口‌。
    类似Runnable,但call()方法可返回结果(Future对象获取),支持异常抛出。适用于需获取线程执行结果的场景。‌‌3‌‌4
  4. 使用线程池‌。
    通过Executor框架(如Executors.newFixedThreadPool)管理线程,复用线程资源,提升性能并控制并发量。推荐用于高并发任务,避免频繁创建销毁线程的开销。‌‌3‌‌4

 项目中用到多线程没

面试经历比较好,比较注重技术和项目经历,因为面试官他会引导你去回答这个问题,感谢面试官的这样一个提问题的方式,而且面试官也很礼貌,最后面试结束也说了感谢我之类的话。

-----------------------------------------------------------------------------------------------------------------------------

10.13 下午4点 京东

自我介绍,项目经历

下发节目怎么做的,服务端主动推数据和客户端去拉数据哪个好一些,为什么

时间有点久,当时逻辑忘记了,通过这几天面试想起来这边其实是有开发和web端以及安卓端的一些接口,其中开发和安卓端相关的接口就包含服务端主动去推数据这个事情

1.jvm参数调优遇到过吗

内存不足
当应用出现频繁内存溢出(OOM)或GC停顿时间过长时,需调整堆内存参数。例如,可通过增加-Xms(初始化堆大小)和-Xmx(最大堆大小)解决

-Xms4g -Xmx4g
2.jvm内存结构说一下
3.生产上线后关注那些参数,关注gc的频次,内存是否溢出,说下younggc 最害怕的是什么,youngc的底层是复制算法,害怕存活的对象多,对象多复制就浪费时间
4.怎么保证两个微服务之间通信后数据的一致性,方法比如tcc,mq,分布式锁

  1. 分布式事务:使用XA协议或两阶段提交(2PC)来确保跨多个服务的事务要么全部成功,要么全部回滚,从而维护数据的一致性。

  2. 消息队列:使用消息队列(如Kafka或RabbitMQ)来异步传递数据更新,确保各服务的数据最终一致性。

  3. TCC(Try-Confirm-Cancel):一种二阶段提交的实现方式,涉及主业务、从业务和活动管理器。在第一阶段执行Try操作,在第二阶段根据Try的结果执行Confirm或Cancel操作。

-----------------------------------------------------------------------------------------------------------------------

10.14中铁数科 上午9点

1.mysql怎么执行语句

SQL语句的执行过程可以分为几个关键步骤,这些步骤涉及到查询解析、查询优化、执行计划生成、执行以及结果返回
2,mysql锁
乐观锁 悲观所,mysql怎么实现

乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。

悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是对数据加锁。synchronized关键字和Lock的实现类都是悲观锁

悲观锁认为在数据处理过程中,数据会被频繁地修改,因此它会在数据被读取时就锁定,直到事务结束才释放。在MySQL中,可以通过以下几种方式实现悲观锁:

行锁,表锁

乐观锁则假设多个事务同时操作同一数据时,不会发生冲突,只在提交事务时检查是否有冲突发生。乐观锁的实现通常依赖于数据版本控制。

  1. 使用版本号(Version Control)‌:

    • 在数据库表中添加一个版本号字段(通常是version)。
    • 在读取数据时,获取该版本号。
    • 在更新数据时,检查版本号是否匹配,如果不匹配则说明数据已被其他事务修改。
  2. 使用时间戳

3.线程池原理

---------------------------------------------------------------------------------------------------------------------

10.14 下午4点半加多宝

忽然来了加多宝老师的电话,进行了电话提前面,还需线下面2轮

jsf和dubbo的区别,京东为什么要用jsf

Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC(远程过程调用)框架,它主要用于分布式服务架构中,实现服务的高效治理和集成。

Dubbo的定义

简单来说,Dubbo是一个服务框架,它通过高性能的RPC实现服务的输出和输入功能,使得应用可以方便地进行远程服务调用。Dubbo可以与Spring框架无缝集成,为开发者提供了极大的便利。

Dubbo的工作原理

Dubbo的核心原理是通过远程调用(RPC)来实现各个系统之间的通信和集成。它的工作机制主要包括以下几个方面:

  1. 服务注册与发现‌:服务提供者(Provider)在启动时,会将自己暴露的服务信息注册到注册中心(Registry)。服务消费者(Consumer)通过注册中心来查找服务提供者,从而获取服务。
  2. 远程调用‌:消费者通过动态代理生成一个与远程服务接口一致的代理对象,然后像调用本地方法一样调用代理对象。实际上,这个调用是通过网络将请求发送给服务提供者,然后等待响应。
  3. 负载均衡‌:当一个服务有多个提供者时,消费者需要选择一个合适的提供者来调用。Dubbo提供了多种负载均衡策略(如随机、轮询、一致性哈希等)来决定消费者调用哪个提供者。
  4. 容错机制‌:Dubbo还提供了丰富的容错机制,如失败重试、失败切换、快速失败等,以保证服务的稳定性和可靠性。

Dubbo的核心功能

Dubbo提供了以下核心功能:

  1. 面向接口的远程方法调用‌:使得消费者可以像调用本地方法一样调用远程服务。
  2. 智能容错和负载均衡‌:通过内置的多种负载均衡策略和容错机制,提高系统的可用性和稳定性。
  3. 服务自动注册和发现‌:使得服务提供者可以动态地注册自己的服务,消费者可以动态地发现和调用服务。

-------------------------------------------------------------------------------------------------------------------

10.14 下午6点-7点长亭科技面试
事务为了解决啥

事务主要解决以下问题:

数据一致性

事务通过确保多个操作要么全部成功提交,要么全部失败回滚,避免数据处于中间状态或逻辑矛盾。例如银行转账操作中,账户A扣款和账户B加款必须同时成功或失败,防止资金丢失。 ‌12

原子性

事务将多个操作封装为不可分割的逻辑单元,保证操作序列的完整性。例如更新用户信息和修改账户余额需同时完成,若失败则全部撤销。 ‌14

并发控制

通过隔离机制避免并发事务相互干扰,解决脏读、不可重复读等问题。例如多个用户同时操作同一数据时,事务通过锁机制和隔离级别保证数据一致性。 ‌

什么时候用事务

事务用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性),在需要多个操作作为一个整体执行、维护数据完整性或处理并发访问的场景下必须使用‌,例如银行转账、订单处理或分布式系统操作。‌‌1‌‌2

核心概念与使用场景

事务是数据库操作的基本单位,通过ACID特性保证数据可靠性和一致性。典型场景包括:‌‌3‌‌4

  1. 多表操作需原子性‌:如订单创建需同时更新订单表和库存表,任一失败则全部回滚。‌‌1‌‌2
  2. 并发控制需求‌:多用户同时访问数据时,事务通过隔离级别(如可重复读)防止脏读或数据冲突。‌‌2‌‌5
  3. 长操作或高风险任务‌:批量数据处理或资源密集型操作中,事务可避免中断导致的数据不一致。‌‌1‌‌6
  4. 分布式系统‌:跨多个数据源的操作(如微服务架构)需分布式事务确保全局一致性。‌‌1‌‌7

事务隔离级别是数据库系统中用于保证并发事务正确读取数据的机制,旨在解决多用户共享访问时可能出现的更新丢失、脏读、不可重复读和幻读等问题。

标准SQL规范定义了四种隔离级别。未授权读取(Read Uncommitted)允许脏读,仅通过排他写锁防止更新丢失;授权读取(Read Committed)禁止脏读,但允许不可重复读,通过瞬间共享读锁和排他写锁实现;可重复读(Repeatable Read)禁止不可重复读和脏读,可能发生幻读;序列化(Serializable)通过强制事务串行执行消除所有并发异常,但会显著降低性能。

缓存过期了怎么办,怎么更新缓存里的数据和实时一个样

https://blog.youkuaiyun.com/weixin_50055999/article/details/147782383

延迟双删

延迟双删是一种解决数据库与缓存数据不一致的策略,通过两次删除缓存操作(首次删除后延迟一段时间再执行第二次删除),确保在数据更新过程中避免脏数据问题,最终实现数据一致性。‌ 该策略适用于高并发场景下读多写少的业务,但需权衡延迟时间与系统性能。

核心原理与实现步骤

延迟双删针对缓存与数据库双写场景的数据不一致问题设计,核心是解决并发读写导致的脏数据。例如,线程A删除缓存后更新数据库前,线程B可能读取旧值并回填缓存,造成数据不一致。策略通过延迟二次删除,确保所有读请求完成后再清除潜在脏数据。‌‌1‌‌2

标准实现步骤如下:

  1. 首次删除缓存‌:立即删除待更新数据的缓存,避免后续读取旧值。‌‌1‌‌3
  2. 更新数据库‌:执行数据库写操作,确保数据持久化。‌‌4‌‌5
  3. 延迟等待‌:休眠预设时间(如500ms),覆盖读请求耗时及主从复制延迟。‌‌1‌‌6
  4. 二次删除缓存‌:清除可能被回填的脏数据,强制后续请求从数据库加载最新值。‌‌3‌‌7

关键参数与优缺点

延迟时间需动态调整,公式为:‌延迟时间 = 主从复制最大延迟 + 业务处理耗时 + 安全冗余‌。初始值建议3-5秒,通过监控系统(如Prometheus)优化。实现方式包括:‌‌6

  • 异步线程‌:使用ScheduledExecutorService或线程池,避免阻塞主业务。‌‌5‌‌8
  • 消息队列‌:如Kafka,确保高可靠性和分布式支持。‌‌6‌‌7

优点‌:

  • 有效减少并发导致的数据不一致,尤其适合读多写少场景。‌‌9‌‌10
  • 实现简单,易于集成到现有系统(如SpringBoot AOP)。‌‌5‌‌8

缺点‌:

  • 引入延迟,不适合低延时或强一致性要求场景(如秒杀)。‌‌2‌‌6
  • 依赖时间估算,若设置不当可能残留脏数据或增加数据库压力。‌‌3‌‌4

适用场景与替代方案

延迟双删适用于允许最终一致性的场景,如电商库存、社交动态更新等。若需强一致性,可考虑分布式事务(TCC)或基于Binlog的同步方案。‌‌

什么叫hash表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

https://cloud.tencent.com/developer/article/2227040

redis是一种高级的key-value的存储系统,其中value支持五种数据类型:

Redis支持的键值数据类型

string字符串类型

hash表类型

list 列表类型

set 集合类型

zset 有序集合类型

自己设计node的一个map,map的结构什么样的

最后来画一下MyMap对象在堆内存中的图

路由器交换机区别

路由器和交换机虽然都是网络设备,但它们在工作层级、连接范围、放置位置以及功能上都有显著的不同哦。

首先,路由器工作在网络层(OSI第三层),它主要是根据IP地址来转发数据包,实现不同网络之间的通信。比如,你家里的局域网和互联网之间的连接,就需要路由器来“翻译”和转发数据。而交换机呢,它工作在数据链路层(OSI第二层),主要是基于MAC地址来转发数据帧,实现同一局域网内设备之间的高速通信。

再来说说连接范围吧。交换机主要是用来连接同一局域网内的设备,让它们能够互相通信。而路由器则是用来连接不同网络或子网的,它就像是一个“翻译官”,让不同网络之间的设备也能够顺畅地交流。

在放置位置上,交换机通常被放置在局域网内部,比如办公室、机房等地方,用于局域网内的高速数据转发。而路由器则通常被放置在网络边界,比如连接内网和互联网的地方,它负责把内网的数据转发到外部网络,同时也把外部网络的数据转发到内网。

http一次请求的整个过程

HTTP(超文本传输协议)是一种用于分布式、协作式、超媒体信息系统的应用层协议。当一个HTTP请求被发送时,它经历了几个关键的步骤,从客户端发起请求到服务器响应。下面将详细解释这个过程:

1. 客户端发起请求

  • 构建请求‌:客户端(如浏览器、Postman、curl命令行工具等)构建一个HTTP请求。这包括指定请求的方法(如GET、POST、PUT、DELETE等)、请求的URL、HTTP头部(如Content-Type、Authorization等)以及可能的请求体(在POST或PUT请求中)。

  • 解析DNS‌:客户端首先将URL中的域名解析为IP地址。这通过查询DNS服务器完成。

2. 建立TCP连接

  • 三次握手‌:客户端与服务器之间的TCP连接通过三次握手建立。这一过程包括SYN(同步序列编号)、SYN-ACK(同步确认应答)和ACK(确认)。

3. 发送HTTP请求

  • 发送请求报文‌:一旦TCP连接建立,客户端开始发送HTTP请求报文到服务器。这包括起始行(如GET /index.html HTTP/1.1)、头部字段和可能的消息体。

4. 服务器处理请求

  • 接收请求‌:服务器接收到客户端的HTTP请求报文。

  • 解析请求‌:服务器解析请求的URL、方法和其他头部信息。

  • 处理请求‌:根据请求的类型和URL,服务器执行相应的操作,比如从文件系统中读取文件、查询数据库或调用应用程序代码。

5. 服务器响应

  • 构建响应‌:服务器处理完请求后,构建一个HTTP响应报文。这包括状态行(如HTTP/1.1 200 OK)、响应头部和可能的响应体。

  • 发送响应‌:服务器将响应报文发送回客户端。

6. 客户端接收响应

  • 接收响应‌:客户端接收到服务器的响应报文。

  • 解析响应‌:客户端解析响应的状态码、头部和可能的消息体。

  • 显示内容‌:根据响应的内容类型(如text/html、image/jpeg等),客户端决定如何处理这些数据(例如,显示HTML页面、保存图片等)。

7. 连接关闭或保持活动

  • 四次挥手‌:如果使用的是HTTP/1.1且没有使用持久连接(Connection: keep-alive),则TCP连接在交换完数据后通过四次挥手关闭。如果使用了持久连接,连接可能会保持打开状态以供进一步的请求使用。

8. 后续处理(可选)

  • 缓存处理‌:客户端或代理服务器可能会根据缓存策略存储响应内容,以便于未来的请求可以直接使用缓存内容,减少对服务器的请求。

通过上述步骤,一个HTTP请求从客户端到服务器再到客户端的过程就完成了。这个过程是互联网上大多数数据交换的基础,无论是浏览网页、发送API请求还是其他形式的网络通信

为什么3次握手和为什么4次分手

TCP三次握手和四次挥手的核心目的是确保连接的可靠性及双方收发能力的验证,同时防止历史连接请求造成的干扰。

三次握手的原因

  1. 双向验证收发能力
    三次握手能确保双方都完成发送和接收验证:

    • 第一次握手:客户端确认服务器的接收能力,服务器确认客户端的发送能力。
    • 第二次握手:客户端确认服务器的发送能力,服务器确认客户端的接收能力。
    • 第三次握手:双方确认彼此的收发功能正常。 ‌12
  2. 防止历史连接干扰
    若仅两次握手,无法确认双方收发功能均正常,可能导致失效的连接请求被误处理。三次握手通过额外验证步骤,降低历史连接请求被错误处理的风险。 ‌23

四次挥手的原因

  1. 双向关闭数据传输
    需分别关闭客户端到服务器、服务器到客户端的数据传输路径:

    • 客户端发送FIN包关闭本地到服务器的数据传输。
    • 服务器响应ACK确认收到关闭请求。
    • 服务器发送FIN包关闭本地到客户端的数据传输。
    • 客户端再次发送ACK确认连接完全关闭。 ‌24
  2. 可靠断开连接
    四次挥手确保双方资源正确释放:

    • 前两次挥手关闭本地数据传输路径,避免数据残留。
    • 后两次挥手释放连接资源,防止资源占用。 ‌

node高吞吐量怎么实现的,异步 async await 单线程异步 回调地狱知道吗

  1. 使用非阻塞I/O操作‌:
    Node.js是基于事件驱动和非阻塞I/O的,这是其设计的基础。确保你的代码尽可能使用非阻塞操作,例如使用fs.readFile而不是fs.readFileSync

  2. 使用集群(Cluster)模块‌:
    Node.js的cluster模块允许你轻松地创建子进程(workers),这些子进程可以共享同一个服务器端口。每个worker运行在独立的V8实例中,可以并行处理请求,从而提高吞吐量。

-------------------------------------------------------------------------------------------------------------
15号下午2点卓望

自己设计一个sql,让我写出sql
java设计原则和设计模式有哪些

Java设计原则与设计模式是软件开发中重要的概念,以下是主要内容和分类:

六大设计原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值