From 7dbe2b8467fb6ac2a5d60605afcca49b58f6c720 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Sat, 30 Nov 2019 17:36:21 +0800 Subject: [PATCH] =?UTF-8?q?Create=20=E3=80=90=E7=9C=9F=E5=AE=9E=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E7=BB=8F=E5=8E=86=E3=80=91=E6=88=91=E6=89=80=E7=BB=8F?= =?UTF-8?q?=E5=8E=86=E7=9A=84=E9=98=BF=E9=87=8C=E4=B8=80=E4=BA=8C=E9=9D=A2?= =?UTF-8?q?=E6=80=BB=E7=BB=93(=E9=99=84=E8=AF=A6=E8=A7=A3).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...åŽ†çš„é˜¿é‡Œä¸€äºŒé¢æ€»ç»“(附详解).md | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 docs/essential-content-for-interview/real-interview-experience-analysis/ã€çœŸå®žé¢è¯•ç»åŽ†ã€‘æˆ‘æ‰€ç»åŽ†çš„é˜¿é‡Œä¸€äºŒé¢æ€»ç»“(附详解).md diff --git a/docs/essential-content-for-interview/real-interview-experience-analysis/ã€çœŸå®žé¢è¯•ç»åŽ†ã€‘æˆ‘æ‰€ç»åŽ†çš„é˜¿é‡Œä¸€äºŒé¢æ€»ç»“(附详解).md b/docs/essential-content-for-interview/real-interview-experience-analysis/ã€çœŸå®žé¢è¯•ç»åŽ†ã€‘æˆ‘æ‰€ç»åŽ†çš„é˜¿é‡Œä¸€äºŒé¢æ€»ç»“(附详解).md new file mode 100644 index 00000000..fdb26309 --- /dev/null +++ b/docs/essential-content-for-interview/real-interview-experience-analysis/ã€çœŸå®žé¢è¯•ç»åŽ†ã€‘æˆ‘æ‰€ç»åŽ†çš„é˜¿é‡Œä¸€äºŒé¢æ€»ç»“(附详解).md @@ -0,0 +1,141 @@ +本文的内容都是根æ®è¯»è€…投稿的真实é¢è¯•ç»åŽ†æ”¹ç¼–è€Œæ¥ï¼Œé¦–次å°è¯•è¿™ç§é£Žæ ¼çš„æ–‡ç« ï¼ŒèŠ±äº†å‡ å¤©æ™šä¸Šæ‰æ€»ç®—å†™å®Œï¼Œå¸Œæœ›å¯¹ä½ æœ‰å¸®åŠ©ã€‚æœ¬æ–‡ä¸»è¦æ¶µç›–下é¢çš„内容: + +1. 分布å¼å•†åŸŽç³»ç»Ÿï¼šæž¶æž„图讲解; +2. 消æ¯é˜Ÿåˆ—相关:削峰和解耦; +3. Redis 相关:缓存穿é€é—®é¢˜çš„解决; +4. 一些 Java 基础问题; + +é¢è¯•开始,å在我å‰é¢çš„就是这次我的é¢è¯•官å—?这å‘é‡çœ‹ç€æ ¹æœ¬ä¸åƒç¨‹åºå‘˜å•Šï¼Ÿæˆ‘心里正嘀咕ç€ï¼Œåªå¬è§é¢è¯•官说:“å°ä¼™ï¼Œä¸‹åˆå¥½ï¼Œæˆ‘今天就是你的é¢è¯•官,咱们开始é¢è¯•å§ï¼â€ã€‚ + +### 第一é¢å¼€å§‹ + +**é¢è¯•官:** 我也ä¸ç”¨å¤šè¯´äº†ï¼Œä½ å…ˆè‡ªæˆ‘介ç»ä¸€ä¸‹å§ï¼Œç®€åŽ†ä¸Šæœ‰çš„å°±ä¸è¦å†è¯´äº†å“ˆã€‚ + +**我:** 内心 os:"果然如我所料,就知é“会让我先自我介ç»ä¸€ä¸‹ï¼Œè¿˜å¥½æˆ‘看了 [JavaGuide](https://github.com/Snailclimb/JavaGuide "JavaGuide") ,学到了一些套路。套路总结起æ¥å°±æ˜¯ï¼š**最好准备好两份自我介ç»ï¼Œä¸€ä»½å¯¹ hr 说的,主è¦è®²èƒ½çªå‡ºè‡ªå·±çš„ç»åŽ†ï¼Œä¼šçš„ç¼–ç¨‹æŠ€æœ¯ä¸€è¯­å¸¦è¿‡ï¼›å¦ä¸€ä»½å¯¹æŠ€æœ¯é¢è¯•官说的,主è¦è®²è‡ªå·±ä¼šçš„æŠ€æœ¯ç»†èŠ‚ï¼Œé¡¹ç›®ç»éªŒï¼Œç»åŽ†é‚£äº›å°±ä¸€è¯­å¸¦è¿‡ã€‚** 所以,我按照这个套路准备了一个还算通用的模æ¿ï¼Œæ¯•竟我懒嘛ï¼ä¸æƒ³å¤šå‡†å¤‡ä¸€ä¸ªè‡ªæˆ‘介ç»ï¼Œæ•´ä¸ªé€šç”¨çš„å¤šå¥½ï¼ + +> é¢è¯•å®˜ï¼Œæ‚¨å¥½ï¼æˆ‘å«å°æŽå­ã€‚大学时间我主è¦åˆ©ç”¨è¯¾å¤–时间学习 Java 相关的知识。在校期间å‚与过一个校园图书馆系统的开å‘,å¦å¤–,我自己在学习过程中也å‚ç…§ç½‘ä¸Šçš„æ•™ç¨‹å†™è¿‡ä¸€ä¸ªç”µå•†ç³»ç»Ÿçš„ç½‘ç«™ï¼Œå†™è¿™ä¸ªç”µå•†ç½‘ç«™ä¸»è¦æ˜¯ä¸ºäº†èƒ½è®©è‡ªå·±æŽ¥è§¦åˆ°åˆ†å¸ƒå¼ç³»ç»Ÿçš„å¼€å‘。在学习之余,我比较喜欢通过åšå®¢æ•´ç†åˆ†äº«è‡ªå·±æ‰€å­¦çŸ¥è¯†ã€‚æˆ‘çŽ°åœ¨å·²ç»æ˜¯æŸç¤¾åŒºçš„认è¯ä½œè€…,写过一系列关于 çº¿ç¨‹æ± ä½¿ç”¨ä»¥åŠæºç åˆ†æžçš„æ–‡ç« æ·±å—好评。å¦å¤–,我获得过çœçº§ç¼–程比赛二等奖,我将这个获奖项目开æºåˆ° Github 还收获了 2k çš„ Star 呢? + +**é¢è¯•官:** 你刚刚说å‚考网上的教程åšäº†ä¸€ä¸ªç”µå•†ç³»ç»Ÿï¼Ÿä½ èƒ½ç”»ç”»è¿™ä¸ªç”µå•†ç³»ç»Ÿçš„æž¶æž„图å—? + +**我:** 内心 os: "è¿™å¯éš¾ä¸å€’æˆ‘ï¼æ—©çŸ¥é“写在简历上的项目è¦é‡è§†äº†ï¼Œæå‰éƒ½æŠŠè¿™ä¸ªç³»ç»Ÿçš„æž¶æž„图画了好多é了呢ï¼" + + + +åšè¿‡åˆ†å¸ƒå¼ç”µå•†ç³»ç»Ÿçš„一定很熟悉上é¢çš„æž¶æž„å›¾ï¼ˆç›®å‰æ¯”较æµè¡Œçš„æ˜¯å¾®æœåŠ¡æž¶æž„ï¼Œä½†æ˜¯å¦‚æžœä½ æœ‰åˆ†å¸ƒå¼å¼€å‘ç»éªŒä¹Ÿæ˜¯éžå¸¸åŠ åˆ†çš„ï¼ï¼‰ã€‚ + +**é¢è¯•官:** 简å•介ç»ä¸€ä¸‹ä½ åšçš„这个系统å§ï¼ + +**我:** 我一本正ç»çš„å¯¹ç€æˆ‘刚刚画的商城架构图开始了满嘴造ç«ç®­çš„讲起æ¥ï¼š + +> 本系统主è¦åˆ†ä¸ºå±•ç¤ºå±‚ã€æœåŠ¡å±‚å’ŒæŒä¹…å±‚è¿™ä¸‰å±‚ã€‚è¡¨çŽ°å±‚é¡¾åæ€ä¹‰ä¸»è¦å°±æ˜¯ä¸ºäº†ç”¨æ¥å±•示,比如我们的åŽå°ç®¡ç†ç³»ç»Ÿçš„页é¢ã€å•†åŸŽé¦–页的页é¢ã€æœç´¢ç³»ç»Ÿçš„页é¢ç­‰ç­‰ï¼Œè¿™ä¸€å±‚éƒ½åªæ˜¯ä½œä¸ºå±•示,并没有æä¾›ä»»ä½•æœåŠ¡ã€‚ +> +> 展示层和æœåŠ¡å±‚ä¸€èˆ¬æ˜¯éƒ¨ç½²åœ¨ä¸åŒçš„æœºå™¨ä¸Šæ¥æé«˜å¹¶å‘é‡å’Œæ‰©å±•性,那么展示层和æœåŠ¡å±‚æ€Žæ ·æ‰èƒ½äº¤äº’呢?在本系统中我们使用 Dubbo æ¥è¿›è¡ŒæœåŠ¡æ²»ç†ã€‚Dubbo 是一款高性能ã€è½»é‡çº§çš„å¼€æº Java RPC 框架。Dubbo 在本系统的主è¦ä½œç”¨å°±æ˜¯æä¾›è¿œç¨‹ RPC 调用。在本系统中æœåŠ¡å±‚çš„ä¿¡æ¯é€šè¿‡ Dubbo 注册给 ZooKeeper,表现层通过 Dubbo 去 ZooKeeper ä¸­èŽ·å–æœåŠ¡çš„ç›¸å…³ä¿¡æ¯ã€‚Zookeeper 的作用仅仅是存放æä¾›æœåŠ¡çš„æœåŠ¡å™¨çš„åœ°å€å’Œä¸€äº›æœåŠ¡çš„ç›¸å…³ä¿¡æ¯ï¼Œå®žçް RPC 远程调用功能的还是 Dubbo。如果需è¦å¼•用到æŸä¸ªæœåŠ¡çš„æ—¶å€™ï¼Œæˆ‘ä»¬åªéœ€è¦åœ¨é…置文件中é…置相关信æ¯å°±å¯ä»¥åœ¨ä»£ç ä¸­ç›´æŽ¥ä½¿ç”¨äº†ï¼Œå°±åƒè°ƒç”¨æœ¬åœ°æ–¹æ³•一样。å‡å¦‚说æŸä¸ªæœåŠ¡çš„ä½¿ç”¨é‡å¢žåŠ æ—¶ï¼Œæˆ‘ä»¬åªç”¨ä¸ºè¿™å•个æœåŠ¡å¢žåŠ æœåŠ¡å™¨ï¼Œè€Œä¸éœ€è¦ä¸ºæ•´ä¸ªç³»ç»Ÿæ·»åŠ æœåŠ¡ã€‚ +> +> å¦å¤–,本系统的数æ®åº“使用的是常用的 MySQL,并且用到了数æ®åº“中间件 MyCat。å¦å¤–,本系统还用到 redis 内存数æ®åº“æ¥ä½œä¸ºç¼“å­˜æ¥æé«˜ç³»ç»Ÿçš„å应速度。å‡å¦‚用户第一次访问数æ®åº“中的æŸäº›æ•°æ®ï¼Œè¿™ä¸ªè¿‡ç¨‹ä¼šæ¯”较慢,因为是从硬盘上读å–的。将该用户访问的数æ®å­˜åœ¨æ•°ç¼“存中,这样下一次å†è®¿é—®è¿™äº›æ•°æ®çš„æ—¶å€™å°±å¯ä»¥ç›´æŽ¥ä»Žç¼“存中获å–了。æ“作缓存就是直接æ“作内存,所以速度相当快。 +> +> 系统还用到了 Elasticsearch æ¥æä¾›æœç´¢åŠŸèƒ½ã€‚ä½¿ç”¨ Elasticsearch 我们å¯ä»¥éžå¸¸æ–¹ä¾¿çš„为我们的商城系统添加必备的æœç´¢åŠŸèƒ½ï¼Œå¹¶ä¸”ä½¿ç”¨ Elasticsearch 还能æä¾›å…¶å®ƒéžå¸¸å®žç”¨çš„功能,并且很容易扩展。 + +**é¢è¯•官:** 我看你的系统里é¢è¿˜ç”¨åˆ°äº†æ¶ˆæ¯é˜Ÿåˆ—,能说说为什么è¦ç”¨å®ƒå—? + +**我:** + +> 使用消æ¯é˜Ÿåˆ—ä¸»è¦æ˜¯ä¸ºäº†ï¼š +> +> 1. å‡å°‘å“应所需时间和削峰。 +> 2. é™ä½Žç³»ç»Ÿè€¦åˆæ€§ï¼ˆè§£è€¦/æå‡ç³»ç»Ÿå¯æ‰©å±•性)。 + +**é¢è¯•官:** 你这说的太简å•了ï¼èƒ½ä¸èƒ½ç¨å¾®è¯¦ç»†ä¸€ç‚¹ï¼Œæœ€å¥½èƒ½ç”»å›¾ç»™æˆ‘解释一下。 + +**我:** 内心 os:"都 2019 年了,大部分é¢è¯•者都能对消æ¯é˜Ÿåˆ—的为系统带æ¥çš„这两个好处倒背如æµäº†ï¼Œå¦‚果你想走的更远就è¦åˆ«åˆ«äººæ‡‚的更深一点ï¼" + +> 当我们ä¸ä½¿ç”¨æ¶ˆæ¯é˜Ÿåˆ—的时候,所有的用户的请求会直接è½åˆ°æœåŠ¡å™¨ï¼Œç„¶åŽé€šè¿‡æ•°æ®åº“或者缓存å“应。å‡å¦‚在高并å‘的场景下,如果没有缓存或者数æ®åº“承å—ä¸äº†è¿™ä¹ˆå¤§çš„压力的è¯ï¼Œå°±ä¼šé€ æˆå“åº”é€Ÿåº¦ç¼“æ…¢ï¼Œç”šè‡³é€ æˆæ•°æ®åº“宕机。但是,在使用消æ¯é˜Ÿåˆ—之åŽï¼Œç”¨æˆ·çš„请求数æ®å‘é€ç»™äº†æ¶ˆæ¯é˜Ÿåˆ—之åŽå°±å¯ä»¥ç«‹å³è¿”回,å†ç”±æ¶ˆæ¯é˜Ÿåˆ—的消费者进程从消æ¯é˜Ÿåˆ—ä¸­èŽ·å–æ•°æ®ï¼Œå¼‚步写入数æ®åº“,ä¸è¿‡è¦ç¡®ä¿æ¶ˆæ¯ä¸è¢«é‡å¤æ¶ˆè´¹è¿˜è¦è€ƒè™‘到消æ¯ä¸¢å¤±é—®é¢˜ã€‚由于消æ¯é˜Ÿåˆ—æœåС噍处ç†é€Ÿåº¦å¿«äºŽæ•°æ®åº“,因此å“应速度得到大幅改善。 +> +> 文字 is too 空洞,直接上图å§ï¼ä¸‹å›¾å±•示了使用消æ¯å‰åŽç³»ç»Ÿå¤„ç†ç”¨æˆ·è¯·æ±‚的对比(ps:我自己都被我画的这个图美到了,如果你也觉得这张图好看的è¯éº»çƒ¦æ¥ä¸ªç´ è´¨ä¸‰è¿žï¼ï¼‰ã€‚ +> +> ![é€šè¿‡å¼‚æ­¥å¤„ç†æé«˜ç³»ç»Ÿæ€§èƒ½](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/Asynchronous-message-queue.png) +> +> é€šè¿‡ä»¥ä¸Šåˆ†æžæˆ‘们å¯ä»¥å¾—出**消æ¯é˜Ÿåˆ—具有很好的削峰作用的功能**——å³**通过异步处ç†ï¼Œå°†çŸ­æ—¶é—´é«˜å¹¶å‘产生的事务消æ¯å­˜å‚¨åœ¨æ¶ˆæ¯é˜Ÿåˆ—中,从而削平高峰期的并å‘事务。** 举例:在电å­å•†åŠ¡ä¸€äº›ç§’æ€ã€ä¿ƒé”€æ´»åŠ¨ä¸­ï¼Œåˆç†ä½¿ç”¨æ¶ˆæ¯é˜Ÿåˆ—å¯ä»¥æœ‰æ•ˆæŠµå¾¡ä¿ƒé”€æ´»åŠ¨åˆšå¼€å§‹å¤§é‡è®¢å•涌入对系统的冲击。如下图所示: +> +> ![削峰](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/削峰-消æ¯é˜Ÿåˆ—.png) +> +> 使用消æ¯é˜Ÿåˆ—还å¯ä»¥é™ä½Žç³»ç»Ÿè€¦åˆæ€§ã€‚我们知é“如果模å—之间ä¸å­˜åœ¨ç›´æŽ¥è°ƒç”¨ï¼Œé‚£ä¹ˆæ–°å¢žæ¨¡å—或者修改模å—就对其他模å—å½±å“较å°ï¼Œè¿™æ ·ç³»ç»Ÿçš„坿‰©å±•性无疑更好一些。还是直接上图å§ï¼š +> +> ![解耦](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/消æ¯é˜Ÿåˆ—-解耦.png) +> +> 生产者(客户端)å‘逿¶ˆæ¯åˆ°æ¶ˆæ¯é˜Ÿåˆ—中去,接å—者(æœåŠ¡ç«¯ï¼‰å¤„ç†æ¶ˆæ¯ï¼Œéœ€è¦æ¶ˆè´¹çš„系统直接去消æ¯é˜Ÿåˆ—å–æ¶ˆæ¯è¿›è¡Œæ¶ˆè´¹å³å¯è€Œä¸éœ€è¦å’Œå…¶ä»–系统有耦åˆï¼Œ 这显然也æé«˜äº†ç³»ç»Ÿçš„æ‰©å±•性。 + +**é¢è¯•官:** 你觉得它有什么缺点å—?或者说怎么考虑用ä¸ç”¨æ¶ˆæ¯é˜Ÿåˆ—? + +**我:** 内心 os: "é¢è¯•官真鸡贼ï¼è¿™ä¸æ˜¯å‹¾å¼•我上钩么?还好我准备充分。" + +> 我觉得å¯ä»¥ä»Žä¸‹é¢å‡ ä¸ªæ–¹é¢æ¥è¯´ï¼š +> +> 1. **系统å¯ç”¨æ€§é™ä½Žï¼š** 系统å¯ç”¨æ€§åœ¨æŸç§ç¨‹åº¦ä¸Šé™ä½Žï¼Œä¸ºä»€ä¹ˆè¿™æ ·è¯´å‘¢ï¼Ÿåœ¨åŠ å…¥MQ之å‰ï¼Œä½ ä¸ç”¨è€ƒè™‘消æ¯ä¸¢å¤±æˆ–者说MQ挂掉等等的情况,但是,引入MQ之åŽä½ å°±éœ€è¦åŽ»è€ƒè™‘äº†ï¼ +> 2. **ç³»ç»Ÿå¤æ‚性æé«˜ï¼š** 加入MQ之åŽï¼Œä½ éœ€è¦ä¿è¯æ¶ˆæ¯æ²¡æœ‰è¢«é‡å¤æ¶ˆè´¹ã€å¤„ç†æ¶ˆæ¯ä¸¢å¤±çš„æƒ…况ã€ä¿è¯æ¶ˆæ¯ä¼ é€’çš„é¡ºåºæ€§ç­‰ç­‰é—®é¢˜ï¼ +> 3. **一致性问题:** 我上é¢è®²äº†æ¶ˆæ¯é˜Ÿåˆ—å¯ä»¥å®žçŽ°å¼‚æ­¥ï¼Œæ¶ˆæ¯é˜Ÿåˆ—带æ¥çš„异步确实å¯ä»¥æé«˜ç³»ç»Ÿå“应速度。但是,万一消æ¯çš„çœŸæ­£æ¶ˆè´¹è€…å¹¶æ²¡æœ‰æ­£ç¡®æ¶ˆè´¹æ¶ˆæ¯æ€Žä¹ˆåŠžï¼Ÿè¿™æ ·å°±ä¼šå¯¼è‡´æ•°æ®ä¸ä¸€è‡´çš„æƒ…况了! + +**é¢è¯•官**:åšé¡¹ç›®çš„过程中é‡åˆ°äº†ä»€ä¹ˆé—®é¢˜å—?解决了å—ï¼Ÿå¦‚æžœè§£å†³çš„è¯æ˜¯å¦‚何解决的呢? + +**我** : 内心 os: "åšçš„过程中好åƒä¹Ÿæ²¡æœ‰é‡åˆ°ä»€ä¹ˆé—®é¢˜å•Šï¼æ€Žä¹ˆåŠžï¼Ÿæ€Žä¹ˆåŠžï¼Ÿçªç„¶æƒ³åˆ°å¯ä»¥è¯´æˆ‘在使用 Redis 过程中é‡åˆ°çš„问题,毕竟我对 Redis 还算熟悉嘛,把é¢è¯•官往这个方å‘å¸å¼•,准没错。" + +> 我在使用 Redis 对常用数æ®è¿›è¡Œç¼“冲的过程中出现了缓存穿é€ã€‚ç„¶åŽï¼Œæˆ‘通过谷歌æœç´¢ç›¸å…³çš„解决方案æ¥è§£å†³çš„。 + +**é¢è¯•官:** 你还知é“缓存穿é€å•Šï¼Ÿä¸é”™å•Šï¼æ¥è¯´è¯´ä»€ä¹ˆæ˜¯ç¼“存穿é€ä»¥åŠä½ æœ€åŽçš„解决办法。 + +**我:** 我先æ¥è°ˆè°ˆä»€ä¹ˆæ˜¯ç¼“存穿é€å§ï¼ + +> 缓存穿é€è¯´ç®€å•点就是大é‡è¯·æ±‚çš„ key 根本ä¸å­˜åœ¨äºŽç¼“存中,导致请求直接到了数æ®åº“上,根本没有ç»è¿‡ç¼“存这一层。举个例å­ï¼šæŸä¸ªé»‘客故æ„制造我们缓存中ä¸å­˜åœ¨çš„ key å‘起大é‡è¯·æ±‚,导致大é‡è¯·æ±‚è½åˆ°æ•°æ®åº“。 +> +> 总结一下就是: +> +> 1. 缓存层ä¸å‘½ä¸­ã€‚ +> 2. 存储层ä¸å‘½ä¸­ï¼Œä¸å°†ç©ºç»“果写回缓存。 +> 3. 返回空结果给客户端。 +> +> 一般 MySQL 默认的最大连接数在 150 å·¦å³ï¼Œè¿™ä¸ªå¯ä»¥é€šè¿‡ `show variables like '%max_connections%';`å‘½ä»¤æ¥æŸ¥çœ‹ã€‚æœ€å¤§è¿žæŽ¥æ•°ä¸€ä¸ªè¿˜åªæ˜¯ä¸€ä¸ªæŒ‡æ ‡ï¼Œcpu,内存,ç£ç›˜ï¼Œç½‘络等无力æ¡ä»¶éƒ½æ˜¯å…¶è¿è¡ŒæŒ‡æ ‡ï¼Œè¿™äº›æŒ‡æ ‡éƒ½ä¼šé™åˆ¶å…¶å¹¶å‘èƒ½åŠ›ï¼æ‰€ä»¥ï¼Œä¸€èˆ¬ 3000 个并å‘请求就能打死大部分数æ®åº“了。 + +**é¢è¯•官:** å°ä¼™å­ä¸é”™å•Šï¼è¿˜å‡†å¤‡é—®ä½ ï¼šâ€œä¸ºä»€ä¹ˆ 3000 的并å‘èƒ½æŠŠæ”¯æŒæœ€å¤§è¿žæŽ¥æ•° 4000 æ•°æ®åº“åŽ‹æ­»ï¼Ÿâ€æƒ³ä¸åˆ°ä½ è‡ªå·±å°±æå‰å›žç­”了ï¼ä¸é”™ï¼ + +**我:** 别夸了ï¼åˆ«å¤¸äº†ï¼æˆ‘冿¥è¯´è¯´æˆ‘知é“çš„ä¸€äº›è§£å†³åŠžæ³•ä»¥åŠæˆ‘最åŽé‡‡ç”¨çš„æ–¹æ¡ˆå§ï¼æ‚¨å¸®å¿™çœ‹çœ‹æœ‰æ²¡æœ‰é—®é¢˜ã€‚ + +> 最基本的就是首先åšå¥½å‚数校验,一些ä¸åˆæ³•çš„å‚æ•°è¯·æ±‚直接抛出异常信æ¯è¿”回给客户端。比如查询的数æ®åº“ id ä¸èƒ½å°äºŽ 0ã€ä¼ å…¥çš„邮箱格å¼ä¸å¯¹çš„æ—¶å€™ç›´æŽ¥è¿”回错误消æ¯ç»™å®¢æˆ·ç«¯ç­‰ç­‰ã€‚ +> +> 解决方案: +> +> 1. **缓存无效 key** : 如果缓存和数æ®åº“都查ä¸åˆ°æŸä¸ª key 的数æ®å°±å†™ä¸€ä¸ªåˆ° redis 中去并设置过期时间,具体命令如下:`SET key value EX 10086`ã€‚è¿™ç§æ–¹å¼å¯ä»¥è§£å†³è¯·æ±‚çš„ key å˜åŒ–ä¸é¢‘ç¹çš„æƒ…å†µï¼Œå¦‚ä½•é»‘å®¢æ¶æ„æ”»å‡»ï¼Œæ¯æ¬¡æž„建的ä¸åŒçš„请求 key,会导致 redis ä¸­ç¼“å­˜å¤§é‡æ— æ•ˆçš„ key ã€‚å¾ˆæ˜Žæ˜¾ï¼Œè¿™ç§æ–¹æ¡ˆå¹¶ä¸èƒ½ä»Žæ ¹æœ¬ä¸Šè§£å†³æ­¤é—®é¢˜ã€‚如果éžè¦ç”¨è¿™ç§æ–¹å¼æ¥è§£å†³ç©¿é€é—®é¢˜çš„è¯ï¼Œå°½é‡å°†æ— æ•ˆçš„ key 的过期时间设置短一点比如 1 分钟。 +> +> å¦å¤–,这里多说一嘴,一般情况下我们是这样设计 key 的: `表å:列å:主键å:主键值`。 +> +> 2. **布隆过滤器:** **布隆过滤器是一个éžå¸¸ç¥žå¥‡çš„æ•°æ®ç»“构,通过它我们å¯ä»¥éžå¸¸æ–¹ä¾¿åœ°åˆ¤æ–­ä¸€ä¸ªç»™å®šæ•°æ®æ˜¯å¦å­˜åœ¨ä¸Žæµ·é‡æ•°æ®ä¸­ã€‚我们需è¦çš„æœºä¼šåˆ¤æ–­ key 是å¦åˆæ³•ï¼Œæœ‰æ²¡æœ‰æ„Ÿè§‰å¸ƒéš†è¿‡æ»¤å™¨å°±æ˜¯æˆ‘ä»¬æƒ³è¦æ‰¾çš„那个“人â€ã€‚** + +**é¢è¯•官:** ä¸é”™ä¸é”™ï¼ä½ è¿˜çŸ¥é“å¸ƒéš†è¿‡æ»¤å™¨å•Šï¼æ¥ç»™æˆ‘谈一谈。 + +**我:** 内心osï¼šâ€œå¦‚æžœä½ å‡†å¤‡è¿‡æµ·é‡æ•°æ®å¤„ç†çš„é¢è¯•题,你一定对:“如何确定一个数字是å¦åœ¨äºŽåŒ…å«å¤§é‡æ•°å­—的数字集中(数字集很大,5亿以上ï¼ï¼‰?â€è¿™ä¸ªé¢˜ç›®å¾ˆäº†è§£äº†ï¼è§£å†³è¿™é“题目就è¦ç”¨åˆ°å¸ƒéš†è¿‡æ»¤å™¨ã€‚†+ +> å¸ƒéš†è¿‡æ»¤å™¨åœ¨é’ˆå¯¹æµ·é‡æ•°æ®å޻釿ˆ–è€…éªŒè¯æ•°æ®åˆæ³•性的时候éžå¸¸æœ‰ç”¨ã€‚**布隆过滤器的本质实际上是 “ä½(bit)数组â€ï¼Œä¹Ÿå°±æ˜¯è¯´æ¯ä¸€ä¸ªå­˜å…¥å¸ƒéš†è¿‡æ»¤å™¨çš„æ•°æ®éƒ½åªå ä¸€ä½ã€‚相比于我们平时常用的的 Listã€Map ã€Set等数æ®ç»“构,它å ç”¨ç©ºé—´æ›´å°‘å¹¶ä¸”æ•ˆçŽ‡æ›´é«˜ï¼Œä½†æ˜¯ç¼ºç‚¹æ˜¯å…¶è¿”å›žçš„ç»“æžœæ˜¯æ¦‚çŽ‡æ€§çš„ï¼Œè€Œä¸æ˜¯éžå¸¸å‡†ç¡®çš„。** +> +> **当一个元素加入布隆过滤器中的时候,会进行如下æ“作:** +> +> 1. 使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。 +> 2. æ ¹æ®å¾—åˆ°çš„å“ˆå¸Œå€¼ï¼Œåœ¨ä½æ•°ç»„中把对应下标的值置为 1。 +> +> **当我们需è¦åˆ¤æ–­ä¸€ä¸ªå…ƒç´ æ˜¯å¦å­˜åœ¨äºŽå¸ƒéš†è¿‡æ»¤å™¨çš„æ—¶å€™ï¼Œä¼šè¿›è¡Œå¦‚下æ“作:** +> +> 1. å¯¹ç»™å®šå…ƒç´ å†æ¬¡è¿›è¡Œç›¸åŒçš„哈希计算; +> 2. 得到值之åŽåˆ¤æ–­ä½æ•°ç»„中的æ¯ä¸ªå…ƒç´ æ˜¯å¦éƒ½ä¸º 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值ä¸ä¸º 1,说明该元素ä¸åœ¨å¸ƒéš†è¿‡æ»¤å™¨ä¸­ã€‚ +> +> 举个简å•的例å­ï¼š +> +> +> +> ![布隆过滤器hash计算](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/布隆过滤器-hashè¿ç®—.png) +> +> 如图所示,当字符串存储è¦åŠ å…¥åˆ°å¸ƒéš†è¿‡æ»¤å™¨ä¸­æ—¶ï¼Œè¯¥å­—ç¬¦ä¸²é¦–å…ˆç”±å¤šä¸ªå“ˆå¸Œå‡½æ•°ç”Ÿæˆä¸åŒçš„哈希值,然åŽåœ¨å¯¹åº”çš„ä½æ•°ç»„的下表的元素设置为 1ï¼ˆå½“ä½æ•°ç»„åˆå§‹åŒ–æ—¶ ,所有ä½ç½®å‡ä¸º0)。当第二次存储相åŒå­—符串时,因为先å‰çš„对应ä½ç½®å·²è®¾ç½®ä¸º1ï¼Œæ‰€ä»¥å¾ˆå®¹æ˜“çŸ¥é“æ­¤å€¼å·²ç»å­˜åœ¨ï¼ˆåŽ»é‡éžå¸¸æ–¹ä¾¿ï¼‰ã€‚ +> +> 如果我们需è¦åˆ¤æ–­æŸä¸ªå­—符串是å¦åœ¨å¸ƒéš†è¿‡æ»¤å™¨ä¸­æ—¶ï¼Œåªéœ€è¦å¯¹ç»™å®šå­—ç¬¦ä¸²å†æ¬¡è¿›è¡Œç›¸åŒçš„哈希计算,得到值之åŽåˆ¤æ–­ä½æ•°ç»„中的æ¯ä¸ªå…ƒç´ æ˜¯å¦éƒ½ä¸º 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值ä¸ä¸º 1,说明该元素ä¸åœ¨å¸ƒéš†è¿‡æ»¤å™¨ä¸­ã€‚ +> +> **ä¸åŒçš„字符串å¯èƒ½å“ˆå¸Œå‡ºæ¥çš„ä½ç½®ç›¸åŒï¼Œè¿™ç§æƒ…况我们å¯ä»¥é€‚å½“å¢žåŠ ä½æ•°ç»„大尿ˆ–者调整我们的哈希函数。** +> +> 综上,我们å¯ä»¥å¾—出:**布隆过滤器说æŸä¸ªå…ƒç´ å­˜åœ¨ï¼Œå°æ¦‚率会误判。布隆过滤器说æŸä¸ªå…ƒç´ ä¸åœ¨ï¼Œé‚£ä¹ˆè¿™ä¸ªå…ƒç´ ä¸€å®šä¸åœ¨ã€‚** + +**é¢è¯•官:** 看æ¥ä½ å¯¹å¸ƒéš†è¿‡æ»¤å™¨äº†è§£çš„还挺ä¸é”™çš„嘛ï¼é‚£ä½ å¿«è¯´è¯´ä½ æœ€åŽæ˜¯æ€Žä¹ˆåˆ©ç”¨å®ƒæ¥è§£å†³ç¼“存穿é€çš„。 \ No newline at end of file