mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[docs add]《后端面试高频系统设计&场景题》
This commit is contained in:
parent
781fd22f77
commit
3df468c47d
@ -18,6 +18,11 @@ export default navbar([
|
|||||||
icon: "about",
|
icon: "about",
|
||||||
link: "/about-the-author/zhishixingqiu-two-years.md",
|
link: "/about-the-author/zhishixingqiu-two-years.md",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
text: "星球专属优质专栏",
|
||||||
|
icon: "about",
|
||||||
|
link: "/zhuanlan/",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
text: "星球优质主题汇总",
|
text: "星球优质主题汇总",
|
||||||
icon: "star",
|
icon: "star",
|
||||||
|
@ -13,6 +13,7 @@ export default sidebar({
|
|||||||
"/high-quality-technical-articles/": highQualityTechnicalArticles,
|
"/high-quality-technical-articles/": highQualityTechnicalArticles,
|
||||||
"/zhuanlan/": [
|
"/zhuanlan/": [
|
||||||
"java-mian-shi-zhi-bei",
|
"java-mian-shi-zhi-bei",
|
||||||
|
"back-end-interview-high-frequency-system-design-and-scenario-questions",
|
||||||
"handwritten-rpc-framework",
|
"handwritten-rpc-framework",
|
||||||
"source-code-reading",
|
"source-code-reading",
|
||||||
],
|
],
|
||||||
|
@ -22,9 +22,9 @@ tag:
|
|||||||
|
|
||||||
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
|
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
|
||||||
|
|
||||||

|
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间。
|
||||||
|
|
||||||
位数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1。这样申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间。
|

|
||||||
|
|
||||||
总结:**一个名叫 Bloom 的人提出了一种来检索元素是否在给定大集合中的数据结构,这种数据结构是高效且性能很好的,但缺点是具有一定的错误识别率和删除难度。并且,理论情况下,添加到集合中的元素越多,误报的可能性就越大。**
|
总结:**一个名叫 Bloom 的人提出了一种来检索元素是否在给定大集合中的数据结构,这种数据结构是高效且性能很好的,但缺点是具有一定的错误识别率和删除难度。并且,理论情况下,添加到集合中的元素越多,误报的可能性就越大。**
|
||||||
|
|
||||||
@ -40,9 +40,9 @@ tag:
|
|||||||
1. 对给定元素再次进行相同的哈希计算;
|
1. 对给定元素再次进行相同的哈希计算;
|
||||||
2. 得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。
|
2. 得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。
|
||||||
|
|
||||||
举个简单的例子:
|
Bloom Filter 的简单原理图如下:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
如图所示,当字符串存储要加入到布隆过滤器中时,该字符串首先由多个哈希函数生成不同的哈希值,然后将对应的位数组的下标设置为 1(当位数组初始化时,所有位置均为 0)。当第二次存储相同字符串时,因为先前的对应位置已设置为 1,所以很容易知道此值已经存在(去重非常方便)。
|
如图所示,当字符串存储要加入到布隆过滤器中时,该字符串首先由多个哈希函数生成不同的哈希值,然后将对应的位数组的下标设置为 1(当位数组初始化时,所有位置均为 0)。当第二次存储相同字符串时,因为先前的对应位置已设置为 1,所以很容易知道此值已经存在(去重非常方便)。
|
||||||
|
|
||||||
@ -54,8 +54,10 @@ tag:
|
|||||||
|
|
||||||
## 布隆过滤器使用场景
|
## 布隆过滤器使用场景
|
||||||
|
|
||||||
1. 判断给定数据是否存在:比如判断一个数字是否存在于包含大量数字的数字集中(数字集很大,5 亿以上!)、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单功能等等。
|
1. 判断给定数据是否存在:比如判断一个数字是否存在于包含大量数字的数字集中(数字集很大,上亿)、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤(判断一个邮件地址是否在垃圾邮件列表中)、黑名单功能(判断一个IP地址或手机号码是否在黑名单中)等等。
|
||||||
2. 去重:比如爬给定网址的时候对已经爬取过的 URL 去重。
|
2. 去重:比如爬给定网址的时候对已经爬取过的 URL 去重、对巨量的 QQ号/订单号去重。
|
||||||
|
|
||||||
|
去重场景也需要用到判断给定数据是否存在,因此布隆过滤器主要是为了解决海量数据的存在性问题。
|
||||||
|
|
||||||
## 编码实战
|
## 编码实战
|
||||||
|
|
||||||
@ -256,7 +258,7 @@ RedisBloom 提供了多种语言的客户端支持,包括:Python、Java、Ja
|
|||||||
|
|
||||||
**具体操作如下:**
|
**具体操作如下:**
|
||||||
|
|
||||||
```
|
```bash
|
||||||
➜ ~ docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
|
➜ ~ docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
|
||||||
➜ ~ docker exec -it redis-redisbloom bash
|
➜ ~ docker exec -it redis-redisbloom bash
|
||||||
root@21396d02c252:/data# redis-cli
|
root@21396d02c252:/data# redis-cli
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 分布式ID常见问题总结
|
title: 分布式ID介绍&实现方案总结
|
||||||
category: 分布式
|
category: 分布式
|
||||||
---
|
---
|
||||||
|
|
||||||
|
33
docs/snippets/planet2.snippet.md
Normal file
33
docs/snippets/planet2.snippet.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
## 星球介绍
|
||||||
|
|
||||||
|
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的[ Java 面试知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面,非常适合准备 Java 面试和学习 Java 的同学。
|
||||||
|
|
||||||
|
**欢迎准备 Java 面试以及学习 Java 的同学加入我的 [知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。**
|
||||||
|
|
||||||
|
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
|
||||||
|
|
||||||
|
[](../about-the-author/zhishixingqiu-two-years.md)
|
||||||
|
|
||||||
|
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
|
||||||
|
|
||||||
|
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
|
||||||
|
|
||||||
|
## 如何加入?
|
||||||
|
|
||||||
|
**方式一(不推荐)**:扫描下面的二维码原价加入(续费半价不到)。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**方式二(推荐)**:添加我的个人微信(**javaguide1024**)领取一个 **30** 元的星球专属优惠券(续费半价不到)。
|
||||||
|
|
||||||
|
**一定要备注“优惠卷”**,不然通过不了。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
|
||||||
|
|
||||||
|
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!) 。
|
||||||
|
|
||||||
|
随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多,星球的价格会逐步向上调整,想要加入的同学一定要尽早。
|
||||||
|
|
||||||
|
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
|
@ -1,17 +0,0 @@
|
|||||||
**方式一(不推荐)**:扫描下面的二维码原价加入(续费半价不到)。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**方式二(推荐)**:添加我的个人微信(**javaguide1024**)领取一个 **30** 元的星球专属优惠券(续费半价不到)。
|
|
||||||
|
|
||||||
**一定要备注“优惠卷”**,不然通过不了。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
|
|
||||||
|
|
||||||
进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!) 。
|
|
||||||
|
|
||||||
随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多,星球的价格会逐步向上调整,想要加入的同学一定要尽早。
|
|
||||||
|
|
||||||
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
|
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
title: 《后端面试高频系统设计&场景题》
|
||||||
|
category: 知识星球
|
||||||
|
---
|
||||||
|
|
||||||
|
## 介绍
|
||||||
|
|
||||||
|
**《后端面试高频系统设计&场景题》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。
|
||||||
|
|
||||||
|
在几年前,国内的后端技术面试通常不会涉及到系统设计和场景题。相比之下,国外的后端技术面试则更加注重这方面的考察。然而近年来,随着国内的技术面试越来越卷,越来越多的公司开始在面试中考察系统设计和场景问题的解决,以更全面的考察求职者,不论是校招还是社招。
|
||||||
|
|
||||||
|
不过,正常面试全是场景题的情况还是极少的,面试官一般会在面试中穿插一两个系统设计和场景题来考察你。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
于是,我总结了这份《后端面试高频系统设计&场景题》,包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。
|
||||||
|
|
||||||
|
即使不是准备面试,我也强烈推荐你认真阅读这一系列文章,这对于提升自己系统设计思维和解决实际问题的能力还是非常有帮助的。并且,涉及到的很多案例都可以用到自己的项目上比如抽奖系统设计、第三方授权登录、Redis实现延时任务的正确方式。
|
||||||
|
|
||||||
|
《后端面试高频系统设计&场景题》本身是属于《Java面试指北》的一部分,后面由于内容篇幅较多,因此被单独提了出来。
|
||||||
|
|
||||||
|
## 内容概览
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
<!-- @include: @planet2.snippet.md -->
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 《手写 RPC 框架》(付费)
|
title: 《手写 RPC 框架》
|
||||||
category: 知识星球
|
category: 知识星球
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -18,16 +18,4 @@ category: 知识星球
|
|||||||
- GitHub 地址:[https://github.com/Snailclimb/guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) 。
|
- GitHub 地址:[https://github.com/Snailclimb/guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) 。
|
||||||
- Gitee 地址:[https://gitee.com/SnailClimb/guide-rpc-framework](https://gitee.com/SnailClimb/guide-rpc-framework) 。
|
- Gitee 地址:[https://gitee.com/SnailClimb/guide-rpc-framework](https://gitee.com/SnailClimb/guide-rpc-framework) 。
|
||||||
|
|
||||||
## 星球其他资源
|
<!-- @include: @planet2.snippet.md -->
|
||||||
|
|
||||||
除了 **《手写 RPC 框架》** 之外,星球还有 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot2.1 的源码)、 **《Java 面试指北》**、**《Kafka 常见面试题/知识点总结》** 等多个专属小册。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 星球限时优惠
|
|
||||||
|
|
||||||
<!-- @include: @the-way-join-planet.snippet.md -->
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 《Java 面试指北》(付费)
|
title: 《Java 面试指北》
|
||||||
category: 知识星球
|
category: 知识星球
|
||||||
star: 5
|
star: 5
|
||||||
---
|
---
|
||||||
@ -72,20 +72,6 @@ star: 5
|
|||||||
|
|
||||||
每一篇内容都非常干货,不少球友看了之后表示收获满满。不过,最重要的还是知行合一。
|
每一篇内容都非常干货,不少球友看了之后表示收获满满。不过,最重要的还是知行合一。
|
||||||
|
|
||||||
## 星球其他资源
|
|
||||||
|
|
||||||
除了 **《Java 面试指北》** 之外,星球还有 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完)、**《Kafka 常见面试题/知识点总结》** 等多个专属小册。
|
|
||||||
|
|
||||||

|
<!-- @include: @planet2.snippet.md -->
|
||||||
|
|
||||||
还会免费赠送多本优质 PDF 面试手册。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 星球限时优惠
|
|
||||||
|
|
||||||
<!-- @include: @the-way-join-planet.snippet.md -->
|
|
||||||
|
@ -6,6 +6,7 @@ category: 知识星球
|
|||||||
这部分的内容为我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)专属,目前已经更新了下面这些专栏:
|
这部分的内容为我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)专属,目前已经更新了下面这些专栏:
|
||||||
|
|
||||||
- **[《Java 面试指北》](./java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补!
|
- **[《Java 面试指北》](./java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补!
|
||||||
|
- **[《后端面试高频系统设计&场景题》](./back-end-interview-high-frequency-system-design-and-scenario-questions)** : 包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。
|
||||||
- **[《手写 RPC 框架》](./java-mian-shi-zhi-bei.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。
|
- **[《手写 RPC 框架》](./java-mian-shi-zhi-bei.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。
|
||||||
- **[《Java 必读源码系列》](./source-code-reading.md)**:目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码
|
- **[《Java 必读源码系列》](./source-code-reading.md)**:目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码
|
||||||
- ......
|
- ......
|
||||||
@ -16,14 +17,8 @@ category: 知识星球
|
|||||||
|
|
||||||
## 更多专栏
|
## 更多专栏
|
||||||
|
|
||||||
除了上面介绍的之外,我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)还有 **《Kafka 常见面试题/知识点总结》**、**《程序员副业赚钱之路》**等多个专栏。
|
除了上面介绍的之外,我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)还有 《Kafka 常见面试题/知识点总结》、《程序员副业赚钱之路》等多个专栏。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
|
<!-- @include: @planet2.snippet.md -->
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 星球限时优惠
|
|
||||||
|
|
||||||
<!-- @include: @the-way-join-planet.snippet.md -->
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 《Java 必读源码系列》(付费)
|
title: 《Java 必读源码系列》
|
||||||
category: 知识星球
|
category: 知识星球
|
||||||
star: true
|
star: true
|
||||||
---
|
---
|
||||||
@ -14,16 +14,4 @@ star: true
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 星球其他资源
|
<!-- @include: @planet2.snippet.md -->
|
||||||
|
|
||||||
除了 **《Java 必读源码系列》** 之外,星球还有 **《从零开始写一个 RPC 框架》**、 **《Java 面试指北》**、 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot2.1 的源码)、**《Kafka 常见面试题/知识点总结》** 等多个专栏。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
另外,星球还会有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 星球限时优惠
|
|
||||||
|
|
||||||
<!-- @include: @the-way-join-planet.snippet.md -->
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user