【Java面经】一次颇为进阶的面试记录

news2024/10/6 20:29:53

工作之余又参加了一次面试,对我来说比之前的面试难度都提了一个度,面试官从公司场景引申聊到高并发和Redis的很多问题。 可惜我太菜了回答不上来,只能回答基础的问题。面完就是凉凉的味道。。

Redis相关

Redis的String是怎么实现的?和其他String有什么优势?
Redis是用C语言写的,但它的字符串不是简单的char[]数组,而是简单动态字符串 Simple Dynamic Strings(SDS) ,它是一个二进制安全的字符串。

struct sdshdr{
 unsigned int len ; //buf的长度 
 unsigned int free ; //标记buf中没使用的元素个数 
 char buf[] ;  // 存放元素的数组 
}

优势:

  1. 解决普通char数组的二进制安全问题: C语言的字符串是以\0终止的,二进制数据如果也存在\0字符, 会导致这个字符被截断。而SDS是以len来表示长度的,也就避免了这个问题。
  2. 缓存区溢出问题
  3. 方便进行字符串追加,预分配内存

(详细可以直接看下面连接的文章)

Redis String的扩容过程?
简单来讲也是空间预分配的策略,避免了每次字符串追加都要重新分配内存。

这个写的好详细了:https://juejin.cn/post/6894539895084154887#heading-2

Redis作为缓存的优势有哪些?
对比本地缓存HashMap,SpringCache:本地缓存的功能太单一,没有过期时间,淘汰机制,命中率设计等等。 并且 本地缓存不能实现多个服务数据共享。无法支持高并发。

对比其他分布式缓存如memcached:
Redis的数据结构更加丰富,支持list,set,hash等。并且操作具有原子性
Redis支持数据持久化,可以实现灾难恢复。
Redis支持cluster模式,可以分布式部署。

拓展:为啥Redis不采用多线程?
普通的kv操作瓶颈其实不在cpu,而在内存和I/O
Redis中有多种数据类型的操作,包括事务,采用多线程会因为上下切换,加锁解锁等增加复杂度。
Redis 6.0引入的多线程也主要处理网络I/O方面,对网络事件进行监听

Redis Cluster模式
Redis Cluster是服务器Sharding(分片)的技术
使用的场景:
Redis的主从模式和哨兵模式已经保障了数据高可用,实现读写分离的能力。 但是每台Redis服务器存储的都是相同的数据,对于海量数据存储压力还是很大,并且浪费内存,Redis Cluster实现了对数据分片,将不同的数据存储到不同的master节点上,从而解决了海量数据的问题。

Redis集群采用了去中心化的思想,没有中心节点的说法,对于客户端来说,整个集群可以看成一个整体,可以连接任意一个节点。
在这里插入图片描述
Redis的分布算法:哈希槽算法
对于这样的集群,一个重点问题就是如何将数据分配到不同的Redis服务器上。常见的算法有hash算法,一致性hash算法等等。但是Redis是引入了哈希槽的概念,并且设计了一套新的算法。

Redis-cluster中有16384个哈希槽,集群中的每个redis节点,分配到一部分槽,每个Key使用公式CRC16校验后,对16384取模来决定放置那个槽。通过查询集群的配置,就可以知道key对应的槽属于那个节点,然后再将请求打到该节点。

哈希槽分配到不同节点,可以很容易地向集群添加或者删除节点:

  • 新节点加入到集群中,只需要将旧节点的槽移动到新节点
  • 移除一个旧节点,只需要将该节点的槽移动到其他节点
    槽在节点之间移动不会造成节点阻塞,所以无论是删除还是添加,redis集群都能保证槽的平滑移动,不会造成集群下线。

拓展:一致性哈希算法
一致性hash算法是一种特殊的哈希算法,它本质上也是一种取模算法,但不是按照服务器数量取模,而是对固定值2^32取模

步骤如下:
①、将整个哈希空间按照顺时针方向组织成一个虚拟的圆环,称为Hash环
②、将各个服务器使用Hash函数进行哈希,可以选择服务器IP或者主机名作为关键字进行哈希,来决定服务器在哈希环的位置(这也是为什么对2^32取模的理由,用ip地址进行哈希)
③、用算法定位数据访问到相应的服务器,将数据key使用相同的函数计算出hash值,沿着顺时针找到的第一台机器就是定位到的机器。

一致性Hash的优点是,当服务器数量变化时,只需要重定位一部分的数据,不至于发生缓存雪崩,具有较好的容错性和拓展性。
在这里插入图片描述

网络

一次Http请求包含哪些过程?

  1. 浏览器查找域名的IP地址 (查找过程: 浏览器缓存,本机缓存,发起DNS系统调用)
  2. 浏览器发起一个TCP连接请求 (IP协议,OPSF协议,ARP协议)
  3. 建立完TCP连接后,发起HTTP请求
  4. 服务器返回一个HTTP响应
  5. 浏览器解析HTML响应,并且展示HTML

HTTP的报文是怎么样的?
HTTP的请求报文和相应报文相似,包括请求行,请求头,请求体
在这里插入图片描述

HTTP的请求头有几种?
HTTP头字段是指在超文本传输协议HTTP的请求和响应消息的头部分

常见的请求字段有:

  1. Accept:表示浏览器能够接受的内容类型
  2. Accept-Language 浏览器申明自己接收的语言。
  3. Connection : Connection: keep-alive/close
  4. Host
  5. Cache-Control
  6. Cookie

HTTP3:了解吗?
HTTP3 不再使用TCP协议,而是使用基于UDP的QUIC传输协议。贴张图把:
在这里插入图片描述

Netty有什么优势?
易用性: 使用Jdk的NIO变成需要了解很多复杂的概念,比如channel,selectors,socket等等,Netty在NIO的基础上进行更高地封装,提供了统一的API
更低的资源消耗:

  1. 对象池复用技术,避免频繁创建和销毁对JVM GC带来的压力
  2. 零拷贝技术:除了操作系统级别的零拷贝技术外,Netty 提供了更多面向用户态的零拷贝技术,例如 Netty 在 I/O 读写时直接使用 DirectBuffer,从而避免了数据在堆内存和堆外内存之间的拷贝

其他杂七杂八

Zookeeper中有什么经典的算法?

Zookeeper的应用:
Zookeeper为分布式应用提供分布式锁,发布订阅和配置管理等服务,也提供类似于文件系统的树方式数据存储,但它主要解决分布式集群中的一致性问题,通过维护和监控存储数据的状态变化,达到基于数据的集群管理。

Zab协议:Zab协议是为了解决分布式一致性设计的协议,

Linux内核态和用户态的区别?
先要知道CPU指令是分权限的,不同CPU指令的权限不同,一些操作硬件的指令权限就很高,不是一般进程能使用的。
内核态和用户态其实就是CPU指令权限的区别。做出区别的目的是为了安全性,保护整个系统。

要从用户态切换到内核态,需要经过三种方式之一:系统调用、中断、异常

用户态切换到内核态再切换到用户态这个过程怎么优化?

重点应该放在减少切换操作,比如说IO操作都会需要系统调用让内核线程执行,这个时候mmap就很有用了。
mmap是一种内存映射文件的方法,将一个文件或者其他对象映射到内存,实现文件磁盘地址和进程虚拟地址空间的对应,这样进程就可以使用指针方法操作这一段内存,不必再调用read,write等系统调用函数了。并且操作系统会自动将页面写回到磁盘上。

(底层菜鸡,只能说点边角料的,如果有知道的大佬请在评论区指点一下我)

Spring的注解原理?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盘点项目管理工具DHTMLX Gantt 的常见问题

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…

vue中集成省市区街四级地址组件

大家好,我是雄雄。 前言 省市区地址大家应该都不陌生吧,网上买个东西,得填地址。中午定个饭,得写地址;叫个货拉拉叫个跑腿,是不是也得写地址。 但是选择地址的时候,不同场景下选择的范围不同&…

【C分支与循环】详解分支与循环

分支与循环前言一、什么是语句?二、分支语句(选择结构)(一)概念(二)if语句1.概念2.例子(1)单分支(2)双分支(3)多分支&…

vulnhub DC系列 DC-1

目录 下载地址 漏洞分析 信息收集 漏洞尝试 漏洞利用 flag1 flag2 flag3 flag4 提权 下载地址 DC-1.zip (Size: 733 MB)Download: http://www.five86.com/downloads/DC-1.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-1.zip使用方式:ova文件直接使用vm…

nacos安装与使用

nacos安装与使用nacos下载安装下载方式 一:下载方式 二:版本(2.0.3)nacos启动在项目中注册nacos服务nacos下载安装 下载方式 一: nacos官网下载 下载方式 二:版本(2.0.3) 链接&a…

【Flask框架】——28 Flask_SQLAlchemy

Flask-SQLAlchemy Flask-SQLAlchemy的使用对SQLAlchemy进行了封装和优化: Flask-SQLAlchemy是Flask框架的一个插件; Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件,使得我们在Flask中使用sqlalchemy更加的简单。 1.安装…

排查wx.previewImage真机预览一直loading问题

起因 使用van-uploader预览图片一直loading预览不了,开发者工具,浏览器都是秒开的。我看源码是使用wx.previewImage,自己写了个demo也是同样问题。 排查原因 链接是否拼接错误域名有没有添加进白名单防盗链referrer证书是否过期&#xff0…

企业数字化转型蓝图规划、生态体系建设、数字化管理平台建设方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容: 数字化助力上下…

SuperMap iServer在不同系统中设置开机自启动--Linux篇

目录前言一:CentOS系统二:Ubantu系统作者:kxj 前言 在成功部署SuperMap iServer之后,每次重启电脑都需要手动去启动iServer,如何能让iServer在每次重启电脑时都自动启动呢?今天咱们一起来看看在Linux系统中…

实地址方式下的可屏蔽中断服务程序设计

目录 实地址方式下的可屏蔽中断服务程序设计 程序装入方式 直接装入(会这种方式就可以,考试都给你地址让你装) 系统功能调用装入(了解考纲没要求) 中断屏蔽与中断结束的处理(了解) 会直接装…

Python基础(十九):函数加强

文章目录 函数加强 一、递归 1、递归的应用场景 2、应用:3以内数字累加和 二、lambda 表达式 1、lambda的应用场景 2、lambda语法 3、示例:计算a b 4、lambda的参数形式 5、lambda的应用 三、高阶函数 1、体验高阶函数 2、内置高阶函数 …

Grafana配置邮件

1.Grafana配置文件路径 默认的配置文件路径是:/etc/grafana/grfana.ini 2.默认情况下,邮件服务是关闭的 systemctl status grafana-server 可以查看到当前服务的配置文件在哪里 3.没有改动之前的配置文件 /etc/grafana/grfana.ini systemctl resta…

插件算法管理以及任务队列机制

插件算法管理以及任务队列机制插件管理抽象插件基类插件导入导出规范__attribute__((visibility("default")))插件实例插件管理者算法管理抽象算法基类算法Map与具体算法注册规范PetCoin算法实例算法管理者任务队列机制抽象任务具体任务任务管理者任务队列插件管理 …

“浪潮信息龙蜥联合实验室”正式成立!2万+人在线,带你一文读懂MeetUp精彩瞬间

12 月 24 日,龙蜥社区(OpenAnolis) “走进系列” 第 4 期——走进浪潮信息 MeetUp 于线上开展并圆满结束。本次走进浪潮信息 MeetUp 线上观看 2 万人次,收回调研问卷近 500 份,直播间万人参与互动。本次 MeetUp 汇集了…

windows 10管理多版本nodejs

在实际的开发中,不同的项目使用的nodejs的版本不一致。又不想升级或者降低项目的版本。这时就需要灵活的切换本地开发环境的nodejs版本。这里推荐使用nvm(一个管理nodejs版本的工具),亲测实用。 1、下载地址 https://github.com/coreybutle…

Biniware Run V6.1.0 快速启动工具中文版

前言 Biniware Run是一款便携式Windows桌面工具,可让您从一个地方快速访问自己喜欢的网站地址,文件和文件夹。只需从桌面拖放任何网站地址,文件或文件夹内的彩色圆圈内,您就可以使用这个方便的软件轻松访问您感兴趣的所有内容。 …

SpringCloud之服务治理Eureka

1.服务注册和发现是什么意思?Spring Cloud 如何实现? 服务注册和发现的意思是服务进程在注册中心注册自己的位置,客户端应用进程向注册中心发起查询,来获取服务的位置,服务发现的一个重要作用就是提供一个可用的服务列…

【Linux】Linux调试器--gdb的使用

有时候,我们并不需要被教导,而是应该被不断的提醒。 文章目录一、gdb的介绍二、debug和realease版本的区别三、gdb的使用1.显示代码: l行号(list)指令2.设置断点: b行号(breakpoint&#xff09…

HTML5 定位

文章目录HTML5 定位geolocation简介getCurrentPosition()watchPosition() 和 clearWatch()百度地图HTML5 定位 geolocation 简介 在HTML5中,可以使用geolocation对象来获取用户的地理位置信息。 语法 window.navigator.geolocation //简写为 navigator.geoloca…

uni-app HBuilderX项目转为cli项目及踩坑记录

uni-app有两种创建创建项目的方式,通过HBuilderX可视化界面进行创建和通过vue-cli命令行,两者的区别可以参考uni-app官网-可视化方式的区别 其中cli项目是可以直接运行在hx中的,相比hx项目,cli的好处还有可以自定义环境变量和自定…