2024年Java最新Day256,京东java面试流程

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

分布式的nosql数据库,hbase,分布式的协调,zookeeper,分布式通用计算引擎,spark,分布式的实时计算引擎,storm

如果你要处理海量数据,就涉及到了一个名词,叫做大数据,只要涉及到大数据,那么其实就会涉及到分布式

redis cluster,分布式

因为我来讲java系统的架构,有时候跟其他人不一样,纯搞java,但是我因为工作时间很长,早期专注做java架构,好多年,大数据兴起,就一直专注大数据系统架构

大数据相关的系统,也涉及很多的java系统架构,高并发、高可用、高性能、可扩展、分布式系统

会给大家稍微拓展一下知识面,从不同的角度去讲解一块知识

redis,高并发、高性能、每日上亿流量的大型电商网站的商品详情页系统的缓存架构,来讲解的,redis是作为大规模缓存架构中的底层的核心存储的支持

高并发、高性能、每日上亿流量,redis持久化 -> 灾难的时候,做数据恢复,复制 -> 读写分离,扩容slave,支撑更高的读吞吐,redis怎么支撑读QPS超过10万,几十万; 哨兵,在redis主从,一主多从,怎么保证99.99%可用性; redis cluster,海量数据

java架构课,架构思路和设计是很重要的,但是另外一点,我希望能够带着大家用真正java架构师的角度去看待一些技术,而不是仅仅停留在技术的一些细节的点

给大家从一些大数据的角度,去分析一下我们java架构领域中的一些技术

天下武功,都出自一脉,研究过各种大数据的系统,redis cluster讲解了很多原理,跟elasticsearch,很多底层的分布式原理,都是类似的

redis AOF,fsync

elasticsearch建立索引的时候,先写内存缓存,每秒钟把数据刷入os cache,接下来再每隔一定时间fsync到磁盘上去

redis cluster,写可以到任意master,任意master计算key的hashslot以后,告诉client,重定向,路由到其他mater去执行,分布式存储的一个经典的做法

elasticsearch,建立索引的时候,也会根据doc id/routing value,做路由,路由到某个其他节点,重定向到其他节点去执行

分布式的一些,hadoop,spark,storm里面很多核心的思想都是类似的

后面,马上把redis架构给讲完之后,就开始讲解业务系统的开发,包括高并发的商品详情页系统的大型的缓存架构,jedis cluster相关api去封装和测试对redis cluster的访问

jedis cluster api,就可以自动针对多个master进行写入和读取

2、实验不同master各自的slave读取 -> 读写分离


在这个redis cluster中,如果你要在slave读取数据,那么需要带上readonly指令get mykey1

redis-cli -c启动,就会自动进行各种底层的重定向的操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ucREFv7c-1620031061985)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503132300661.png)]


实验redis cluster的读写分离的时候,会发现有一定的限制性,默认情况下,redis cluster的核心的理念,主要是用slave做高可用的,每个master挂一两个slave,主要是做数据的热备,还有master故障时的主备切换,实现高可用的


redis cluster默认是不支持slave节点读或者写的,跟我们手动基于replication搭建的主从架构不一样的

slave node,readonly,get,这个时候才能在slave node进行读取

redis cluster,主从架构是出来,读写分离,复杂了点,也可以做,jedis客户端,对redis cluster的读写分离支持不太好的

默认的话就是读和写都到master上去执行的

如果你要让最流行的jedis做redis cluster的读写分离的访问,那可能还得自己修改一点jedis的源码,成本比较高

要不然你就是自己基于jedis,封装一下,自己做一个redis cluster的读写分离的访问api

核心的思路,就是说,redis cluster的时候,就没有所谓的读写分离的概念了

读写分离,是为了什么,主要是因为要建立一主多从的架构,才能横向任意扩展slave node去支撑更大的读吞吐量


redis cluster的架构下,实际上本身master就是可以任意扩展的,你如果要支撑更大的读吞吐量,或者写吞吐量,或者数据量,都可以直接对master进行横向扩展就可以了

也可以实现支撑更高的读吞吐的效果

不会去跟大家直接讲解的,很多东西都要带着一些疑问,未知,实际经过一些实验和操作之后,让你体会的更加深刻一些

redis cluster,主从架构,读写分离,没说错,没有撒谎

redis cluster,不太好,server层面,jedis client层面,对master做扩容,所以说扩容master,跟之前扩容slave,效果是一样的

3、实验自动故障切换 -> 高可用性


redis-trib.rb check 192.168.109.101:7001

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pg1bgs9a-1620031061988)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503133327242.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aHB7QCp-1620031061991)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503133504718.png)]

比如把master1,101:7001,杀掉,看看它对应的102:7004能不能自动切换成master,可以自动切换

[root@s1 init.d]# ps -ef|grep redis

[root@s1 init.d]# kill -9 1176

[root@s1 init.d]# cd /var/run

[root@s1 run]# rm -rf redis_7001.pid

#杀掉m1主节点,然后删除对应的pid文件

过了一会,查看情况,发现7004已经成为主节点了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWZ4OQZo-1620031061992)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503134117535.png)]

切换成master后的102:7004,可以直接读取数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mWcuHWcU-1620031061993)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503134145294.png)]

查看7001的日志情况,显示了7001切换为从节点,并7004成为主节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9jZsdSB-1620031061996)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503134916546.png)]

再试着把101:7001给重新启动,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WOYl6oNJ-1620031061998)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503134254140.png)]

发现恢复过来,7001自动作为slave挂载到了102:7004上面去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l1WQbP5u-1620031061999)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503134431940.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MfxGfAmo-1620031062001)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503134238006.png)]

实验成功!!!


三、redis cluster通过master水平扩容来支撑更高的读写吞吐+海量数据

====================================================================================================

redis cluster模式下,不建议做物理的读写分离了

我们建议通过master的水平扩容,来横向扩展读写吞吐量,还有支撑更多的海量数据

redis单机,读吞吐是5w/s,写吞吐2w/s

扩展redis更多master,那么如果有5台master,不就读吞吐可以达到总量25/s QPS,写可以达到10w/s QPS

redis单机,内存,6-8G

如果redis内存过大,那么fork类操作的时候很耗时,会导致请求延时的问题

扩容到5台master,能支撑的总的缓存数据量就是30G,40G -> 100台,600G,800G,甚至1T+,海量数据

1、redis是怎么扩容的,加入新master


  • 创建需要的文件夹

mkdir -p /var/log/redis

mkdir -p /etc/redis-cluster

mkdir -p /var/redis/7007

  • 创建对应7001.conf的配置文件,并放置在/etc/redis/下

port 7007

cluster-enabled yes

cluster-config-file /etc/redis-cluster/node-7007.conf

cluster-node-timeout 15000

daemonize yes

pidfile /var/run/redis_7007.pid

dir /var/redis/7007

logfile /var/log/redis/7007.log

bind 192.168.109.103

appendonly yes

  • 创建对应启动脚本redis_7007,放置在/etc/init.d/下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMP5SL7B-1620031062002)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503141819512.png)]

  • 手动启动一个新的redis实例,在7007端口上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVa2eXVf-1620031062005)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503143025494.png)]

  • 连接到新的redis实例上,cluster nodes,确认自己是否加入了集群,作为了一个新的master

redis-trib.rb add-node 192.168.109.103:7007 192.168.109.101:7001

redis-trib.rb check 192.168.109.101:7001

7007加入成功,但是他是以master主节点加入的,并且没有slots,那他就无法处理数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RtTmd3az-1620031062007)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503143703160.png)]

2、reshard数据迁移


resharding把一部分hash slot从一些node上迁移到另外一些node上

./redis-trib.rb reshard 192.168.109.101:7001

要把之前3个master上,总共4096个hashslot迁移到新的第四个master上去

16384/4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsrEOhhk-1620031062010)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503151425361.png)]

How many slots do you want to move (from 1 to 16384)?

4096

What is the receiving node ID? #指定要迁移的目标节点node id

1cc3fc38e522b6136832cea140595be390993460

Please enter all the source node IDs.

Type ‘all’ to use all the nodes as source nodes for the hash slots.

Type ‘done’ once you entered all the source nodes IDs.

#指定要迁移的数据源节点node id

Source node #1:c4220974b2bbca56502fea562dd47166af064026

Source node #2:dfd566548ec8e4d1a52773c84c0c3845aa5c9bbf

Source node #3:a74166c80bb4645a0bc71c50c9f36c33e2e0e7fb

Source node #4:done #输入完就done

Do you want to proceed with the proposed reshard plan (yes/no)?

yes

  • 再次check检查一下

redis-trib.rb check 192.168.109.101:7001

发现7007已经有对应的4096个hash slots了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53tiuctD-1620031062012)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503152425394.png)]

3、添加node作为slave


增加slave,在rediscluster中是增加高可用性,保证master宕机后还有slave可以被选成master,保持运作

  • 在s3虚拟机上再添加一个redis实例,作为上面的7007的slave从节点

  • 创建对应文件夹

mkdir -p /var/log/redis

mkdir -p /etc/redis-cluster

mkdir -p /var/redis/7008

  • 创建对应7001.conf的配置文件7008.conf,并放置在/etc/redis/下

port 7008

cluster-enabled yes

cluster-config-file /etc/redis-cluster/node-7008.conf

cluster-node-timeout 15000

daemonize yes

pidfile /var/run/redis_7008.pid

dir /var/redis/7008

logfile /var/log/redis/7008.log

bind 192.168.31.227

appendonly yes

  • 创建对应7008的启动脚本,在/etc/init.d/下,名为redis_7008

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtohrfXO-1620031062013)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503152723268.png)]

  • 启动7008实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6SdBdXJ-1620031062017)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503152851296.png)]

  • 将7008实例挂载到7004下面做slave从节点

redis-trib.rb add-node --slave --master-id a74166c80bb4645a0bc71c50c9f36c33e2e0e7fb 192.168.109.103:7008 192.168.109.101:7001

  • 检查

redis-trib.rb check 192.168.109.101:7001

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qnia428-1620031062019)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503153308522.png)]

4、删除node


先用resharding将数据都移除到其他节点,确保node为空之后,才能执行remove操作

现在是4个master,一共16384个hash slots,那么一个master上有4096个hash slots,那么如果要删除一个node,就是16384/4等于4096个hash slots,我们要将这4096平分改不删除的3个master上面,也就是4096/3,那就要2个是1365,1个是1366

  • 先做hash slots的迁移,重复上面的步骤,迁移hash slots

./redis-trib.rb reshard 192.168.109.101:7001 #迁移命令

How many slots do you want to move (from 1 to 16384)? 1365

What is the receiving node ID? #另外3个master的nodeid,指定要迁移的目标节点node id

Source node #7007的node id,数据源

  • 检查,保证要删除的master节点的hash slots数量为 0

redis-trib.rb check 192.168.109.101:7001

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rPl8F5O3-1620031062020)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503154925016.png)]

如果你要删除的master节点下面有slave节点,当你清空了一个master的hash slot时,redis cluster就会自动将其slave挂载到其他master上去

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

片保存下来直接上传(img-rPl8F5O3-1620031062020)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210503154925016.png)]](https://img-blog.csdnimg.cn/20210503164002333.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjg0NDY5,size_16,color_FFFFFF,t_70)

如果你要删除的master节点下面有slave节点,当你清空了一个master的hash slot时,redis cluster就会自动将其slave挂载到其他master上去

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

[外链图片转存中…(img-ZELS7HUb-1714906674805)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种面向对象的编程语言,而华为OD(Open Day)是华为举办的为期1-2天的校园招聘活动。在华为OD面试中,通常会有Java方面的问题。 面试者可能会被要求介绍Java的特点和优势,可以提到以下几点:首先,Java是跨平台的,可以在不同的操作系统上运行。其次,Java有丰富的类库和API,开发者可以借助这些工具提高开发效率。再次,Java具有良好的内存管理和垃圾回收机制,可以提高程序的性能和稳定性。此外,Java还有强大的多线程支持和安全性能,可以满足大规模企业级应用的需求。 除了Java的特点,面试者可能还会被要求回答一些具体的 Java 面试题。例如,可能会涉及基本的语法知识,如Java中的数据类型、循环结构、条件语句等等。还可能会涉及到Java的面向对象特性,如封装、继承、多态等。此外,还有可能会问到Java的异常处理、Java的I/O操作、Java集合框架等高级知识点。 在回答这些问题时,面试者应该清晰、简洁地表达自己的思路和观点,尽量避免模棱两可的回答。另外,面试者还可以结合自己的实际项目经验和编码能力,提供具体的案例或示例来支持自己的回答。在面试过程中,沟通能力和解决问题的能力也是重要的评判标准,所以面试者应该积极与面试官互动,展示自己的学习能力和团队合作能力。 总之,在Java华为OD面试中,面试者需要准备好Java基础知识,并能够根据问题灵活作答,展示自己的技术能力和潜力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值