当前位置: 首页 > news >正文

秋招面经——结合各方面试经验

Mysql

mysql事务

共享锁与排他锁

共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。(读都允许读,但我在读不允许你去改)
排他锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。(我在修改数据,别的操作都被禁止)

事务特性

事务四个特性:ACID

  • 原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况
  • 一致性(Consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态。
  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。

如何实现这些特性

  • 原子性:靠Undo log实现,即如果一个事务异常或执行失败后进行回滚
    • 当事务对数据库进行修改时,InnoDB会生成对应的 undo log;
    • 如果事务执行失败或调用了 rollback,导致事务需要回滚,便可以利用 undo log 中的信息将数据回滚到修改之前的样子。
    • undo log 属于逻辑日志,它记录的是sql执行相关的信息。
    • 当发生回滚时,InnoDB 会根据 undo log 的内容做与之前相反的工作
  • 一致性:事务的最终目的,即需要数据库层面保证,又需要应用层面进行保证,并且MySQL底层通过两阶段提交事务保证了事务持久化时的一致性。
  • 隔离性:靠锁和MVCC实现
    • 锁:
      • 在 InnoDB 事务中,行锁通过给索引上的索引项加锁来实现。
      • 只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁。
      • 行级锁定同样分为两种类型:共享锁和排他锁
      • 使用Record Lock和Gap Lock(解决幻读)
    • MVCC:多版本并发控制
      • DB_TRX_ID:事务 ID,是根据事务产生时间顺序自动递增的
      • DB_ROLL_PTR:回滚指针,本质上就是一个指向记录对应的undo log的一个指针,InnoDB 通过这个指针找到之前版本的数据
      • MVCC在事务开启时会为事务生成一个ID,并且在查询时生成一个快照,能看到当前活跃的事务,然后通过比较快照的生成时间和活跃事务的提交时间进行对比,判断读取哪个版本的数据。
  • 持久性:靠Redo log实现
    • mysq|修改数据的时候会在redo log中记录一份日志数据,就算数据没有保存成功,只要日志保存成功了,数据仍然不会丢失
    • 当一条数据需要更新时,InnoDB会先将数据更新,然后记录redoLog 在内存中,然后找个时间将redoLog的操作执行到磁盘上的文件上。

mysql隔离级别

mysql具有四种隔离级别

隔离级别说明
读未提交一个事务还没提交时,它做的变更就能被别的事务看到
读已提交一个事务提交之后,它做的变更才会被其他事务看到
一个事务提交之后,它做的变更才会被其他事务看到一个事务中,对同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。InnoDB默认级别
串行化事务串行化执行,每次读都需要获得表级共享锁,读写相互都会阻塞,隔离级别最高,牺牲系统并发性。

不同的隔离级别是为了解决不同的问题。也就是脏读、幻读、不可重复读。

问题说明
脏读读到了其他事务未提交的数据
不可重复读在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
幻读在一个事务中,后续读取的数据,在最开始读取的数据中不存在
隔离级别脏读不可重复读幻读
读未提交可以出现可以出现可以出现
读已提交不允许出现可以出现可以出现
一个事务提交之后,它做的变更才会被其他事务看到不允许出现不允许出现可以出现
串行化不允许出现不允许出现不允许出现

Mysql和MangoDB的比较

Mysql:

  • 关系数据库系统,相关信息可能存储在单独的表中,但通过使用关联查询来关联。通过使用这种方式,使得数据重复量被最小化。
  • 关系型数据库的最大特点就是事务的一致性
  • 为了维护一执行需要消耗大量的性能

MangoDB:

  • 少量数据时,数据存在内存中。当内存不够时,只将热点数据放在内存,其他存入磁盘
  • 数据存储在类似JSON的文档中,并且文档中每个json串结构可能有所不同
  • 使用动态模式,这意味着您可以在不首先定义结构的情况下创建记录,例如字段或其值的类型
  • 支持多种存储格式(mysql只支持基本类型)
  • 设计了高可用性和可扩展性,并提供了即用型复制和自动分片功能。
  • 简化了开发,因为 MongoDB 文档自然映射到现代的面向对象编程语言。使用 MongoDB 可以避免将代码中的对象转换为关系表的复杂对象关系映射(ORM)层。

sql优化

  1. select * 浪费资源,减少使用,且不走索引
  2. union allunion更快(但是不去重)
  3. 小表驱动大表:大表 in 小表 ; 小表 exists 大表;
  4. 批量插入数据尽量使用insertBatch,而不是循环(循环会多次请求数据库)
  5. 多使用limit,减少内存消耗
  6. 海量数据查询分页,使用条件查询结合 limt size,去替代limit start size
  7. 使用连接查询代替子查询(子查询会为子查询额外创建一个表)
  8. join的表不能太多,否则容易选错索引
  9. 索引不宜太多,因为在增删改查的时候都需要更新索引表(使用联合索引)
  10. group by 后接的having条件适当提到前面的where

Spring

maven中版本 版本冲突

maven依赖中不允许存在两个不同版本的同名依赖。(添加<exclusion>标签来解决冲突)

Kafka

Kafka和其他消息队列对比

对比KafkaRocketMQRabbitMQ
优先级队列不支持通过建立不同的队列通过建立不同的队列
延迟队列不支持基于队列的延迟基于队列的延迟
死信队列不支持支持支持
消费模式pullpull/pushpull/push
广播模式发布订阅发布订阅点对点
(但可以由交换机实现发布订阅模式)
消息回溯offset和timestamp按时间回溯不支持
消息堆积&持久化磁盘堆积:所有消息都存在磁盘
每个partition对应一个或多个segment file
基于磁盘存储
使用commit Log存储消息(顺序写到文章末尾)
后台异步线程同步到consumerQueue
使用内存映射文件加速消息读取
内存堆积(换页操作存储到磁盘)
(或使用惰性队列将消息持久化到磁盘)
流量控制支持client和user级别多种维度的流量控制流量控制基于credit-base算法,是内部被动触发的保护机制,作用于生产者层面
顺序性消息同分区内有序Broker消息队列锁(分布式锁)
Consumer消息队列锁(本地锁)
Consumer消息处理队列消费锁(本地锁)
无法保证全局有序
性能最快中等最慢
高可用和容错包含Leaer和Follower
Leader失效后随机选举Leader
Master和Slavecluster(集群),federation(联盟),shovel
定时消息不支持支持支持
负载均衡
(三者都是软件负载均衡)
consumer端实现
每个消费者组都有指定一个broker为coordinator(群组协调器)
consumer端实现
所有的consumer都能得到consumer的订阅表,每个consumer自己做负载均衡
设置Prefetch count来限制Queue每次发送给每个消费者的消息数
刷盘策略异步刷盘
每3s钟调用1次fsync
支持同步刷盘
CommitRealTimeService 异步刷盘 && 开启内存字节缓冲区 第一
FLushRealTimeService 异步刷盘 && 关闭内存字节缓冲区 第二
GroupCommitService 同步刷盘 第三
优先内存存储,Buff不够再刷盘
消息中间件KafkaRocketMQRabbitMQ
特点高吞吐量 持久性
分布式 发布订阅
高可用性 顺序消息
分布式事务 高扩展性
灵活路由
点对点+发布订阅+请求响应
可靠性 插件扩展
适用场景流式处理(日志收集 实时分析)
大数据集成
可靠性(持久化)要求高
异步消息处理 顺序消息
分布式事务
复杂路由 灵活消息模式 异步任务处理

Redis

缓存穿透、击穿、雪崩

缓存穿透

指访问一个缓存和数据库中都不存在的key,由于这个key在缓存中不存在,则会到数据库中查询,数据库中也不存在该key,无法将数据添加到缓存中,所以每次都会访问数据库导致数据库压力增大。

解决办法
将访问过的key设置为空key,加入到缓存中

缓存击穿

指大量请求访问缓存中的一个key时,该key过期了,导致这些请求都去直接访问数据库,短时间大量的请求可能会将数据库击垮。

解决办法
添加互斥锁或分布式锁,让一个线程去访问数据库,将数据添加到缓存中后,其他线程直接从缓存中获取。
热点数据key不过期,定时更新缓存

缓存雪崩

指在系统运行过程中,缓存服务宕机或大量的key值同时过期,导致所有请求都直接访问数据库导致数据库压力增大

解决办法
将key的过期时间打散,避免大量key同时过期。
对缓存服务做高可用处理。
加互斥锁,同一key值只允许一个线程去访问数据库,其余线程等待写入后直接从缓存中获取。

缓存不一致

数据库中的数据和Redis缓存中的数据不一致的问题

出现原因:
缓存和数据库中都需要更新数据,对二者的操作无法保证原子性的情况下,就会出现不一致问题

解决办法:

  • 重试机制:使用消息队列暂存要操作的数据,操作失败再从消息队列取回
  • 延迟双删:先删除缓存数据 ->再执行update更新数据表 ->最后(延迟N秒)再删除缓存

Redis的优势

数据存在内存中,直接与内存相连,读写速度很快。
使用单线程模型,无多线程 竞争 锁 等问题
支持数据持久化
支持数据备份 master-slave模式数据备份(需要多个redis实例)
操作均为原子性的

Redis持久化

  • AOF:采用日志的形式来记录每个写操作,追加到AOF文件的末尾(默认情况是不开启AOF)重启时再重新执行AOF文件中的命令来恢复数据(AOF是执行完命令后才记录日志的)
  • RDB:把内存数据以快照的形式保存到磁盘上。RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作

Redis面对大量访问时的处理办法

Redis是单线程服务,所有指令都是顺序执行,当某一指令耗时很长时,就会阻塞后续的指令执行。当被积压的指令越来越多时,Redis服务占用CPU将不断升高,最终导致Redis实例崩溃甚至服务器宕机。

处理办法:

  • 使用Redis连接池
  • 批量操作,使用Redis管道机制
  • 使用合适的数据结构和命令
  • 使用Reids集群

Redis面对大量数据存储

  • 数据分片,将数据存储到多个Redis节点上
  • 使用合适的数据结构
  • 合理设置过期时间
  • 使用持久化机制

Redis键的设计

  • 遵循基本格式:[业务名称]:[数据名]:[id]
    长度不超过44字节
  • 拒绝BigKey
  • 恰当的数据格式
    对象格式的数据可以采用json存储,但是更好的是采用hash格式存储
  • 将集合类型中数据量大的进行拆分

Redis中各类型的底层结构

String:简单动态字符串

List:双向链表或压缩链表(ziplist)

  • 双向链表:列表长度较长或包含较多元素
  • 压缩链表:在一定程度上减少内存使用,存储在连续的内存区域中

Set:哈希表(Hash Table)和跳跃表(Skip List)

  • 哈希表:集合元素较多或元素大。将集合的元素作为哈希表的键,值被设为固定的空值
  • 跳跃表:有序的数据结构,支持快速查找、插入和删除(因此也被用于ZSet)

ZSet:使用跳跃表存储元素,使用哈希表存储 元素:分值

Hash:哈希表和压缩链表

  • 哈希表:hash类型的字段数量较多,或字段大小较大时
  • 压缩链表:字段的顺序是按照插入的先后顺序进行存储的

Elasticsearch

es的数据格式怎么规定的

通过mapping进行定义,可以查看我的相关文档 ElasticSearch 其中的mapping映射属性

为什么使用es

  1. 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到
  2. 实时分析的分布式搜索引擎
    • 索引分拆成多个分片,每个分片可以有多个副本存储在不同的节点上,负载均衡等
  3. 可以扩展到上百台服务器
  4. 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等

Docker

Docker镜像

Docker参考文章
Docker 容器的运行是基于宿主机的内核,通过linux的namespaces来实现隔离,相对于虚拟机而言降低了硬件资源的性能损耗,且具备一定程度上的应用隔离效果。

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

Java基础

Hash冲突的解决方式

  1. 链表法(HashMap)+ 红黑树(默认链表长度超过8)
  2. 再哈希法
  3. 开放定址法
  4. 建立公共溢出区

HashMap和CurrentHashMap的对比

HashMap线程不同步,底层使用链表和红黑树的方式处理冲突
CurrentHashMap:

  • JDK 1.7 :使用segment数组,每个segment中存储一定量的HashEntry,HashEntry用链表处理冲突;线程安全通过锁被操作的segment
  • JDK 1.8 :直接使用Node结点,使用Synchronized和CAS的方式实现线程安全

红黑树的特性,以及保持平衡的方式

  1. 每个结点不是红色就是黑色
  2. 根节点是黑色的
  3. 如果一个节点是红色的,则它的子结点必须是黑色的(没有连续的红色节点)
  4. 对于每个结点,从该结点到其所有可到达的叶结点的路径中,均包含相同数目的黑色结点
  5. 每个 NIL 叶子结点都是黑色的(此处的叶子结点指的是空结点)

保持平衡:

  • 插入:
    • 插入新节点涂红色
    • 如果父节点为黑色不用操作
    • 如果父节点为红色
      • 父节点无兄弟节点或父节点的兄弟节点为黑色,直接旋转操作
      • 父节点有兄弟结点,且兄弟结点也为黑色,直接上溢:将父节点和叔都涂为黑色,将祖父节点涂为红色,然后在上溢部分继续判断是否需要处理
  • 删除:
    • 删除结点都在B树的最后一层,可以理解为都在红黑树的最下面2层
    • 删除最后一层的红色结点没有影响
    • 删除最后一层的黑色节点:
      • 如果黑色节点有2个子节点,不允许删除
      • 如果黑色结点只有一个子节点,删除黑色结点,并用子节点取代该位置,同时染成黑色
      • 如果黑色结点为叶子节点:
        • 该节点没有兄弟节点(只能是根节点),直接删除
        • 该节点的兄弟结点为黑色,旋转兄弟结点
        • 该节点的兄弟结点为红色,旋转兄弟和父节点

线程

自定义线程池有哪些参数,分别是什么

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) 
参数参数意义参数名称参数要求
参数一指定线程池的线程数量(核心线程)corePoolSize不能小于0
参数二指定线程池可支持的最大线程数maximumPoolSize最大数量 >= 核心线程数量
参数三指定临时线程的最大存活时间keepAliveTime不能小于0
参数四指定存活时间的单位(秒、分、时、天)unit时间单位
参数五指定任务队列workQueue不能为null
参数六指定用哪个线程工厂创建线程threadFactory不能为null
参数七指定线程忙,任务满的时候,新任务来了怎么办handler不能为null

volitail关键字

保证了不同线程之间对共享变量操作的可见性

  • 每个线程都能从主内存中获取volitail修饰的属性,并缓存在本地工作内存中
  • 一旦有线程修改了该值,会自动刷新到主内存中,同时其他内存中的该值失效,再次访问需要重新到主内存中获取

禁止对指令进行重排序操作。

  • 保证该指令前的所有指令都执行,该指令后的所有指令都未执行

AQS

AQS ( Abstract Queued Synchronizer )是一个抽象的队列同步器,通过维护一个共享资源状态( Volatile Int State )和一个先进先出( FIFO )的线程等待队列来实现一个多线程访问共享资源的同步框架。

原理
AQS 为每个共享资源都设置一个共享资源锁,线程在需要访问共享资源时首先需要获取共享资源锁,如果获取到了共享资源锁,便可以在当前线程中使用该共享资源,如果获取不到,则将该线程放入线程等待队列(先进先出),等待下一次资源调度

使用
在使用AQS创建自定义锁时,AQS一般是被内部类去继承实现的。需要去重写几个方法:tryAcquire(int)tryRelease(int)tryAcquireShared(int)tryReleaseShared(int)isHeldExclusively()(最后一个方法一般在需要使用condition时才需要重写,即当某线程需要放到条件队列中,遇到某条件才唤醒时使用)
在使用时可以在tryAcquire(int)tryRelease(int)中使用getState(),setState(int),compareAndSetState(int,int)去获取和改变AQS的状态码,AQS的状态码默认情况下是:0代表锁可用,1代表锁被占有;使用setExclusiveOwnerThread()设置独占资源的线程;因此可以在tryAcquire(int)获取状态码,为0的情况下置为1,并返回true,在tryRelease(int)将状态码置为0,完成锁的释放。在继承AQS类并重写完这些方法后,就可以调用其本身的acquire和release方法获取和释放锁了。

CAS如何实现

CAS:CompareAndSwep,其中包括几个参数:①对象本身②值的内存偏移地址③期望更新的值(旧值)④更新的值(新值),只有当目前的值和期望更新的值相同时,才会去完成更新操作,否则会自旋或者不操作。
但作为乐观锁,可能会遇到ABA问题,可用版本号和时间戳来解决

共享锁

mysql的行锁中的读锁即是共享锁。即:多个线程如果都对某一行数据发起读请求,就会尝试获取该行数据的共享锁,可由多个线程或事务获取到该共享锁,即读操作可同时发生。
与此相对的就是排他锁/互斥锁,一旦获取了一行数据的排他锁/互斥锁,其他事务或线程就不能获取该数据的任何锁;并且如某行数据被获取了共享锁,也不能再被获取排他锁/互斥锁。
读可共享-读写不共享-写写不共享

分布式锁

分布式锁用于解决分布式系统中控制共享资源的访问

Redis的分布式锁:

  1. 使用setnx添加锁(setnx保证原子性,且只有在key不存在时才能成功,即多个系统并发获取锁,也只有一个系统能成功获取到锁)set <lock.key> <lock.value> nx ex <expireTime>同时用ex能设置过期时间
  2. 可使用del主动释放锁,即直接删除该键值对
  3. 可重入锁的实现方式:hash类型设置可重入锁,HSETNX,然后通过获取其中的字段判断是否可重入,并且能够设置重入的次数。
  4. 使用Redission的看门狗机制或者自定义守护线程维护获取锁的业务的锁过期时间

ReentrantLock和Synchronized

ReentrantLockSynchronized
锁实现机制依赖AQS监视器模式
灵活性支持响应中断、超时、尝试获取锁不灵活
释放形式必须显式调用unlock()自动释放监视器
锁类型公平锁&非公平锁非公平锁
条件队列可关联多个条件队列关联一个条件队列
可重入性可重入可重入

JVM

JVM有哪些垃圾回收器

垃圾回收器版本适用范围特点算法
Serial(串行收集器)jdk1.1新生代只会使用一个CPU或者一条GC线程进行垃圾回收
并且在垃圾回收过程中暂停其他工作线程
标记-复制-清除
ParNewjdk1.3新生代Serial的多线程版本标记-复制-清除
Parallel Scavengejdk1.4新生代追求CPU吞吐量的优化
能在较短的时间内完成指定的任务
标记-复制-清除
Serial Oldjdk1.3老年代单线程 暂停应用程序执行标记-整理
Parallel Oldjdk1.5老年代多线程 和用户线程并发标记-整理
CMS(concurrent mark sweep)jdk1.4老年代初始标记(停) 并发标记(运)
重新标记(运) 并发清除
标记-清除
G1jdk1.7引入
jdk1.9默认
老年代重新标记阶段停止业务线程 软实时
内存划分变为Region并评估每个region价值 首先清除垃圾最多的区域
标记-整理

类加载机制

java源码经过javac编译后形成class字节码文件,jvm将字节码文件加载进内存,经过字节码验证器验证,为类变量进行内存分配和初始化零值,字节码解释器解释执行字节码指令转换为底层机器代码并执行。

双亲委派

如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载。
当发现在某一步该类已经被加载过时,会直接返回已加载的类,避免重复加载

反射

反射通过类加载器加载class字节码文件实现,可通过一个类的字节码获取该类的所有信息,包括属性、方法等

获取类对象

  1. Class<?> clazz = MyClass.class;通过类字面常量获取类对象
  2. Class<?> clazz = Class.forName("com.example.MyClass");通过Class.forName()方法获取
  3. MyClass object = new MyClass(); Class<?> clazz = obj.getClass();通过对象的getClass()获取
  4. Class<?> clazz = getClass().getClassLoader().loadClass("com.example.MyClass");

根据类对象生成对象实例:Object object = (Object)clazz.newInstance();

根据类对象获取属性和方法:

  • getFields():获取所有public的属性
  • getDeclaredFields():获取所有(不限修饰符的)属性
    • getType:以Class形式返回类型
    • getName:返回属性名
    • setAccessible(true):使用
  • getMethods():获取所有pubic的方法
  • getDeclaredMethods():获取所有(不限修饰符的)方法
    • getReturnType:以Class形式获取返回类型
    • getName:返回方法名
    • getParameterTypes:以Class[]返回参数类型数组
    • invoke(obj, param1, ...):调用方法
  • getConstructors():获取所有public的构造方法
  • getDeclaredConstructors():获取所有(不限修饰符的)构造方法
    • getModifiers:以int形式返回修饰符.
    • getName:返回构造器名(全类名).
    • getParameterTypes:以Class[]返回参数类型数组

异常

异常的分类,以及有什么区别

Error(错误):是程序无法处理的错误,表示代码运行时JVM出现的问题。例如:OutOfMemoryErrorNullPointerException
Exception(异常):是程序本身可以处理的异常。

  • RuntimeException:运行时异常,不受检查异常,表示JVM常用操作引发的错误,编译时能通过,但会在后期代码的执行过程中暴露出来
  • 其他异常:受检查异常,在编译时不能被忽略,程序必须对它有相应的处理

计算机网络

Https为什么安全

  1. 浏览器发起 HTTPS 请求
  2. 服务端返回 HTTPS 证书
  3. 客户端验证证书是否合法,如果不合法则提示告警
  4. 当证书验证合法后,在本地生成随机数
  5. 通过公钥加密随机数,并把加密后的随机数传输到服务端
  6. 服务端通过私钥对随机数进行解密
  7. 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输

数据传输是用对称加密:非对称加密的加解密效率非常低

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

TCP拥塞控制

  1. 慢启动
    • 最初拥塞控制窗口cwnd的初始值为一个小值,推荐为2个MSS(MSS通常为536字节或1460字节)
      • MSS:Maximum Segment Size ,最大报文段长度,TCP提交给IP层最大分段大小
    • 当收到一个ACK后,cwnd = cwnd*2
  2. 拥塞避免
    • 拥塞窗口cwnd值等于慢开始门限值后,cwnd = cwnd+1
  3. 快速恢复
    • 拥塞时,将慢开始门限修改为cwnd/2,并且将cwnd = cwnd/2
  4. 快速重传
    • 连续收到3条对某报文段的重传确认,就需要快速重传该报文段

地址框输入url后经历了什么

  1. DNS解析
    • 在自己的DNS高速缓存中查找
    • 权限域名服务器->顶级域名服务器->根域名服务器
  2. TCP连接
    • TCP三次握手
  3. 发送HTTP请求
  4. 服务端处理请求:根据路径查找对应的资源(服务),然后返回数据报
  5. 浏览器收到返回的数据,进行渲染,形成页面
  6. TCP断开
    • 四次挥手

场景问题

流量大对服务的影响

数据有效期为半年

30分钟延迟任务

秒杀系统

熔断 服务降级

在线笔试

lc33.旋转数组

题目:搜索一个 升序的 后经旋转后 的数组中 目标数的下标
思路:二分查找
示例代码:

class Solution {public int search(int[] nums, int target) {int n = nums.length;if (n == 0) {return -1;}if (n == 1) {return nums[0] == target ? 0 : -1;}int l = 0, r = n - 1;while (l <= r) {int mid = (l + r) / 2;if (nums[mid] == target) {return mid;}if (nums[0] <= nums[mid]) {if (nums[0] <= target && target < nums[mid]) {r = mid - 1;} else {l = mid + 1;}} else {if (nums[mid] < target && target <= nums[n - 1]) {l = mid + 1;} else {r = mid - 1;}}}return -1;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/search-in-rotated-sorted-array/solutions/220083/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-leetcode-solut/
来源:力扣(LeetCode

回文子串

回文子串:一个字符串的子串,如果它是回文的,则这是一个回文子串
思路:可使用动态规划算法,找出回文子串的个数或者最长回文子串

lc854.最长山脉数组

题目:山脉数组指一个数组中存在一个中间位置的元素a[i],0--i单增,i~len-1单减;给一个数组arr,从中找到最长山脉子数组
思路:遍历枚举就行
示例代码:

class Solution {public int longestMountain(int[] arr) {int n = arr.length;int ans = 0;int left = 0;while (left + 2 < n) {int right = left + 1;if (arr[left] < arr[left + 1]) {while (right + 1 < n && arr[right] < arr[right + 1]) {++right;}if (right < n - 1 && arr[right] > arr[right + 1]) {while (right + 1 < n && arr[right] > arr[right + 1]) {++right;}ans = Math.max(ans, right - left + 1);} else {++right;}}left = right;}return ans;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-mountain-in-array/solutions/459406/shu-zu-zhong-de-zui-chang-shan-mai-by-leetcode-sol/
来源:力扣(LeetCode

lc54.螺旋矩阵

题目:按照顺时针螺旋顺序,返回矩阵中的所有元素。
图源LeetCode
示例代码:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {//使用四个值去记录边界int left = -1;int right = matrix[0].length - 1;int up = 0;int down = matrix.length;//使用两个值去记录方向int x = 0;int y = 1;//使用一个值去判断下次转向的条件int flag = 1;//使用两个值去记录位置int i = 0, j = 0;//计数停止int count = 0;int sum = (right + 1) * down;List<Integer> list = new LinkedList<>();while (count < sum) {list.add(matrix[i][j]);count++;switch(flag){case 0:{if(i==up&&j==left){x=0;y=1;flag=1;right--;}break;}case 1:{if(i==up&&j==right){x=1;y=0;flag=2;down--;}break;}case 2:{if(i==down&&j==right){x=0;y=-1;flag=3;left++;}break;}case 3:{if(i==down&&j==left){x=-1;y=0;flag=0;up++;}break;}default:{break;}}i+=x;j+=y;}return list;}
}

lc23.合并k个升序链表

相关文章:

秋招面经——结合各方面试经验

Mysql mysql事务 共享锁与排他锁 共享锁&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同数据集的排他锁。&#xff08;读都允许读&#xff0c;但我在读不允许你去改&#xff09; 排他锁&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同…...

Python random模块用法整理

随机数在计算机科学领域扮演着重要的角色&#xff0c;用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能&#xff0c;本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…...

【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…...

基于Python的HTTP代理爬虫开发初探

前言 随着互联网的发展&#xff0c;爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中&#xff0c;由于个人或机构的目的不同&#xff0c;也会面临一些访问限制或者防护措施。这时候&#xff0c;使用HTTP代理爬虫可以有效地解决这些问题&#xff0…...

时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-…...

每日一题之二进制中1的个数

二进制中1的个数 问题描述&#xff1a; 输入一个整数 n &#xff0c;输出该数 32 位二进制表示中 1 的个数。其中负数用补码表示。 科普一下有符号数的三种表示&#xff1a;原码、反码和补码&#xff0c;可能有时候遗忘了。 真值&#xff1a;带有符号位的机器数&#xff08;一…...

8.17校招 内推 面经

绿泡泡&#xff1a; neituijunsir 交流裙&#xff0c;内推/实习/校招汇总表格 1、校招 | 腾讯2024校园招聘全面启动(内推) 校招 | 腾讯2024校园招聘全面启动(内推) 2、校招 | 大华股份2024届全球校园招聘正式启动(内推) 校招 | 大华股份2024届全球校园招聘正式启动(内推) …...

VScode搭建Opencv(C++开发环境)

VScode配置Opencv 一、 软件版本二 、下载软件2.1 MinGw下载2.2 Cmake下载2.3 Opencv下载 三、编译3.1 cmake-gui3.2 make3.3 install 四、 VScode配置4.1 launch.json4.2 c_cpp_properties.json4.3 tasks.json 五、测试 一、 软件版本 cmake :cmake-3.27.2-windows-x86_64 Mi…...

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…...

Hadoop小结(上)

最近在学大模型的分布式训练和存储&#xff0c;自己的分布式相关基础比较薄弱&#xff0c;基于深度学习的一切架构皆来源于传统&#xff0c;我总结了之前大数据的分布式解决方案即Hadoop&#xff1a; Why Hadoop Hadoop 的作用非常简单&#xff0c;就是在多计算机集群环境中营…...

ORA-600 ksuloget2 恢复----惜分飞

客户在win 32位的操作系统上调至sga超过2G,数据库运行过程中报ORA-600 ksuloget2错误 Thread 1 cannot allocate new log, sequence 43586 Checkpoint not complete Current log# 1 seq# 43585 mem# 0: D:\ORACLE\ORADATA\ORCL\REDO01.LOG Fri Aug 04 14:57:02 2023 Errors i…...

NLP的tokenization

GPT3.5的tokenization流程如上图所示&#xff0c;以下是chatGPT对BPE算法的解释&#xff1a; BPE&#xff08;Byte Pair Encoding&#xff09;编码算法是一种基于统计的无监督分词方法&#xff0c;用于将文本分解为子词单元。它的原理如下&#xff1a; 1. 初始化&#xff1a;将…...

【宝藏系列】一文讲透C语言数组与指针的关系

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】 文章目录 【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】&#x1f468;‍&#x1f3eb;前言1️⃣指针1️⃣1️⃣指针的操作1️⃣2️⃣关于指针定义的争议1️⃣3️⃣对教材错误写法的小看法 2️⃣指针和数组的区别2️⃣…...

Jenkins+Jmeter集成自动化接口测试并通过邮件发送测试报告

一、Jenkins的配置 1、新增一个自由风格的项目 2、构建->选择Excute Windows batch command&#xff08;因为我是在本地尝试的&#xff0c;因此选择的windows&#xff09; 3、输入步骤&#xff1a; 1. 由于不能拥有相同的jtl文件&#xff0c;因此在每次构建前都需要删除jtl…...

clickhouse入门

clickhouse 1 课程介绍 和hadoop无关&#xff0c;俄罗斯&#xff0c;速度快3 介绍&特点 1 列式存储 在线分析处理。 使用sql进行查询。列式存储更适合查询分析的场景。新增时候有一个寻址的过程。更容易进行压缩行式存储。增删改查都需要的时候。2 DBMS功能 包括ddl,d…...

中间件: ElasticSearch的安装与部署

文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 单机部署 创建用户&#xff1a; useradd es chown -R es /opt/soft/ mkdir -p /var/log/elastic chown -R es /var/log/elastic mkdir -p /tmp/elastic chown -R es /tmp…...

LabVIEW模拟化学反应器的工作

LabVIEW模拟化学反应器的工作 近年来&#xff0c;化学反应器在化学和工业过程领域有许多应用。高价值产品是通过混合产品&#xff0c;化学反应&#xff0c;蒸馏和结晶等多种工业过程转换原材料制成的。化学反应器通常用于大型加工行业&#xff0c;例如酿酒厂公司饮料产品的发酵…...

Python基础语法入门(第二十三天)——正则表达式

正则表达式是一种文本模式&#xff0c;用于匹配字符串&#xff0c;它是由字符和特殊字符组成的模式。正则表达式可以用于验证、搜索、替换和提取字符串。其能够应用于各种编程语言和文本处理工具中&#xff0c;如Python、Java、JavaScript等。 正则表达式在线测试工具&#xf…...

山西电力市场日前价格预测【2023-08-20】

日前价格预测 预测明日&#xff08;2023-08-20&#xff09;山西电力市场全天平均日前电价为341.71元/MWh。其中&#xff0c;最高日前电价为367.66元/MWh&#xff0c;预计出现在20: 30。最低日前电价为318.47元/MWh&#xff0c;预计出现在04: 15。 价差方向预测 1&#xff1a; 实…...

C++中function,bind,lambda

c11之前&#xff0c;STL中提供了bind1st以及bind2nd绑定器 首先来看一下他们如何使用&#xff1a; 如果我们要对vector中的元素排序&#xff0c;首先会想到sort&#xff0c;比如&#xff1a; void output(const vector<int> &vec) {for (auto v : vec) {cout <&l…...

跟着美团学设计模式(感处)

读了着篇文章之后发现真的是&#xff0c;你的思想&#xff0c;你的思维是真的比比你拥有什么技术要强的。 注 开闭原则 开闭原则&#xff08;Open-Closed Principle&#xff09;是面向对象设计中的基本原则之一&#xff0c;它的定义是&#xff1a;一个软件实体应该对扩展开放…...

2023/8/19 小红书 Java 后台开发面经

项目都做了些什么&#xff0c;怎么实现的用Redis实现了什么&#xff0c;Redis是单线程的吗&#xff0c;Redis是单线程的为什么快&#xff0c;IO多路复用模型具体实现&#xff0c;持久化怎么实现的为什么用Kafka&#xff0c;架构是什么样的&#xff0c;Broker、Topic、Partition…...

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…...

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库&#xff0c;它为从业人员…...

Debian10: 安装nut服务器(UPS)

UPS说明&#xff1a; UPS的作用就不必讲了&#xff0c;我选择是SANTAKTGBOX-850&#xff0c;规格为 850VA/510W&#xff0c;可以满足所需&#xff0c;关键是Debian10自带了驱动可以支持&#xff0c;免去安装驱动&#xff0c;将UPS通过USB线连接服务器即可&#xff0c;如下图所示…...

神经网络基础-神经网络补充概念-47-动量梯度下降法

概念 动量梯度下降法&#xff08;Momentum Gradient Descent&#xff09;是一种优化算法&#xff0c;用于加速梯度下降的收敛速度&#xff0c;特别是在存在高曲率、平原或局部最小值的情况下。动量法引入了一个称为“动量”&#xff08;momentum&#xff09;的概念&#xff0c…...

C++11并发与多线程笔记(13) 补充知识、线程池浅谈、数量谈、总结

C11并发与多线程笔记&#xff08;13&#xff09; 补充知识、线程池浅谈、数量谈、总结 1、补充一些知识点1.1 虚假唤醒&#xff1a;1.2 atomic 2、浅谈线程池&#xff1a;3、线程创建数量谈&#xff1a; 1、补充一些知识点 1.1 虚假唤醒&#xff1a; notify_one或者notify_al…...

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…...

使用线性回归模型优化权重:探索数据拟合的基础

文章目录 前言一、示例代码二、示例代码解读1.线性回归模型2.MSE损失函数3.优化过程4.结果解读 总结 前言 在机器学习和数据科学中&#xff0c;线性回归是一种常见而重要的方法。本文将以一个简单的代码示例为基础&#xff0c;介绍线性回归的基本原理和应用。将使用Python和Nu…...

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…...

jenkins pipeline方式一键部署github项目

上篇&#xff1a;jenkins一键部署github项目 该篇使用jenkins pipeline-script一键部署&#xff0c;且介绍pipeline-scm jenkins环境配置 前言&#xff1a;按照上篇创建pipeline任务&#xff0c;结果报mvn&#xff0c;jdk环境不存在&#xff0c;就很疑惑&#xff0c;然后配置全…...

Vue 项目搭建

环境配置 1. 安装node.js 官网&#xff1a;nodejs&#xff08;推荐 v10 以上&#xff09; 官网&#xff1a;npm 是什么&#xff1f; 由于vue的安装与创建依赖node.js&#xff08;JavaScript的运行环境&#xff09;里的npm&#xff08;包管理和分发工具&#xff09;&#xff…...

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…...

机器学习深度学习——BERT(来自transformer的双向编码器表示)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——transformer&#xff08;机器翻译的再实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&am…...

Datawhale Django后端开发入门 Vscode TASK02 Admin管理员、外键的使用

一.Admin管理员的使用 1、启动django服务 使用创建管理员之前&#xff0c;一定要先启动django服务&#xff0c;虽然TASK01和TASK02是分开的&#xff0c;但是进行第二个流程的时候记得先启动django服务&#xff0c;注意此时是在你的项目文件夹下启动的&#xff0c;时刻注意要执…...

【ES5和ES6】数组遍历的各种方法集合

一、ES5的方法 1.for循环 let arr [1, 2, 3] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 1 // 2 // 32.forEach() 特点&#xff1a; 没有返回值&#xff0c;只是针对每个元素调用func三个参数&#xff1a;item, index, arr &#xff1b;当前项&#…...

学科在线教育元宇宙VR虚拟仿真平台落实更高质量的交互学习

为推动教育数字化&#xff0c;建设全民终身学习的学习型社会、学习型大国&#xff0c;元宇宙企业深圳华锐视点深度融合VR虚拟现实、数字孪生、云计算和三维建模等技术&#xff0c;搭建教育元宇宙平台&#xff0c;为学生提供更加沉浸式的学习体验&#xff0c;提高学习效果和兴趣…...

[python爬虫] 爬取图片无法打开或已损坏的简单探讨

本文主要针对python使用urlretrieve或urlopen下载百度、搜狗、googto&#xff08;谷歌镜像&#xff09;等图片时&#xff0c;出现"无法打开图片或已损坏"的问题&#xff0c;作者对它进行简单的探讨。同时&#xff0c;作者将进一步帮你巩固selenium自动化操作和urllib…...

vue项目预览pdf功能(解决动态文字无法显示的问题)

最近&#xff0c;因为公司项目需要预览pdf的功能&#xff0c;开始的时候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因为pdf变成了需要根据内容进行变化的&#xff0c;然后&#xff0c;就出现了需要动态生成的文字不显示了。换了好多好多的插件…...

vue3 样式穿透:deep不生效

初学vue3&#xff0c;今天需要修改el-input组件的属性&#xff08;去掉border和文字居右&#xff09; 网上搜了一下&#xff0c;大致都是采用:deep 样式穿透来修改el-input的属性 <div class"input-container"><el-input placeholder"请输入111&qu…...

云原生反模式

通过了解这些反模式并遵循云原生最佳实践&#xff0c;您可以设计、构建和运营更加强大、可扩展和成本效益高的云原生应用程序。 1.单体架构&#xff1a;在云上运行一个大而紧密耦合的应用程序&#xff0c;妨碍了可扩展性和敏捷性。2.忽略成本优化&#xff1a;云服务可能昂贵&am…...

【2023年11月第四版教材】《第5章-信息系统工程(合集篇)》

《第5章-信息系统工程&#xff08;合集篇&#xff09;》 章节说明1 软件工程1.1 架构设计1.2 需求分析1.3 软件设计1.4 软件实现&#xff3b;补充第三版教材内容&#xff3d; 1.5 部署交付 2 数据工程2.1 数据建模2.2 数据标准化2.3 数据运维2.4 数据开发利用2.5 数据库安全 3 …...

【qiankun】微前端在项目中的具体使用

1、安装qiankun npm install qiankun --save2、主应用中注册和配置qiankun 在主应用的入口文件main.ts中&#xff0c;引入qiankun的注册方法&#xff1a; import { registerMicroApps, start } from qiankun;创建一个数组&#xff0c;用于配置子应用的相关信息。每个子应用都…...

云安全与多云环境管理:讨论在云计算和多云环境下如何保护数据、应用程序和基础设施的安全

随着云计算和多云环境的广泛应用&#xff0c;企业正面临着数据、应用程序和基础设施安全的新挑战。在这个数字化时代&#xff0c;保护敏感信息和业务运作的连续性变得尤为重要。本文将深入探讨在云计算和多云环境下如何有效地保护数据、应用程序和基础设施的安全。 章节一&…...

npm install ffi各种失败,换命令npm i ffi-napi成功

网上各种帖子安装ffi&#xff0c;基本上到了windows build tools这里会卡住。 使用命令npm install --global --production windows-build-tools 安装报错信息如下&#xff1a; PS E:\codes\nodejsPath\tcpTest> npm install --global --production windows-build-tools …...

0.flink学习资料

论文&#xff1a; &#xff08;1&#xff09;google dataflow model 下载链接&#xff1a;p1792-Akidau.pdf (vldb.org) Akidau T, Bradshaw R, Chambers C, et al. The dataflow model: a practical approach to balancing correctness, latency, and cost in massive-scal…...

C语言:字符函数和字符串函数

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组C语言&#xff1a;操作符详解C语言&#xff1a;指针详解C语言&#xff1a;结构体C语言&#xff1a;数据的存储 目录 往期文章前言1. 函数介绍1.1 strlen1.…...

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统&#xff0c;能将实验仪器与计算机组成网络&#xff0c;使病人样品登录、实验数据存取、报告审核、打印分发&#xff0c;实验数据统计分析等繁杂的操作过程实现了智能化、自动化…...

部署工业物联网可以选择哪些通信方案?

部署工业物联网有诸多意义&#xff0c;诸如提升生产效率&#xff0c;降低管理成本&#xff0c;保障生产品质稳定&#xff0c;应对长期从业劳动力变化趋势等。针对不同行业、场景&#xff0c;工业物联网需要选择不同的通信方案&#xff0c;以达到成本和效益的最佳平衡。本篇就简…...

flutter-移动端适配

不同屏幕之间的尺寸适配 使用插件 flutter_screenutil flutter_screenutil flutter 屏幕适配方案&#xff0c;用于调整屏幕和字体大小的flutter插件&#xff0c;让你的UI在不同尺寸的屏幕上都能显示合理的布局! 安装 # add flutter_screenutil flutter_screenutil: ^5.8.4 o…...