├── 0.个人面试记录.md
├── 1.Java基础知识.md
├── 10.数据结构和算法.md
├── 11.分布式系统设计相关笔记.md
├── 12.设计模式.md
├── 2.JVM相关笔记.md
├── 3.Java并发编程相关笔记.md
├── 4.MySQL 语法.md
├── 4.MySQL相关笔记.md
├── 5.Redis相关笔记.md
├── 6.操作系统相关笔记.md
├── 7.计算机网络相关笔记.md
├── 9.Web框架相关笔记.md
├── README.md
└── images
├── 859616056
├── 860680329
├── 860681783
├── 001A57D5.png
├── 006r3PQBjw1fbimb5c3srj30b40b40t9-20200404224750646.jpg
├── 05cd18e7e33c5937c7c39bf8872c5753.jpg
├── 0d2070e8f84c4801adbfa03bda1f98d9.png
├── 11859806-91afb99287720a23.png
├── 121DF041.png
├── 1361655-20180413120416720-1194570336.png
├── 1361655-20180413120441690-412327236.jpg
├── 1511516031351141.png
├── 1532166645819.jpg
├── 1701765-20191126153931611-191817306.png
├── 20160901200252457
├── 20170511174502192
├── 20171213165317075
├── 20180504214923703
├── 20180504214933901
├── 2019-01-31-03.png
├── 2019-3Java运行时数据区域JDK1.8.png
├── 20190622210958452.png
├── 2019070810495327.png
├── 20200201180517.png
├── 20200412002533763.png
├── 20201122214623249.png
├── 20210118173547289.png
├── 20210226175544304.png
├── 23f24c545d33ec4d6d72fc10e94a0ff7.jpg
├── 2b27dac8cc647f8aac989da2d1166db2.png
├── 2e5bff4910ec189fe1ee6e2ecc7b4bbe.png
├── 32fa828ba61ea8d3c2502e396b1b3848251f58b0.jpeg
├── 450px-Red-black_tree_example.svg.png
├── 50da81cb39dbb6fddfd1efbf6ecb031d952b3791.jpeg
├── 514dc04df2b8b2f3130b7d44776a825d.jpg
├── 5Qj6BiZVf0RWCRWYnl30Tg
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30326131666266642d376139642d343131342d393564662d6361323434353538376131662e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30663339396139662d313335312d346232642d623861342d3265626538326231613730332e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f31363233663532342d623031312d343063382d623833662d6561623338643533386637362e706e67
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34306336353730642d633164372d346333382d383433652d6261393931623233323863322e706e67
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34336433323361632d396630372d346534612d613331352d3465616638633338373636632e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34616238373731372d653236342d343233322d383235642d3861616630386631346538622e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f39646161333631362d303061342d343863342d393134362d3739326463383439396265332e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f61343261643361372d333537342d346334382d613738332d6564336430386130363838612e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f62666561383737322d643031622d346135312d386164632d6564666437643364636538342e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f64326330373263632d386231372d343830632d383133652d3138636462336234623531662e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f65393864656235612d643564342d343239342d616139622d3932323064343438333430332e6a7067
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f66646334356130392d663833382d343334382d383935392d6432633739333732373738382e706e67
├── 68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f6d61737465722d736c6176652e706e67
├── 68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d342f323031392d34254536254144254242254539253934253831312e706e67
├── 68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d372f6a6176612d646565702d616e642d7368616c6c6f772d636f70792e6a7067
├── 695151-20170705185452190-640259597.png
├── 695151-20170705185523503-834605858.png
├── 7896890-516eb4a9465451a6.png
├── 7e2616937e3bc5323faf3ba4c09d739f.jpg
├── 8412ab21453e1b33929dbe4cdf28aa9b.png
├── 849589-20171015231740840-6968181.gif
├── 849589-20190306165258970-1789860540.png
├── 859616056-20210601203507337
├── 9093d242a2514effdbd745206661c180.png
├── B+树索引示意图.png
├── IMG_0003(20210526-113302).PNG
├── IMG_C563B131DD13-1.jpeg
├── Java创建对象的过程.png
├── Java线程生命周期.png
├── Kernel_Layout.png
├── QQ20170331-004227.png
├── Red-black_tree_insert_case_3.png
├── Red-black_tree_insert_case_4.png
├── Red-black_tree_insert_case_5.png
├── Session-Based-Authentication-flow.png
├── Snipaste_2021-07-10_14-12-57.png
├── Token-Based-Authentication.png
├── b086cbbcab0b40079d6352196948c2b2.png
├── c7d6ca32e702d447f012c7f7b5925093.png
├── cde64bf682850738153e6c76dd3f6fb32201ce3c73c23415451da1eead9eb7cb-20190624173156.jpg
├── d1d70cf9cf6a05ef42c17d1e88c2ea2e.jpeg
├── d38202593012b457debbcd74994c6292.png
├── d8f9d72a6059252dbd36f06e5c74ab3e5ab5b9a8.jpeg
├── e7cd7b899e510fb3aa8c05042b22c093d0430ca7.jpeg
├── ff96fed0e2a354bb16bbc84dcedf503a.png
├── float_1.gif
├── float_2.gif
├── float_3.gif
├── image-20200714213723072.png
├── image-20200731150335238.png
├── image-20200731150443395.png
├── image-20200731154808258.png
├── image-20200731161124408.png
├── image-20200731161246609.png
├── image-20200731165300811.png
├── image-20200731215254764.png
├── image-20201009002906744.png
├── image-20201009004538729.png
├── image-20201009004827766.png
├── image-20201009234019606.png
├── image-20201013190809261.png
├── image-20201015001140435.png
├── image-20201016110541315.png
├── image-20201017153106929.png
├── image-20201017190216351.png
├── image-20201023112046554.png
├── image-20201104002431602.png
├── image-20201104002457202.png
├── image-20201108010515345.png
├── image-20201112165335370.png
├── image-20201124180258431.png
├── image-20201130121534623.png
├── image-20201130122201409.png
├── image-20201221213831291.png
├── image-20201221214920609.png
├── image-20201230212625580.png
├── image-20210104102707688.png
├── image-20210104103637384.png
├── image-20210109114515017.png
├── image-20210111134608236.png
├── image-20210111135656009.png
├── image-20210111135713240.png
├── image-20210111174333342.png
├── image-20210112145334579.png
├── image-20210112150208927.png
├── image-20210112152626932.png
├── image-20210112161639348.png
├── image-20210113110816813.png
├── image-20210113111050396.png
├── image-20210113112215272.png
├── image-20210113113522651.png
├── image-20210113114546129.png
├── image-20210113115806574.png
├── image-20210114161810365.png
├── image-20210116125515496.png
├── image-20210116125556541.png
├── image-20210117100519545.png
├── image-20210117104159390.png
├── image-20210117105511943.png
├── image-20210117105703387.png
├── image-20210117105729503.png
├── image-20210117161652747.png
├── image-20210119160645824.png
├── image-20210120140456783.png
├── image-20210120153947951.png
├── image-20210120162114871.png
├── image-20210121133336651.png
├── image-20210122103144748.png
├── image-20210122112233202.png
├── image-20210122112439914.png
├── image-20210124162436993.png
├── image-20210124192431964.png
├── image-20210126175248822.png
├── image-20210127233651581.png
├── image-20210128162613899.png
├── image-20210128162743590.png
├── image-20210129165232639.png
├── image-20210202214936190.png
├── image-20210202214944985.png
├── image-20210204204654697.png
├── image-20210208171800439.png
├── image-20210208181447107.png
├── image-20210216210541646.png
├── image-20210216211744016.png
├── image-20210216215041849.png
├── image-20210216220514814.png
├── image-20210216220849469.png
├── image-20210216221903896.png
├── image-20210216222557043.png
├── image-20210216223414370.png
├── image-20210216223620975.png
├── image-20210217001207875.png
├── image-20210219151024238.png
├── image-20210222115627251.png
├── image-20210222115655060.png
├── image-20210222120636856.png
├── image-20210222140326761.png
├── image-20210222165020169.png
├── image-20210222165858294.png
├── image-20210222172635632.png
├── image-20210223220950463.png
├── image-20210223231828868.png
├── image-20210223232055329.png
├── image-20210223232854949.png
├── image-20210223234633061.png
├── image-20210223234724450.png
├── image-20210224151813407.png
├── image-20210224162544611.png
├── image-20210225191438396.png
├── image-20210226181655874.png
├── image-20210228004048651.png
├── image-20210228100637278.png
├── image-20210228101930508.png
├── image-20210228102337686.png
├── image-20210228103037750.png
├── image-20210228111632296.png
├── image-20210228194736403.png
├── image-20210228202051176.png
├── image-20210228202055260.png
├── image-20210228235719390.png
├── image-20210301194115914.png
├── image-20210302153008576.png
├── image-20210303234741529.png
├── image-20210304100854015.png
├── image-20210308161945117.png
├── image-20210308171124988.png
├── image-20210308172028165.png
├── image-20210310163549004.png
├── image-20210310192131480.png
├── image-20210313010816806.png
├── image-20210314162014667.png
├── image-20210314162440316.png
├── image-20210316010042035.png
├── image-20210316155832849.png
├── image-20210316155941036.png
├── image-20210316165727285.png
├── image-20210317215126342.png
├── image-20210317225704426.png
├── image-20210318213553331.png
├── image-20210319104247349.png
├── image-20210319171350807.png
├── image-20210319210124085.png
├── image-20210320001109615.png
├── image-20210320103208958.png
├── image-20210325003351486.png
├── image-20210325160624617.png
├── image-20210325161523556.png
├── image-20210325192631898.png
├── image-20210326152227075.png
├── image-20210326214809272.png
├── image-20210326215602888.png
├── image-20210328154428031.png
├── image-20210328162746028.png
├── image-20210401190712223.png
├── image-20210406145013627.png
├── image-20210406145633820.png
├── image-20210409205007532.png
├── image-20210409213512252.png
├── image-20210409213547853.png
├── image-20210411154859126.png
├── image-20210411154940092.png
├── image-20210411161846713.png
├── image-20210411163248305.png
├── image-20210411163528953.png
├── image-20210411163737843.png
├── image-20210414140141305.png
├── image-20210414140321191.png
├── image-20210414140807190.png
├── image-20210414140841674.png
├── image-20210414154710957.png
├── image-20210416201758168.png
├── image-20210416202741970.png
├── image-20210417201651860.png
├── image-20210417204950750.png
├── image-20210420232925949.png
├── image-20210427195048104.png
├── image-20210510113441041.png
├── image-20210516211109033.png
├── image-20210516211210968.png
├── image-20210516211321052.png
├── image-20210519104213488.png
├── image-20210519104501297.png
├── image-20210525165256227.png
├── image-20210525165325215.png
├── image-20210526102252732.png
├── image-20210526105102943.png
├── image-20210526105257751.png
├── image-20210526105535616.png
├── image-20210526105619574.png
├── image-20210527125950418.png
├── image-20210601115348453.png
├── image-20210601201642949.png
├── image-20210601202855091.png
├── image-20210601203526275.png
├── image-20210601203547046.png
├── image-20210601203634836.png
├── image-20210602100123542.png
├── image-20210602100317168.png
├── image-20210602102557067.png
├── image-20210602104400506.png
├── image-20210602105501439.png
├── image-20210602105542905.png
├── image-20210603104745566.png
├── image-20210603133709502.png
├── image-20210604101837300.png
├── image-20210605003500665.png
├── image-20210605003640528.png
├── image-20210605003925901.png
├── image-20210605004650576.png
├── image-20210605010400636.png
├── image-20210613235919833.png
├── image-20210614001151079.png
├── image-20210614001700186.png
├── image-20210618153323650.png
├── image-20210710141314929.png
├── image-20210710143029918.png
├── image-20210710143205778.png
├── image-20210710155345259.png
├── image-20210713220604248.png
├── image-20210713221140673.png
├── image-20210713221454439.png
├── image-20210713221624187.png
├── image-20210714102713952.png
├── image-20210714102729452.png
├── image-20210714103257982.png
├── image-20210714113842059.png
├── image-20210722163219602.png
├── image-20210722163234488.png
├── image-20210722163255297.png
├── image-20210722163306125.png
├── image-20210722201828336.png
├── image-20210723112902271.png
├── image-20210723114026196.png
├── image-20210723172322555.png
├── image-20210723172351253.png
├── image-20210723223359866.png
├── image-20210723224100335.png
├── image-20210724153430262.png
├── image-20210725110713993.png
├── image-20210726161649305.png
├── image-20210726162006551.png
├── image-20210726232418306.png
├── image-20210728113453067.png
├── image-20210728113739923.png
├── image-20210728212757175.png
├── image-20210729160624715.png
├── image-20210730160523271.png
├── image-20210731135305120.png
├── image-20210731135414584.png
├── image-20210731135641898.png
├── image-20210731140303264.png
├── image-20210731140550509.png
├── image-20210801170423528.png
├── image-20210801170719472.png
├── image-20210801170750810.png
├── image-20210801171530283.png
├── image-20210801172128364.png
├── image-20210801175912548.png
├── image-20210801213154533.png
├── image-20210801213442863.png
├── image-20210801214616026.png
├── image-20210806205659200.png
├── image-20210806205732293.png
├── image-20210806205754254.png
├── image-20210806205844777.png
├── image-20210806205912470.png
├── image-20210806210013973.png
├── image-20210806210258259.png
├── image-20210806210312815.png
├── image-20210807144647587.png
├── image-20210807151730255.png
├── image-20210808172343063.png
├── image-20210808172358783.png
├── image-20210808172421257.png
├── image-20210809172652766.png
├── image-20210809173717973.png
├── image-20210815205849148.png
├── image-20210819165457226.png
├── image-20210824213345537.png
├── image-20210824214237309.png
├── image-20210904112556698.png
├── image-20210904113033277.png
├── ioc.png
├── redis过期时间.png
├── threadlocal数据结构.png
├── v2-0204ff048148735a260fa5f94f475f14_r.jpg
├── v2-1d41ca6712224fc7ee0226875c59336a_r.jpg
├── v2-1e6d2ef6d8782117779143843798b79e_1440w.jpg
├── v2-1ec1e7e0b313a92e0028691ae97c9766_1440w.jpg
├── v2-4803e11dc95cf478d95674f25efd9a7f_r.jpg
├── v2-5606413e1b5d2c727399711d347617a2_1440w.jpg
├── v2-5ba76e77f05b030b5879177bd336928f_r.jpg
├── v2-7cf8cec396a66dca2dd1fcd6dadab537_1440w.jpg
├── v2-975920d028e58f620ca84125c1b211f4_r.jpg
├── v2-99ad2cd809fcb86dd791ff7f65fb1779_r.jpg
├── v2-9b3d0b05fb2464193410a1712e4f49df_720w.jpg
├── v2-a14c65a4ec2fbb470fba728b818a6d22_1440w.jpg
├── v2-c8af39b5799f314608132fcfd92aa39c_720w.jpg
├── v2-c8af39b5799f314608132fcfd92aa39c_hd.jpg
├── v2-cd67258b67da762478f700866b59eb67_r.jpg
├── v2-d93943bf4f4fbed708f751c5303f8d6f_r.jpg
├── v2-e01c7af752461c0794a10f383dbe465b_1440w.jpg
├── v2-f81afcda08a62df36ae13be04b0ea020_r.jpg
├── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWppZ3Vv,size_16,color_FFFFFF,t_70#pic_center.png
├── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxvX2JyYXZvXw==,size_16,color_FFFFFF,t_70
├── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxvX2JyYXZvXw==,size_16,color_FFFFFF,t_70-16287581769521
├── webp
├── ws.png
├── 代理模式UML.png
├── 冒泡排序.gif
├── 单例模式UML.png
├── 原型模式UML.png
├── 命令模式UML.png
├── 外观模式UML.png
├── 工厂方法模式UML.png
├── 建造者模式UML.png
├── 归并排序.jpg
├── 抽象工厂模式UML-16271434591911.png
├── 抽象工厂模式UML.png
├── 插入排序.gif
├── 桥接模式UML.png
├── 模板模式UML.png
├── 状态模式UML.png
├── 策略模式UML.png
├── 简单工厂模式UML.png
├── 简单选择排序.gif
├── 糖果售卖机.png
├── 组合模式UML.png
├── 装饰器模式UML.png
├── 观察者模式UML.png
├── 迭代器模式UML.png
├── 适配器模式UML-16271435456162.png
├── 适配器模式UML-16271435632083.png
└── 适配器模式UML.png
/11.分布式系统设计相关笔记.md:
--------------------------------------------------------------------------------
1 | # 系统设计
2 |
3 |
4 |
5 | * [系统设计](#系统设计)
6 | * [一、集群](#一集群)
7 | * [1. 负载均衡](#1-负载均衡)
8 | * [负载均衡算法](#负载均衡算法)
9 | * [1. 轮询(Round Robin)](#1-轮询round-robin)
10 | * [2. 加权轮询(Weighted Round Robbin)](#2-加权轮询weighted-round-robbin)
11 | * [3. 最少连接(least Connections)](#3-最少连接least-connections)
12 | * [4. 加权最少连接(Weighted Least Connection)](#4-加权最少连接weighted-least-connection)
13 | * [5. 随机算法(Random)](#5-随机算法random)
14 | * [6. 源地址哈希法 (IP Hash)](#6-源地址哈希法-ip-hash)
15 | * [转发实现](#转发实现)
16 | * [1. HTTP 重定向](#1-http-重定向)
17 | * [2. DNS 域名解析](#2-dns-域名解析)
18 | * [3. 反向代理服务器](#3-反向代理服务器)
19 | * [4. 网络层](#4-网络层)
20 | * [5. 链路层](#5-链路层)
21 | * [2. 分布式 Session 管理](#2-分布式-session-管理)
22 | * [粘性Session](#粘性session)
23 | * [Session同步/复制](#session同步复制)
24 | * [集中式Session管理](#集中式session管理)
25 | * [客户端存储Session](#客户端存储session)
26 | * [二、分布式一致性原理](#二分布式一致性原理)
27 | * [1 分布式理论](#1-分布式理论)
28 | * [1.1 CAP理论](#11-cap理论)
29 | * [一致性](#一致性)
30 | * [可用性](#可用性)
31 | * [分区容错性](#分区容错性)
32 | * [1.2 BASE理论](#12-base理论)
33 | * [基本可用](#基本可用)
34 | * [软状态](#软状态)
35 | * [最终一致性](#最终一致性)
36 | * [1.3 ACID/CAP/BASE总结](#13-acidcapbase总结)
37 | * [2 一致性协议](#2-一致性协议)
38 | * [2.1 两阶段提交2PC协议](#21-两阶段提交2pc协议)
39 | * [阶段1](#阶段1)
40 | * [阶段2](#阶段2)
41 | * [举例](#举例)
42 | * [优缺点](#优缺点)
43 | * [2.1.3 三阶段提交3PC协议](#213-三阶段提交3pc协议)
44 | * [3 分布式共识](#3-分布式共识)
45 | * [3.1 分布式共识问题](#31-分布式共识问题)
46 | * [3.2 Raft算法](#32-raft算法)
47 | * [领导人选举](#领导人选举)
48 | * [正常流程](#正常流程)
49 | * [异常情况](#异常情况)
50 | * [日志复制](#日志复制)
51 | * [正常流程](#正常流程-1)
52 | * [异常情况](#异常情况-1)
53 | * [3.3 Paxos算法](#33-paxos算法)
54 | * [三、网站高并发&高可用](#三网站高并发高可用)
55 | * [1. 高可用](#1-高可用)
56 | * [1.0 负载均衡](#10-负载均衡)
57 | * [1.1 熔断-](#11-熔断-)
58 | * [1.2 限流-](#12-限流-)
59 | * [固定窗口计数器算法](#固定窗口计数器算法)
60 | * [滑动窗口计数器](#滑动窗口计数器)
61 | * [漏桶算法](#漏桶算法)
62 | * [令牌桶算法](#令牌桶算法)
63 | * [1.3 降级-](#13-降级-)
64 | * [1.4 异步调用](#14-异步调用)
65 | * [1.5 幂等性设计](#15-幂等性设计)
66 | * [1.6 数据高可用](#16-数据高可用)
67 | * [1.7 网站监控](#17-网站监控)
68 | * [2. 高性能](#2-高性能)
69 | * [2.0 硬件优化](#20-硬件优化)
70 | * [2.1 缓存](#21-缓存)
71 | * [2.2 集群+负载均衡](#22-集群负载均衡)
72 | * [2.3 异步操作](#23-异步操作)
73 | * [2.4 代码优化](#24-代码优化)
74 | * [四、单点登录SSO](#四单点登录sso)
75 | * [1. 为什么需要单点登录](#1-为什么需要单点登录)
76 | * [2. 如何实现单点登录](#2-如何实现单点登录)
77 | * [2.1 统一域名](#21-统一域名)
78 | * [2.2 CAS方案](#22-cas方案)
79 | * [登录](#登录)
80 | * [注销](#注销)
81 | * [参考文献](#参考文献)
82 |
83 |
84 |
85 | # 一、集群
86 |
87 | ## 1. 负载均衡
88 |
89 | 集群中的应用服务器(节点)通常被设计成无状态,用户可以请求任何一个节点。
90 |
91 | 负载均衡器会根据集群中每个节点的负载情况,将用户请求转发到合适的节点上。
92 |
93 | 负载均衡器可以用来实现高可用以及伸缩性:
94 |
95 | - 高可用:当某个节点故障时,负载均衡器会将用户请求转发到另外的节点上,从而保证所有服务持续可用;
96 | - 伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。
97 |
98 | 负载均衡器运行过程包含两个部分:
99 |
100 | 1. 根据负载均衡算法得到转发的节点;
101 | 2. 进行转发。
102 |
103 | ### 负载均衡算法
104 |
105 | 主要分为:轮询(挨个来)、加权轮询(权重大/性能强的分的个数多)、最少连接(每次选连接数最少的)、加权最少连接(连接数 x 权重)、随机分配、源地址哈希算法。
106 |
107 | #### 1. 轮询(Round Robin)
108 |
109 | 轮询算法把每个请求轮流发送到每个服务器上。
110 |
111 | 下图中,一共有 6 个客户端产生了 6 个请求,这 6 个请求按 (1, 2, 3, 4, 5, 6) 的顺序发送。(1, 3, 5) 的请求会被发送到服务器 1,(2, 4, 6) 的请求会被发送到服务器 2。
112 |
113 | [](https://camo.githubusercontent.com/2e046ed15532377ca5601c5c723407ca6783a93bedbba0b91f21a0ae80e3627c/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f39646161333631362d303061342d343863342d393134362d3739326463383439396265332e6a7067)
114 |
115 |
116 |
117 | 该算法比较适合每个服务器的性能差不多的场景,如果有性能存在差异的情况下,那么性能较差的服务器可能无法承担过大的负载(下图的 Server 2)。
118 |
119 | [](https://camo.githubusercontent.com/50bd2fac5359ea4aebb8e34d81843ef433251a975928ca2ac10a43e3d46a18a2/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f62666561383737322d643031622d346135312d386164632d6564666437643364636538342e6a7067)
120 |
121 |
122 |
123 | #### 2. 加权轮询(Weighted Round Robbin)
124 |
125 | 加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值,性能高的服务器分配更高的权值。
126 |
127 | 例如下图中,服务器 1 被赋予的权值为 5,服务器 2 被赋予的权值为 1,那么 (1, 2, 3, 4, 5) 请求会被发送到服务器 1,(6) 请求会被发送到服务器 2。
128 |
129 | [](https://camo.githubusercontent.com/aa112469c63537454855e5161fb41c55202df3914d15bbe29c49b8bb5d0ca177/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34616238373731372d653236342d343233322d383235642d3861616630386631346538622e6a7067)
130 |
131 |
132 |
133 | #### 3. 最少连接(least Connections)
134 |
135 | 由于每个请求的连接时间不一样,使用轮询或者加权轮询算法的话,可能会让一台服务器当前连接数过大,而另一台服务器的连接过小,造成负载不均衡。
136 |
137 | 例如下图中,(1, 3, 5) 请求会被发送到服务器 1,但是 (1, 3) 很快就断开连接,此时只有 (5) 请求连接服务器 1;(2, 4, 6) 请求被发送到服务器 2,只有 (2) 的连接断开,此时 (6, 4) 请求连接服务器 2。该系统继续运行时,服务器 2 会承担过大的负载。
138 |
139 | [](https://camo.githubusercontent.com/0438d0a428bdd9aa212779ac5a7db01bab3b98ac5c3d98a7d10f6c94ae0cbb98/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f65393864656235612d643564342d343239342d616139622d3932323064343438333430332e6a7067)
140 |
141 |
142 |
143 | 最少连接算法就是将请求发送给当前最少连接数的服务器上。
144 |
145 | 例如下图中,服务器 1 当前连接数最小,那么新到来的请求 6 就会被发送到服务器 1 上。
146 |
147 | [](https://camo.githubusercontent.com/5962a2e5fd8e4e123ea9f80c23c39a8b0e067fc6a84c50909242a4bca7ec343c/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34336433323361632d396630372d346534612d613331352d3465616638633338373636632e6a7067)
148 |
149 |
150 |
151 | #### 4. 加权最少连接(Weighted Least Connection)
152 |
153 | 在最少连接的基础上,根据服务器的性能为每台服务器分配权重,再根据权重计算出每台服务器能处理的连接数。
154 |
155 | #### 5. 随机算法(Random)
156 |
157 | 把请求随机发送到服务器上。
158 |
159 | 和轮询算法类似,该算法比较适合服务器性能差不多的场景。
160 |
161 | [](https://camo.githubusercontent.com/9700896feb04eab2bd626d9849cdb38bccce0a5c298630ab8a5dff5122666d44/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f61343261643361372d333537342d346334382d613738332d6564336430386130363838612e6a7067)
162 |
163 |
164 |
165 | #### 6. 源地址哈希法 (IP Hash)
166 |
167 | 源地址哈希通过对客户端 IP 计算哈希值之后,再对服务器数量取模得到目标服务器的序号。
168 |
169 | 可以保证同一 IP 的客户端的请求会转发到同一台服务器上,用来实现会话粘滞(Sticky Session)
170 |
171 | [](https://camo.githubusercontent.com/b2cc7490406ecaaa8b1e4ca7018fb8f025313f39ef13cf96ada2be0fe68d5189/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30663339396139662d313335312d346232642d623861342d3265626538326231613730332e6a7067)
172 |
173 |
174 |
175 | ### 转发实现
176 |
177 | #### 1. HTTP 重定向
178 |
179 | HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服务器的 IP 地址之后,将该地址写入 HTTP 重定向报文中,状态码为 302。客户端收到重定向报文之后,需要重新向服务器发起请求。
180 |
181 | 缺点:
182 |
183 | - 需要两次请求,因此访问延迟比较高;
184 | - HTTP 负载均衡器处理能力有限,会限制集群的规模。
185 |
186 | 该负载均衡转发的缺点比较明显,实际场景中很少使用它。
187 |
188 | [](https://camo.githubusercontent.com/124d58ec51abb1cf896c63dac864b4896b67773c97a3dc11798932e57df19a7a/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30326131666266642d376139642d343131342d393564662d6361323434353538376131662e6a7067)
189 |
190 |
191 |
192 | #### 2. DNS 域名解析
193 |
194 | 在 DNS 解析域名的同时使用负载均衡算法计算服务器 IP 地址。
195 |
196 | 优点:
197 |
198 | - DNS 能够根据地理位置进行域名解析,返回离用户最近的服务器 IP 地址。
199 |
200 | 缺点:
201 |
202 | - 由于 DNS 具有多级结构,每一级的域名记录都可能被缓存,当下线一台服务器需要修改 DNS 记录时,需要过很长一段时间才能生效。
203 |
204 | 大型网站基本使用了 DNS 做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。也就是说,域名解析的结果为内部的负载均衡服务器 IP 地址。
205 |
206 | [](https://camo.githubusercontent.com/f6ea0c5df24149b784d104e6b6d68eb97ea53a5d9f6aa7f44b3155ac9d4dee6f/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f64326330373263632d386231372d343830632d383133652d3138636462336234623531662e6a7067)
207 |
208 |
209 |
210 | #### 3. 反向代理服务器
211 |
212 | 反向代理服务器位于源服务器前面,用户的请求需要先经过反向代理服务器才能到达源服务器。反向代理可以用来进行缓存、日志记录等,同时也可以用来做为负载均衡服务器。
213 |
214 | 在这种负载均衡转发方式下,客户端不直接请求源服务器,因此源服务器不需要外部 IP 地址,而反向代理需要配置内部和外部两套 IP 地址。
215 |
216 | 优点:
217 |
218 | - 与其它功能集成在一起,部署简单。
219 |
220 | 缺点:
221 |
222 | - 所有请求和响应都需要经过反向代理服务器,它可能会成为性能瓶颈。
223 |
224 | #### 4. 网络层
225 |
226 | 在操作系统内核进程获取网络数据包,根据负载均衡算法计算源服务器的 IP 地址,并修改请求数据包的目的 IP 地址,最后进行转发。
227 |
228 | 源服务器返回的响应也需要经过负载均衡服务器,通常是让负载均衡服务器同时作为集群的网关服务器来实现。
229 |
230 | 优点:
231 |
232 | - 在内核进程中进行处理,性能比较高。
233 |
234 | 缺点:
235 |
236 | - 和反向代理一样,所有的请求和响应都经过负载均衡服务器,会成为性能瓶颈。
237 |
238 | #### 5. 链路层
239 |
240 | 在链路层根据负载均衡算法计算源服务器的 MAC 地址,并修改请求数据包的目的 MAC 地址,并进行转发。
241 |
242 | 通过配置源服务器的虚拟 IP 地址和负载均衡服务器的 IP 地址一致,从而不需要修改 IP 地址就可以进行转发。也正因为 IP 地址一样,所以源服务器的响应不需要转发回负载均衡服务器,可以直接转发给客户端,避免了负载均衡服务器的成为瓶颈。
243 |
244 | 这是一种三角传输模式,被称为直接路由。对于提供下载和视频服务的网站来说,直接路由避免了大量的网络传输数据经过负载均衡服务器。
245 |
246 | 这是目前大型网站使用最广负载均衡转发方式,在 Linux 平台可以使用的负载均衡服务器为 LVS(Linux Virtual Server)。
247 |
248 | 参考:
249 |
250 | - [Comparing Load Balancing Algorithms](http://www.jscape.com/blog/load-balancing-algorithms)
251 | - [Redirection and Load Balancing](http://slideplayer.com/slide/6599069/#)
252 |
253 | ## 2. 分布式 Session 管理
254 |
255 | 当采用对HTTP请求进行复杂均衡处理时,统一客户端的多次请求可能被分发到不同的后台Server上进行处理,此时Server之间需要共享Session数据才能正确处理请求。分布式Session解决方案主要有以下四种:
256 |
257 | ### **粘性Session**
258 |
259 | 在负载均衡服务器上设置策略,对请求源IP进行哈希运算,将统一ip的请求都分发到同一服务器上进行处理。
260 |
261 | 如果某一台及其宕机,则部分用户无法完成业务处理(无法找到对应的有效机器)。
262 |
263 | 
264 |
265 | ### **Session同步/复制**
266 |
267 | 在服务器集群所在的局域网中通过发送广播来异步同步session数据。
268 |
269 | 这种方案较适合集群较小的场景,如果集群较大,可能导致很大的同步开销;用户访问量过大时可能导致应用服务器存储溢出。
270 |
271 | 
272 |
273 | ### **集中式Session管理**
274 |
275 | 可以使用Redis/数据库来集中存储session数据,每个服务器都将session数据存储到同一地方并从同一地方取session数据。
276 |
277 | 
278 |
279 | ### **客户端存储Session**
280 |
281 | 把session的内容全部存储在cookie中(区别于cookie中的sessionid),客户端每次请求的时候自动带上cookie,服务器解析其中的session内容,处理完后再修改session内容(如果有必要)并返回给客户端。
282 |
283 | 该方案增加了传输开销,同时也收到cookie大小限制。
284 |
285 |
286 |
287 | # 二、分布式一致性原理
288 |
289 | **分布式一致性**是指在分布式环境中引入数据复制后,不同数据节点之间可能出现的,并无法依靠计算机应用程序自身解决的数据不一致的情况。
290 |
291 | - **强一致性**:系统写入什么,读出来也是什么,用户体验好但是对系统性能影响大。
292 | - **弱一致性**:系统再写入成功后,不承诺可以立即读到写入的值(尽可能保证一定时间后达到一致)。
293 | - **最终一致性**:弱一致性的特例,系统会保证在一定时间内达到数据一致性的状态。
294 |
295 | ## 1 分布式理论
296 |
297 | - 集中式:高性能机器昂贵、且有单点故障问题。
298 | - 分布式:可以用多台廉价及其组成一个集群(各节点无主从之分、对等),要面临通信故障、网络故障、分布式事务等问题。
299 |
300 | **分布式系统需要在数据一致性和系统可用性之间进行权衡!**
301 |
302 | ### 1.1 CAP理论
303 |
304 | #### 一致性
305 |
306 | Consistency,要求数据的多个**副本之间保持一致**。在一致性需求下,如果一个数据发生更改,在其它所有节点应该能读到**最新的值**(强一致性)。
307 |
308 | > 如果副本和主数据之间断开连接或者为完成同步,为了保证分布式系统对外的数据一致性,于是选择不返回任何数据。不管客户端访问哪个节点,要么读到的都是同一份最新写入的数据,要么读取失败。
309 |
310 | #### 可用性
311 |
312 | Available,系统必须**一直处于可用状态**,对于用户的请求总是能在**指定时间**(超过指定时间则认为系统不可用)内返回结果。
313 |
314 | > 可用性和一致性会产生冲突,如果一个副本未和主数据同步时,它不能拒绝客户请求,因为这不满足可用性要求,此时他必须返回还未更新完成的数据(违背一致性)。不管客户端访问哪个非故障节点,都能得到响应数据,但不保证是同一份最新数据。
315 |
316 | #### 分区容错性
317 |
318 | Partition tolerance,分布式系统在遇到任何网络分区故障(网络区域之间通信故障,区域内部可以通信)时,仍然需要能够保持对外提供~~**一致性**和**可用性**~~的服务。
319 |
320 | > eg:当一个分布式系统由于通信故障被割裂成了两个分区,则两个分区均可独立为外界提供服务。实现这一要求的前提就是数据复制,而数据复制将带来一致性问题,一致性问题将引发可用性问题。
321 |
322 | 分布式系统只能同时满足CAP中的两个,**一般要求满足P**(如果不满足P,则分布式系统中只要一个节点故障则整个系统不可用),**在CA之间需求平衡。**所以,对于分布式系统,我们只能考虑当发生分区错误时(因为分区故障是一定会发生的),如何选择一致性和可用性。
323 |
324 | 参考 [CAP理论中的P到底是个什么意思? - 四猿外的回答 - 知乎](https://www.zhihu.com/question/54105974/answer/1643846752)
325 |
326 | ### 1.2 BASE理论
327 |
328 | BASE理论(基本可用Basically Available、软状态Soft state、最终一致性Eventually consistency)是对CAP中一致性和可用性权衡的结果。其核心思想是:**即使无法做到强一致性,但是每个应用可根据自身业务特点,采用一定的方法来使系统达到最终一致性**。
329 |
330 | #### 基本可用
331 |
332 | 分布式系统在出现不可预知的故障时,运行损失部分可用性(响应时间上损失(如变长),功能上损失(如服务暂时不可用))。
333 |
334 | #### 软状态
335 |
336 | 允许系统中的数据存在中间状态,即运行系统在不同节点的副本之间存在同步时延。
337 |
338 | #### 最终一致性
339 |
340 | 经过一段时间后,系统中的数据最终可以达到一致,不需要实时保证系统的强一致性。
341 |
342 | ### 1.3 ACID/CAP/BASE总结
343 |
344 | 
345 |
346 | ## 2 一致性协议
347 |
348 | 分布式系统中,每个节点只知道自己在进行事务提交成功或失败,但无法直到其他节点的事务提交情况。为了保持事务的ACID特性,需要引入协调者来统一调度分布式节点(参与者)。
349 |
350 | 协调者负责调度参与者的行为,并最终决定是否需要把事务真正进行提交,由此衍生出**两阶段提交**(2PC)和**三阶段提交**(3PC)两种一致性协议。
351 |
352 | ### 2.1 两阶段提交2PC协议
353 |
354 | #### 阶段1
355 |
356 | - 协调者向所有参与事务的节点发送事务内容,并询问是否可以提交
357 | - 各节点**执行事务**、记录undo(行记录日志)、redo log(物理页日志),并响应协调组执行结果(执行成功或失败)
358 | - 如果收到所有节点的YES则表示事务可以提交,否则(收到执行失败或者超时)事务不可执行
359 |
360 | #### 阶段2
361 |
362 | - 如果事务可以提交,协调者发送事务提交请求;否则发送回滚请求
363 | - 参与中如果收到提交/回滚请求,则提交/回滚事务,响应ACK给协调者
364 | - 协调者收到所有参与者的ACK后,完成事务提交;如果未收到ack(超时)的提示所有参与者回滚事务。
365 |
366 | #### 举例
367 |
368 | 
369 |
370 | #### 优缺点
371 |
372 | **优点**
373 |
374 | - 原理简单
375 | - 实现方便
376 |
377 | **缺点**
378 |
379 | - **同步阻塞**:每个参与者都需要等待其他参与者确认后才能继续下一步操作
380 | - **单点故障**:协调者如果损坏,则分布式事务完全无法工作
381 | - **[脑裂](https://www.jianshu.com/p/6ef23eb92ec6)**:网络或者故障的原因,只有部分节点完成了事务提交,整个分布式系统出现了数据不一致的现象。
382 | - **太过保守**:第二阶段只能靠超时来判断是否需要中断事务,没有完善的容错机制。
383 |
384 | ### 2.1.3 三阶段提交3PC协议
385 |
386 | 三阶段提交([3PC](https://www.cnblogs.com/zcjcsl/p/7989792.html)),是二阶段提交(2PC)的改进版本。与两阶段提交不同的是,三阶段提交有两个改动点。
387 |
388 | - 引入超时机制。同时在协调者和参与者中都引入超时机制。
389 | - 在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
390 |
391 | 也就是说,除了引入超时机制之外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有`CanCommit`(询问参与者是否可以执行事务)、`PreCommit`(协调者请求参与者执行事务)、`DoCommit`(协调者请求参与者提交事务)三个阶段。在第三阶段,**如果协调者故障了,参与者超时后会继续提交事务,不会形成阻塞、但是可能造成数据不一致**。
392 |
393 |
394 |
395 | ## 3 分布式共识
396 |
397 | [动画演示Raft算法](http://thesecretlivesofdata.com/raft/)
398 |
399 | [游戏操作演示](https://raft.github.io/)
400 |
401 | ### 3.1 分布式共识问题
402 |
403 | 多个节点对某一个问题达成一致。
404 |
405 | ### 3.2 Raft算法
406 |
407 | 主要是为了解决数据一致性问题,在分布式集群中,数据在多个节点上可能有多份副本,多份副本的数据应该保持一致的。
408 |
409 | Raft算法分为两步:领导人选举(执行数据修改的节点),数据复制(领导节点的数据复制到其他副本节点)。
410 |
411 | 在Raft算法中,节点可以充当三种角色:
412 |
413 | - **Follower**:领导节点的跟随节点,负责同步领导者节点的数据并保持心跳(监控领导者节点是否存活)
414 | - **Candidate**:候选者节点,当领导者节点还不存在或者故障时,候选/准备充当新的领导者的节点
415 | - **Leader**:领导节点,和Follower之间维持心跳,负责数据修改和插入。
416 |
417 | 
418 |
419 | #### 领导人选举
420 |
421 | **集群启动时,还没有领导者节点(全都是`Follower`节点);或在集群运行过程中领导者失效,此时需要进行领导者选举。**
422 |
423 | ##### 正常流程
424 |
425 | - Step1:每个节点都启动一个随机定时器`election timeout(150~300ms)`
426 | - Step2:超时的节点将变成`Candidate`发起选举请求(此时会重置election定时器),请求别的节点给自己投票做`Leader`,得票数超过一半则选举成功(自己会首先投自己)。
427 | - Step3:别的节点如果收到候选节点的选举请求,且:
428 | - 收到的任期大于等于当前记录的任期
429 | - 该任期内自己未投过票
430 | - 收到的候选节点的日志偏移量大于等于自身(说明日志便偏移小的节点不会成为Leader)
431 |
432 | 则投票给发起请求的候选节点,并开启一个新的election定时器。
433 |
434 |
435 | 
436 |
437 | 注意以下几点:
438 |
439 | - 每个节点在一个选举任期(由递增的任期号标识)内只有一次投票机会,这就保证了一个任期内只可能有一个节点得到过半票数
440 | - `Folower`在变成`Candidate`时,任期号加一;在收到别的比自己大的任期号时,则更新为大的任期号并**退化**成`Folower`。
441 |
442 | ##### 异常情况
443 |
444 | **①选举失败(未获得超过半数投票)**
445 |
446 | 由于网络时延已经定时器时长等原因,导致两个节点同时发起投票请求,且没有节点获得过半票数,此时选举失败,则等待Candidate节点(可能是之前选举失败的,也可能是别的先超时)新的随机定时器超时并开启新一轮选举(任期加一)。
447 |
448 | 
449 |
450 | 直到选举成功。
451 |
452 | #### 日志复制
453 |
454 | **日志复制是指将在Leader节点上做的数据改变同步到其它节点上。**
455 |
456 | ##### 正常流程
457 |
458 | - 客户端对`Leader`节点发起请求,更新数据
459 | - `Leader`节点将更新数据指令附带在心跳信息中交给`Follower`
460 | - `Flower`收到更新命令后响应`ACK`
461 | - `Leader`收到超过半数`ACK`后提交数据,响应客户端命令执行成功,同时也通知`Folower`提交数据(携带在心跳信息中)
462 |
463 | ##### 异常情况
464 |
465 | **①网络出现分区(脑裂)**
466 |
467 | - 如果网络出现割裂,将出现多个`Leader`(也可能只有一个,看分区中的节点能否得到半数投票)
468 |
469 | - 上半部分分区Leader可以获得超过半数响应,所以数据可以成功写入并提交,另一个分区则无法成功提交数据(此时不会响应客户端);两个分区内的数据变得不一致了。
470 |
471 | 
472 |
473 |
474 |
475 | - 当网络恢复时,其中一个Leader将会收到更大的任期值(Leader1一直都是`Leader`,网络故障后`Leader2`才被选为新`Leader`,所以`Leader2`的任期值大1),自动由`Leader`变成`Follower`,同时该分区内的节点回滚未提交的数据,和新的`Leader`完成数据同步。(分区恢复时,不会出现两个相同任期号的Leader同时存在的情况?)
476 |
477 | **②脑裂后恢复,日志不一致**
478 |
479 | S2/3脑裂后恢复,在收到另一个分区Leader心跳前先超时了,于是发起投票请求,但是最终S2/3都不可能当选为Leader(日志数据滞后,不会获得大多数投票)。
480 |
481 | 
482 |
483 | ### 3.3 Paxos算法
484 |
485 | 解决分布式共识问题的一个算法,难以理解,先不看了!
486 |
487 | # 三、网站高并发&高可用
488 |
489 | ## 1. 高可用
490 |
491 | ### 1.0 负载均衡
492 |
493 | 使用无状态服务器设计(如果有状态则需要分布式session管理),负载均衡,发生故障时进行故障转移。
494 |
495 | ### 1.1 熔断-
496 |
497 | 在服务的依赖调用中,被调用方出现故障时,出于自我保护的目的,**调用方会主动停止调用**,并根据业务需要进行相应处理。调用方这种主动停止调用的行为我们称之为熔断。
498 |
499 | ### 1.2 限流-
500 |
501 | 限流是针对服务请求数量的一种自我保护机制,当请求数量超出服务的处理能力时,会自动丢弃新来的请求。限流主要有以下几种算法:
502 |
503 | #### 固定窗口计数器算法
504 |
505 | 固定窗口计数器算法概念如下:
506 |
507 | - 将时间划分为多个窗口;
508 | - 在每个窗口内每有一次请求就将计数器加一;
509 | - 如果计数器超过了限制数量,则本窗口内后续所有的请求都被丢弃,当时间到达下一个窗口时,计数器重置。
510 |
511 | 
512 |
513 | 固定窗口计数器是最为简单的算法,但这个算法有时会让通过请求量允许为限制的两倍。考虑如下情况:限制 1 秒内最多通过 5 个请求,在第一个窗口的最后半秒内通过了 5 个请求,第二个窗口的前半秒内又通过了 5 个请求。这样看来就是在 1 秒内通过了 10 个请求。
514 |
515 | 
516 |
517 | #### 滑动窗口计数器
518 |
519 | 滑动窗口计数器算法概念如下:
520 |
521 | - 将时间划分为多个区间;
522 | - 在每个区间内每有一次请求就将计数器加一,维持一个占据多个区间的时间窗口;
523 | - 每经过一个区间的时间,则抛弃最老的一个区间,并纳入最新的一个区间;
524 | - 如果当前窗口内区间的请求计数总和超过了限制数量,则本窗口内后续所有的请求都被丢弃。
525 |
526 | 滑动窗口计数器是通过将窗口再细分,并且按照时间"滑动",这种算法避免了固定窗口计数器带来的双倍突发请求,当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。
527 |
528 | 
529 |
530 | #### 漏桶算法
531 |
532 | 漏桶算法概念如下:
533 |
534 | - 将每个请求视作"水滴"放入"漏桶"进行存储;
535 | - “漏桶"以固定速率向外"漏"出请求来执行,如果"漏桶"空了则停止"漏水”;
536 | - 如果"漏桶"满了则多余的"水滴"会被直接丢弃。
537 |
538 | 
539 |
540 | 漏桶算法多使用队列实现,服务的请求会存到队列中,服务的提供方则按照固定的速率从队列中取出请求并执行,过多的请求则放在队列中排队或直接拒绝。
541 |
542 | 漏桶算法的缺陷也很明显,当短时间内有大量的突发请求时,即便此时服务器没有任何负载,每个请求也都得在队列中等待一段时间才能被响应。(此时可以采用令牌桶算法)
543 |
544 | #### 令牌桶算法
545 |
546 | 恒定速度生成令牌,请求从桶内取令牌。
547 |
548 | 
549 |
550 | ### 1.3 降级-
551 |
552 | 降级是通过开关配置将某些不重要的业务功能屏蔽掉(如退款),以提高服务处理能力。在大促场景中经常会对某些服务进行降级处理,大促结束之后再进行复原。
553 |
554 | 
555 |
556 |
557 |
558 | ### 1.4 异步调用
559 |
560 |
561 |
562 | ### 1.5 幂等性设计
563 |
564 |
565 |
566 | ### 1.6 数据高可用
567 |
568 | 主从备份,CAP理论。
569 |
570 | ### 1.7 网站监控
571 |
572 | 网站需要有完善的监控机制,即使发现问题或者风险,利用监控数据优化设计。
573 |
574 | ## 2. 高性能
575 |
576 | ### 2.0 硬件优化
577 |
578 | 升级服务器本身的硬件,如CPU频率、个数、内存容量等。
579 |
580 | ### 2.1 缓存
581 |
582 | **优先考虑使用缓存来优化网站性能!**对于频繁服务,较少修改的数据,可以将其加入缓存中,以加快读取速度。
583 |
584 | 使用缓存时需要注意数据的不一致问题/脏读问题。
585 |
586 | ### 2.2 集群+负载均衡
587 |
588 | 通过在API网关(如nginx服务器)上运行负载均衡策略,将请求分散到多台机器上,减轻单台机器的处理压力。
589 |
590 | 对服务器进行分布式部署时,需要注意不能在服务器上保存会话信息,否则需要进行分布式session处理。
591 |
592 | 
593 |
594 | ### 2.3 异步操作
595 |
596 | 可以使用消息队列来完成异步处理,利用消息队列可以及时响应用户请求,其它处理可以先存储在消息队列中后续再进行,实现流量削峰的效果。
597 |
598 | 
599 |
600 | > eg:用户注册需要涉及到:将用户信息写入数据库、发送注册成功邮件通知、为用户开通各类权限 等步骤
601 | >
602 | > 在将用户写入数据库后即可返回响应注册请求,无需等待其余两个步骤完成,将用户信息写入消息队列,对应任务的服务从消息队列中取消息并进行相应的服务执行即可。
603 |
604 | ### 2.4 代码优化
605 |
606 | - 使用多线程
607 | - 使用高效的数据结构(如有序数组中二分查找比遍历更加高效)
608 |
609 | - 合理设计新生代和老年代大小,尽量避免Full GC
610 |
611 | # 四、单点登录SSO
612 |
613 | ## 1. 为什么需要单点登录
614 |
615 | web系统由**单系统发展成多系统组成的应用群**,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体。简单来说,单点登录就是**在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。**
616 |
617 | 
618 |
619 | **传统的基于Cookie和Session机制的登录认证方案在多系统中已经不再适用**(cookie和session无法跨域,且不同的Web后端对于该类机制的具体实现不同,无法通用)。
620 |
621 | ## 2. 如何实现单点登录
622 |
623 | ### 2.1 统一域名
624 |
625 | 如两个子系统分别在`sub1.a.com`和`sub2.a.com`部署,则这两个网站共享`a.com`这个域名,只需要设置cookie对同一域`a.com`生效,两个系统即可共享cookie.
626 |
627 | ### 2.2 CAS方案
628 |
629 | 统一域名的方案对域名要求较高,可以使用CAS(Central Authentication Server)方案实现更灵活的SSO。
630 |
631 | 以用户访问需要认证的`www.a.com/items`和`www.b.com/items`为例(认证中心为`www.sso.com`):
632 |
633 | #### 登录
634 |
635 | 
636 |
637 | Step1:用户访问`www.a.com/items`
638 |
639 | - `a.com`服务器检查发现用户未登录(cookie中无Token),让浏览器重定向到认证中心`www.sso.com`(携带参数`www.sso.com?redirectURL=www.a.com/items`)
640 | - `sso.com`服务器检查发现用户未登录则让用户浏览器跳转到登录界面进行登录
641 | - 用户浏览器提交登录用户名密码到`sso.com`
642 | - `sso.com`服务器验证用户密码正确,则给用户返回cookie(针对`sso.com`)和Token(针对`a.com`)
643 | - 用户浏览器利用`sso.com`返回的`redirectURL`和`Token`参数访问`www.a.com/items`
644 | - `a.com`服务器读取用户Token,请求`sso.com`对Token进行验证,验证成功则给用户响应对应的请求资源,同时将Token写入cookie(针对`www.a.com`)
645 |
646 | Step2:用户再次访问`www.a.com/items`
647 |
648 | - 用户请求自动携带`a.com`的cookie(内含Token)
649 | - `a.com`服务器读取用户Token,请求`sso.com`对Token进行验证,验证成功则给用户响应对应的请求资源
650 |
651 | Step3:用户访问`www.b.com/items`
652 |
653 | - `b.com`服务器检查发现用户未登录(cookie中无Token),让浏览器重定向到认证中心`www.sso.com`(携带参数`www.sso.com?redirectURL=www.b.com/items`)
654 | - `sso.com`服务器检查发现用户已登录(因为用户已经有针对`sso.com`的cookie了)则给用户返回Token(针对`b.com`)
655 | - 用户浏览器利用`sso.com`返回的`redirectURL`和`Token`参数访问`www.b.com/items`
656 | - `b.com`服务器读取用户Token,请求`sso.com`对Token进行验证,验证成功则给用户响应对应的请求资源,同时将Token写入cookie(针对`www.b.com`),**即已经实现免登录访问`b.com`!**
657 |
658 | #### 注销
659 |
660 | 如果用户在`a.com`下选择注销
661 |
662 | - 用户发送注销请求到`a.com`
663 | - `a.com`服务器重定向用户浏览器到`sso.com/logout`
664 | - `sso.com`服务器删除用户会话信息,清除cookie(针对`sso.com`)
665 |
666 | 此时用户后续再访问`a.com`或者`b.com`,在`a.com`或`b.com`服务器向`sso.com`进行Token合法性校验这一步将失败,重定向到登录界面!
667 |
668 | ### 参考文献
669 |
670 | [现在用的比较多的单点登录技术是什么? - 小知的回答 - 知乎](https://www.zhihu.com/question/342103776/answer/801359397)
671 |
672 | [什么是单点登录(SSO) - Java3y的文章 - 知乎](https://zhuanlan.zhihu.com/p/66037342)
673 |
--------------------------------------------------------------------------------
/4.MySQL 语法.md:
--------------------------------------------------------------------------------
1 | # SQL 语法
2 |
3 | * [SQL 语法](#sql-语法)
4 | * [一、基础](#一基础)
5 | * [二、创建表](#二创建表)
6 | * [三、修改表](#三修改表)
7 | * [四、插入](#四插入)
8 | * [五、更新](#五更新)
9 | * [六、删除](#六删除)
10 | * [七、查询](#七查询)
11 | * [DISTINCT](#distinct)
12 | * [LIMIT](#limit)
13 | * [八、排序](#八排序)
14 | * [九、过滤](#九过滤)
15 | * [十、通配符](#十通配符)
16 | * [十一、计算字段](#十一计算字段)
17 | * [十二、函数](#十二函数)
18 | * [汇总](#汇总)
19 | * [文本处理](#文本处理)
20 | * [日期和时间处理](#日期和时间处理)
21 | * [数值处理](#数值处理)
22 | * [十三、分组](#十三分组)
23 | * [十四、子查询](#十四子查询)
24 | * [十五、连接](#十五连接)
25 | * [内连接](#内连接)
26 | * [自连接](#自连接)
27 | * [自然连接](#自然连接)
28 | * [外连接](#外连接)
29 | * [十六、组合查询](#十六组合查询)
30 | * [十七、视图](#十七视图)
31 | * [十八、存储过程](#十八存储过程)
32 | * [十九、游标](#十九游标)
33 | * [二十、触发器](#二十触发器)
34 | * [二十一、事务管理](#二十一事务管理)
35 | * [二十二、字符集](#二十二字符集)
36 | * [二十三、权限管理](#二十三权限管理)
37 | * [参考资料](#参考资料)
38 |
39 |
40 |
41 | ## 一、基础
42 |
43 | 模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。
44 |
45 | 主键的值不允许修改,也不允许复用(不能将已经删除的主键值赋给新数据行的主键)。
46 |
47 | SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。
48 |
49 | SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。
50 |
51 | SQL 支持以下三种注释:
52 |
53 | ```sql
54 | ## 注释
55 | SELECT *
56 | FROM mytable; -- 注释
57 | /* 注释1
58 | 注释2 */
59 | ```
60 |
61 | 数据库创建与使用:
62 |
63 | ```sql
64 | CREATE DATABASE test;
65 | USE test;
66 | ```
67 |
68 | ## 二、创建表
69 |
70 | ```sql
71 | CREATE TABLE mytable (
72 | # int 类型,不为空,自增
73 | id INT NOT NULL AUTO_INCREMENT,
74 | # int 类型,不可为空,默认值为 1,不为空
75 | col1 INT NOT NULL DEFAULT 1,
76 | # 变长字符串类型,最长为 45 个字符,可以为空
77 | col2 VARCHAR(45) NULL,
78 | # 日期类型,可为空
79 | col3 DATE NULL,
80 | # 设置主键为 id
81 | PRIMARY KEY (`id`));
82 | ```
83 |
84 | ## 三、修改表
85 |
86 | 添加列
87 |
88 | ```sql
89 | ALTER TABLE mytable
90 | ADD col CHAR(20);
91 | ```
92 |
93 | 删除列
94 |
95 | ```sql
96 | ALTER TABLE mytable
97 | DROP COLUMN col;
98 | ```
99 |
100 | 删除表
101 |
102 | ```sql
103 | DROP TABLE mytable;
104 | ```
105 |
106 | ## 四、插入
107 |
108 | 普通插入
109 |
110 | ```sql
111 | INSERT INTO mytable(col1, col2)
112 | VALUES(val1, val2);
113 | ```
114 |
115 | 插入检索出来的数据
116 |
117 | ```sql
118 | INSERT INTO mytable1(col1, col2)
119 | SELECT col1, col2
120 | FROM mytable2;
121 | ```
122 |
123 | 将一个表的内容插入到一个新表
124 |
125 | ```sql
126 | CREATE TABLE newtable AS
127 | SELECT * FROM mytable;
128 | ```
129 |
130 | ## 五、更新
131 |
132 | ```sql
133 | UPDATE mytable
134 | SET col = val
135 | WHERE id = 1;
136 | ```
137 |
138 | ## 六、删除
139 |
140 | `delete`删除满足条件的数据行。会写入undo日志,可以回滚。
141 |
142 | ```sql
143 | DELETE FROM mytable
144 | WHERE id = 1;
145 | ```
146 |
147 | `TRUNCATE`删除所有行(清空表),不删除表结构定义。无法回滚。
148 |
149 | ```sql
150 | TRUNCATE TABLE mytable;
151 | ```
152 |
153 | `DROP`删除整张表,清空所有行数据的同时也会删除表结构定义。
154 |
155 | ```sql
156 | DROP TABLE mytable;
157 | ```
158 |
159 | 使用更新和删除操作时一定要用 WHERE 子句,不然会把整张表的数据都破坏。可以先用 SELECT 语句进行测试,防止错误删除。
160 |
161 | ## 七、查询
162 |
163 | ### DISTINCT
164 |
165 | 相同值只会出现一次。它作用于所有列,也就是说所有列的值都相同才算相同。
166 |
167 | ```sql
168 | SELECT DISTINCT col1, col2
169 | FROM mytable;
170 | ```
171 |
172 | ### LIMIT
173 |
174 | 限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。
175 |
176 | 返回前 5 行:
177 |
178 | ```sql
179 | SELECT *
180 | FROM mytable
181 | LIMIT 5;
182 | ```
183 |
184 | ```sql
185 | SELECT *
186 | FROM mytable
187 | LIMIT 0, 5;
188 | ```
189 |
190 | 返回第 3 \~ 5 行:
191 |
192 | ```sql
193 | SELECT *
194 | FROM mytable
195 | LIMIT 2, 3;
196 | ```
197 |
198 | ## 八、排序
199 |
200 | - **ASC** :升序(默认)
201 | - **DESC** :降序
202 |
203 | 可以按多个列进行排序,并且为每个列指定不同的排序方式:
204 |
205 | ```sql
206 | SELECT *
207 | FROM mytable
208 | ORDER BY col1 DESC, col2 ASC;
209 | ```
210 |
211 | ## 九、过滤
212 |
213 | 不进行过滤的数据非常大,导致通过网络传输了多余的数据,从而浪费了网络带宽。因此尽量使用 SQL 语句来过滤不必要的数据,而不是传输所有的数据到客户端中然后由客户端进行过滤。
214 |
215 | ```sql
216 | SELECT *
217 | FROM mytable
218 | WHERE col IS NULL;
219 | ```
220 |
221 | 下表显示了 WHERE 子句可用的操作符
222 |
223 | | 操作符 | 说明 |
224 | | :---: | :---: |
225 | | = | 等于 |
226 | | < | 小于 |
227 | | > | 大于 |
228 | | <> != | 不等于 |
229 | | <= !> | 小于等于 |
230 | | >= !< | 大于等于 |
231 | | BETWEEN | 在两个值之间 |
232 | | IS NULL | 为 NULL 值 |
233 |
234 | 应该注意到,NULL 与 0、空字符串都不同。
235 |
236 | **AND 和 OR** 用于连接多个过滤条件。优先处理 AND,当一个过滤表达式涉及到多个 AND 和 OR 时,可以使用 () 来决定优先级,使得优先级关系更清晰。
237 |
238 | **IN** 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。
239 |
240 | **NOT** 操作符用于否定一个条件。
241 |
242 | ## 十、通配符
243 |
244 | 通配符也是用在过滤语句中,但它只能用于文本字段。
245 |
246 | - **%** 匹配 \>=0 个任意字符;
247 |
248 | - **\_** 匹配 ==1 个任意字符;
249 |
250 | - **[ ]** 可以匹配集合内的字符,例如 [ab] 将匹配字符 a 或者 b。用脱字符 ^ 可以对其进行否定,也就是不匹配集合内的字符。
251 |
252 | 使用 Like 来进行通配符匹配。
253 |
254 | ```sql
255 | SELECT *
256 | FROM mytable
257 | WHERE col LIKE '[^AB]%'; -- 不以 A 和 B 开头的任意文本
258 | ```
259 |
260 | 不要滥用通配符,通配符位于开头处匹配会非常慢。
261 |
262 | ## 十一、计算字段
263 |
264 | 在数据库服务器上完成数据的转换和格式化的工作往往比客户端上快得多,并且转换和格式化后的数据量更少的话可以减少网络通信量。
265 |
266 | 计算字段通常需要使用 **AS** 来取别名,否则输出的时候字段名为计算表达式。
267 |
268 | ```sql
269 | SELECT col1 * col2 AS alias
270 | FROM mytable;
271 | ```
272 |
273 | **CONCAT()** 用于连接两个字段。许多数据库会使用空格把一个值填充为列宽,因此连接的结果会出现一些不必要的空格,使用 **TRIM()** 可以去除首尾空格。
274 |
275 | ```sql
276 | SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col
277 | FROM mytable;
278 | ```
279 |
280 | ## 十二、函数
281 |
282 | 各个 DBMS 的函数都是不相同的,因此不可移植,以下主要是 MySQL 的函数。
283 |
284 | ### 汇总
285 |
286 | |函 数 |说 明|
287 | | :---: | :---: |
288 | | AVG() | 返回某列的平均值 |
289 | | COUNT() | 返回某列的行数 |
290 | | MAX() | 返回某列的最大值 |
291 | | MIN() | 返回某列的最小值 |
292 | | SUM() |返回某列值之和 |
293 |
294 | AVG() 会忽略 NULL 行。
295 |
296 | 使用 DISTINCT 可以汇总不同的值。
297 |
298 | ```sql
299 | SELECT AVG(DISTINCT col1) AS avg_col
300 | FROM mytable;
301 | ```
302 |
303 | ### 文本处理
304 |
305 | | 函数 | 说明 |
306 | | :---: | :---: |
307 | | LEFT() | 左边的字符 |
308 | | RIGHT() | 右边的字符 |
309 | | LOWER() | 转换为小写字符 |
310 | | UPPER() | 转换为大写字符 |
311 | | LTRIM() | 去除左边的空格 |
312 | | RTRIM() | 去除右边的空格 |
313 | | LENGTH() | 长度 |
314 | | SOUNDEX() | 转换为语音值 |
315 |
316 | 其中, **SOUNDEX()** 可以将一个字符串转换为描述其语音表示的字母数字模式。
317 |
318 | ```sql
319 | SELECT *
320 | FROM mytable
321 | WHERE SOUNDEX(col1) = SOUNDEX('apple')
322 | ```
323 |
324 | ### 日期和时间处理
325 |
326 |
327 | - 日期格式:YYYY-MM-DD
328 | - 时间格式:HH:\MM:SS
329 |
330 | |函 数 | 说 明|
331 | | :---: | :---: |
332 | | ADDDATE() | 增加一个日期(天、周等)|
333 | | ADDTIME() | 增加一个时间(时、分等)|
334 | | CURDATE() | 返回当前日期 |
335 | | CURTIME() | 返回当前时间 |
336 | | DATE() |返回日期时间的日期部分|
337 | | DATEDIFF() |计算两个日期之差|
338 | | DATE_ADD() |高度灵活的日期运算函数|
339 | | DATE_FORMAT() |返回一个格式化的日期或时间串|
340 | | DAY()| 返回一个日期的天数部分|
341 | | DAYOFWEEK() |对于一个日期,返回对应的星期几|
342 | | HOUR() |返回一个时间的小时部分|
343 | | MINUTE() |返回一个时间的分钟部分|
344 | | MONTH() |返回一个日期的月份部分|
345 | | NOW() |返回当前日期和时间|
346 | | SECOND() |返回一个时间的秒部分|
347 | | TIME() |返回一个日期时间的时间部分|
348 | | YEAR() |返回一个日期的年份部分|
349 |
350 | ```sql
351 | mysql> SELECT NOW();
352 | ```
353 |
354 | ```
355 | 2018-4-14 20:25:11
356 | ```
357 |
358 | ### 数值处理
359 |
360 | | 函数 | 说明 |
361 | | :---: | :---: |
362 | | SIN() | 正弦 |
363 | | COS() | 余弦 |
364 | | TAN() | 正切 |
365 | | ABS() | 绝对值 |
366 | | SQRT() | 平方根 |
367 | | MOD() | 余数 |
368 | | EXP() | 指数 |
369 | | PI() | 圆周率 |
370 | | RAND() | 随机数 |
371 |
372 | ## 十三、分组
373 |
374 | 把具有相同的数据值的行放在同一组中。
375 |
376 | 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。
377 |
378 | 指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序。
379 |
380 | ```sql
381 | SELECT col, COUNT(*) AS num
382 | FROM mytable
383 | GROUP BY col;
384 | ```
385 |
386 | GROUP BY 自动按分组字段进行排序,ORDER BY 也可以按汇总字段来进行排序。
387 |
388 | ```sql
389 | SELECT col, COUNT(*) AS num
390 | FROM mytable
391 | GROUP BY col
392 | ORDER BY num;
393 | ```
394 |
395 | WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤。
396 |
397 | ```sql
398 | SELECT col, COUNT(*) AS num
399 | FROM mytable
400 | WHERE col > 2
401 | GROUP BY col
402 | HAVING num >= 2;
403 | ```
404 |
405 | 分组规定:
406 |
407 | - GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前;
408 | - 除了汇总字段外,SELECT 语句中的每一字段都必须在 GROUP BY 子句中给出;
409 | - NULL 的行会单独分为一组;
410 | - 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。
411 |
412 | ## 十四、子查询
413 |
414 | 子查询中只能返回一个字段的数据。
415 |
416 | 可以将子查询的结果作为 WHRER 语句的过滤条件:
417 |
418 | ```sql
419 | SELECT *
420 | FROM mytable1
421 | WHERE col1 IN (SELECT col2
422 | FROM mytable2);
423 | ```
424 |
425 | 下面的语句可以检索出客户的订单数量,子查询语句会对第一个查询检索出的每个客户执行一次:
426 |
427 | ```sql
428 | SELECT cust_name, (SELECT COUNT(*)
429 | FROM Orders
430 | WHERE Orders.cust_id = Customers.cust_id)
431 | AS orders_num
432 | FROM Customers
433 | ORDER BY cust_name;
434 | ```
435 |
436 | ## 十五、连接
437 |
438 | 连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。
439 |
440 | 连接可以替换子查询,并且比子查询的效率一般会更快。
441 |
442 | 可以用 AS 给列名、计算字段和表名取别名,给表名取别名是为了简化 SQL 语句以及连接相同表。
443 |
444 | ### 内连接
445 |
446 | 内连接又称等值连接,使用 INNER JOIN 关键字。
447 |
448 | ```sql
449 | SELECT A.value, B.value
450 | FROM tablea AS A INNER JOIN tableb AS B
451 | ON A.key = B.key;
452 | ```
453 |
454 | 可以不明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中要连接的列用等值方法连接起来。
455 |
456 | ```sql
457 | SELECT A.value, B.value
458 | FROM tablea AS A, tableb AS B
459 | WHERE A.key = B.key;
460 | ```
461 |
462 | ### 自连接
463 |
464 | 自连接可以看成内连接的一种,只是连接的表是自身而已。
465 |
466 | 一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。
467 |
468 | 子查询版本
469 |
470 | ```sql
471 | SELECT name
472 | FROM employee
473 | WHERE department = (
474 | SELECT department
475 | FROM employee
476 | WHERE name = "Jim");
477 | ```
478 |
479 | 自连接版本
480 |
481 | ```sql
482 | SELECT e1.name
483 | FROM employee AS e1 INNER JOIN employee AS e2
484 | ON e1.department = e2.department
485 | AND e2.name = "Jim";
486 | ```
487 |
488 | ### 自然连接
489 |
490 | 自然连接是把同名列通过等值测试连接起来的,同名列可以有多个。
491 |
492 | 内连接和自然连接的区别:内连接提供连接的列,而自然连接自动连接所有同名列。
493 |
494 | ```sql
495 | SELECT A.value, B.value
496 | FROM tablea AS A NATURAL JOIN tableb AS B;
497 | ```
498 |
499 | ### 外连接
500 |
501 | 外连接保留了没有关联的那些行。分为左外连接,右外连接以及全外连接,左外连接就是保留左表没有关联的行。
502 |
503 | 检索所有顾客的订单信息,包括还没有订单信息的顾客。
504 |
505 | ```sql
506 | SELECT Customers.cust_id, Customer.cust_name, Orders.order_id
507 | FROM Customers LEFT OUTER JOIN Orders
508 | ON Customers.cust_id = Orders.cust_id;
509 | ```
510 |
511 | customers 表:
512 |
513 | | cust_id | cust_name |
514 | | :---: | :---: |
515 | | 1 | a |
516 | | 2 | b |
517 | | 3 | c |
518 |
519 | orders 表:
520 |
521 | | order_id | cust_id |
522 | | :---: | :---: |
523 | |1 | 1 |
524 | |2 | 1 |
525 | |3 | 3 |
526 | |4 | 3 |
527 |
528 | 结果:
529 |
530 | | cust_id | cust_name | order_id |
531 | | :---: | :---: | :---: |
532 | | 1 | a | 1 |
533 | | 1 | a | 2 |
534 | | 3 | c | 3 |
535 | | 3 | c | 4 |
536 | | 2 | b | Null |
537 |
538 | ## 十六、组合查询
539 |
540 | 使用 **UNION** 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行。
541 |
542 | 每个查询必须包含相同的列、表达式和聚集函数。
543 |
544 | 默认会去除相同行,如果需要保留相同行,使用 UNION ALL。
545 |
546 | 只能包含一个 ORDER BY 子句,并且必须位于语句的最后。
547 |
548 | ```sql
549 | SELECT col
550 | FROM mytable
551 | WHERE col = 1
552 | UNION
553 | SELECT col
554 | FROM mytable
555 | WHERE col =2;
556 | ```
557 |
558 | ## 十七、视图
559 |
560 | 视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。
561 |
562 | 对视图的操作和对普通表的操作一样。
563 |
564 | 视图具有如下好处:
565 |
566 | - 简化复杂的 SQL 操作,比如复杂的连接;
567 | - 只使用实际表的一部分数据;
568 | - 通过只给用户访问视图的权限,保证数据的安全性;
569 | - 更改数据格式和表示。
570 |
571 | ```sql
572 | CREATE VIEW myview AS
573 | SELECT Concat(col1, col2) AS concat_col, col3*col4 AS compute_col
574 | FROM mytable
575 | WHERE col5 = val;
576 | ```
577 |
578 | ## 十八、存储过程
579 |
580 | 存储过程可以看成是对一系列 SQL 操作的批处理。
581 |
582 | 使用存储过程的好处:
583 |
584 | - 代码封装,保证了一定的安全性;
585 | - 代码复用;
586 | - 由于是预先编译,因此具有很高的性能。
587 |
588 | 命令行中创建存储过程需要自定义分隔符,因为命令行是以 ; 为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符,造成语法错误。
589 |
590 | 包含 in、out 和 inout 三种参数。
591 |
592 | 给变量赋值都需要用 select into 语句。
593 |
594 | 每次只能给一个变量赋值,不支持集合的操作。
595 |
596 | ```sql
597 | delimiter //
598 |
599 | create procedure myprocedure( out ret int )
600 | begin
601 | declare y int;
602 | select sum(col1)
603 | from mytable
604 | into y;
605 | select y*y into ret;
606 | end //
607 |
608 | delimiter ;
609 | ```
610 |
611 | ```sql
612 | call myprocedure(@ret);
613 | select @ret;
614 | ```
615 |
616 | ## 十九、游标
617 |
618 | 在存储过程中使用游标可以对一个结果集进行移动遍历。
619 |
620 | 游标主要用于交互式应用,其中用户需要对数据集中的任意行进行浏览和修改。
621 |
622 | 使用游标的四个步骤:
623 |
624 | 1. 声明游标,这个过程没有实际检索出数据;
625 | 2. 打开游标;
626 | 3. 取出数据;
627 | 4. 关闭游标;
628 |
629 | ```sql
630 | delimiter //
631 | create procedure myprocedure(out ret int)
632 | begin
633 | declare done boolean default 0;
634 |
635 | declare mycursor cursor for
636 | select col1 from mytable;
637 | # 定义了一个 continue handler,当 sqlstate '02000' 这个条件出现时,会执行 set done = 1
638 | declare continue handler for sqlstate '02000' set done = 1;
639 |
640 | open mycursor;
641 |
642 | repeat
643 | fetch mycursor into ret;
644 | select ret;
645 | until done end repeat;
646 |
647 | close mycursor;
648 | end //
649 | delimiter ;
650 | ```
651 |
652 | ## 二十、触发器
653 |
654 | 触发器会在某个表执行以下语句时而自动执行:DELETE、INSERT、UPDATE。
655 |
656 | 触发器必须指定在语句执行之前还是之后自动执行,之前执行使用 BEFORE 关键字,之后执行使用 AFTER 关键字。BEFORE 用于数据验证和净化,AFTER 用于审计跟踪,将修改记录到另外一张表中。
657 |
658 | INSERT 触发器包含一个名为 NEW 的虚拟表。
659 |
660 | ```sql
661 | CREATE TRIGGER mytrigger AFTER INSERT ON mytable
662 | FOR EACH ROW SELECT NEW.col into @result;
663 |
664 | SELECT @result; -- 获取结果
665 | ```
666 |
667 | DELETE 触发器包含一个名为 OLD 的虚拟表,并且是只读的。
668 |
669 | UPDATE 触发器包含一个名为 NEW 和一个名为 OLD 的虚拟表,其中 NEW 是可以被修改的,而 OLD 是只读的。
670 |
671 | MySQL 不允许在触发器中使用 CALL 语句,也就是不能调用存储过程。
672 |
673 | ## 二十一、事务管理
674 |
675 | 基本术语:
676 |
677 | - 事务(transaction)指一组 SQL 语句;
678 | - 回退(rollback)指撤销指定 SQL 语句的过程;
679 | - 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
680 | - 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。
681 |
682 | 不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。
683 |
684 | MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。
685 |
686 | 设置 autocommit 为 0 可以取消自动提交;autocommit 标记是针对每个连接而不是针对服务器的。
687 |
688 | 如果没有设置保留点,ROLLBACK 会回退到 START TRANSACTION 语句处;如果设置了保留点,并且在 ROLLBACK 中指定该保留点,则会回退到该保留点。
689 |
690 | ```sql
691 | START TRANSACTION
692 | // ...
693 | SAVEPOINT delete1
694 | // ...
695 | ROLLBACK TO delete1
696 | // ...
697 | COMMIT
698 | ```
699 |
700 | ## 二十二、字符集
701 |
702 | 基本术语:
703 |
704 | - 字符集为字母和符号的集合;
705 | - 编码为某个字符集成员的内部表示;
706 | - 校对字符指定如何比较,主要用于排序和分组。
707 |
708 | 除了给表指定字符集和校对外,也可以给列指定:
709 |
710 | ```sql
711 | CREATE TABLE mytable
712 | (col VARCHAR(10) CHARACTER SET latin COLLATE latin1_general_ci )
713 | DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci;
714 | ```
715 |
716 | 可以在排序、分组时指定校对:
717 |
718 | ```sql
719 | SELECT *
720 | FROM mytable
721 | ORDER BY col COLLATE latin1_general_ci;
722 | ```
723 |
724 | ## 二十三、权限管理
725 |
726 | MySQL 的账户信息保存在 mysql 这个数据库中。
727 |
728 | ```sql
729 | USE mysql;
730 | SELECT user FROM user;
731 | ```
732 |
733 | **创建账户**
734 |
735 | 新创建的账户没有任何权限。
736 |
737 | ```sql
738 | CREATE USER myuser IDENTIFIED BY 'mypassword';
739 | ```
740 |
741 | **修改账户名**
742 |
743 | ```sql
744 | RENAME USER myuser TO newuser;
745 | ```
746 |
747 | **删除账户**
748 |
749 | ```sql
750 | DROP USER myuser;
751 | ```
752 |
753 | **查看权限**
754 |
755 | ```sql
756 | SHOW GRANTS FOR myuser;
757 | ```
758 |
759 | **授予权限**
760 |
761 | 账户用 username@host 的形式定义,username@% 使用的是默认主机名。
762 |
763 | ```sql
764 | GRANT SELECT, INSERT ON mydatabase.* TO myuser;
765 | ```
766 |
767 | **删除权限**
768 |
769 | GRANT 和 REVOKE 可在几个层次上控制访问权限:
770 |
771 | - 整个服务器,使用 GRANT ALL 和 REVOKE ALL;
772 | - 整个数据库,使用 ON database.\*;
773 | - 特定的表,使用 ON database.table;
774 | - 特定的列;
775 | - 特定的存储过程。
776 |
777 | ```sql
778 | REVOKE SELECT, INSERT ON mydatabase.* FROM myuser;
779 | ```
780 |
781 | **更改密码**
782 |
783 | 必须使用 Password() 函数进行加密。
784 |
785 | ```sql
786 | SET PASSWROD FOR myuser = Password('new_password');
787 | ```
788 |
789 | ## 参考资料
790 |
791 | - BenForta. SQL 必知必会 [M]. 人民邮电出版社, 2013.
792 |
--------------------------------------------------------------------------------
/7.计算机网络相关笔记.md:
--------------------------------------------------------------------------------
1 | # 计算机网络相关知识
2 |
3 |
4 |
5 | * [计算机网络相关知识](#计算机网络相关知识)
6 | * [0 底层](#0-底层)
7 | * [网络层](#网络层)
8 | * [1 传输层](#1-传输层)
9 | * [1.1 TCP与UDP的区别](#11-tcp与udp的区别)
10 | * [1.2 三次握手和四次挥手](#12-三次握手和四次挥手)
11 | * [为什么要三次挥手?](#为什么要三次挥手)
12 | * [为什么要四次挥手?](#为什么要四次挥手)
13 | * [服务端出现大量CLOSE_WAIT/TIME_WAIT状态?](#服务端出现大量close_waittime_wait状态)
14 | * [1.3 TCP SYN攻击](#13-tcp-syn攻击)
15 | * [1.4 TCP如何保证可靠传输](#14-tcp如何保证可靠传输)
16 | * [1.5 TCP的拥塞控制](#15-tcp的拥塞控制)
17 | * [经典Reno算法](#经典reno算法)
18 | * [BBR算法](#bbr算法)
19 | * [Vegas算法](#vegas算法)
20 | * [1.6 TCP流量控制](#16-tcp流量控制)
21 | * [1.7 TCP发起连接方发起连接后被连接方没accept能传数据么?](#17-tcp发起连接方发起连接后被连接方没accept能传数据么)
22 | * [1.8 TCP Fast Open](#18-tcp-fast-open)
23 | * [1.9 TCP半连接](#19-tcp半连接)
24 | * [1.10 TCP支持哪些参数](#110-tcp支持哪些参数)
25 | * [1.11 TCP的窗口大小和MSS的关系](#111-tcp的窗口大小和mss的关系)
26 | * [1.12 TCP的缺陷](#112-tcp的缺陷)
27 | * [1.13 UDP的缺陷](#113-udp的缺陷)
28 | * [1.14 TCP/UDP Socket服务端不存在时会怎么处理?](#114-tcpudp-socket服务端不存在时会怎么处理)
29 | * [1.15 TCP最大连接数](#115-tcp最大连接数)
30 | * [2 应用层](#2-应用层)
31 | * [=====Session======](#session)
32 | * [Session和Cookie的区别](#session和cookie的区别)
33 | * [分布式Session/Session共享解决方案](#分布式sessionsession共享解决方案)
34 | * [Session怎么存储?](#session怎么存储)
35 | * [======HTTP======](#http)
36 | * [HTTP消息结构](#http消息结构)
37 | * [一次HTTP请求中发生了什么?](#一次http请求中发生了什么)
38 | * [HTTP和HTTPS的区别?](#http和https的区别)
39 | * [HTTP 1.0,1.1,2.0 的主要区别?](#http-101120-的主要区别)
40 | * [HTTP 1.1比HTTP 1.0新增的功能](#http-11比http-10新增的功能)
41 | * [HTTP 2.0比HTTP 1.X新增的功能](#http-20比http-1x新增的功能)
42 | * [HTTP状态码](#http状态码)
43 | * [HTTP的 GET 和 POST 的区别?](#http的-get-和-post-的区别)
44 | * [HTTP 和 TCP 的KEEP_ALIVE机制的区别](#http-和-tcp-的keep_alive机制的区别)
45 | * [=======DNS=======](#dns)
46 | * [DNS解析的基本流程?](#dns解析的基本流程)
47 | * [DNS使用什么传输层协议?](#dns使用什么传输层协议)
48 | * [DNS劫持是什么?](#dns劫持是什么)
49 | * [WebSocket是如何传输的?](#websocket是如何传输的)
50 | * [RestFul 是什么?RestFul URL的特点?](#restful-是什么restful-url的特点)
51 | * [3 网络安全](#3-网络安全)
52 | * [XSS(跨站脚本攻击)](#xss跨站脚本攻击)
53 | * [CSRF(跨站请求伪造攻击)](#csrf跨站请求伪造攻击)
54 | * [SQL注入](#sql注入)
55 | * [RSA AES CA](#rsa-aes-ca)
56 | * [数字签名 VS 数字证书](#数字签名-vs-数字证书)
57 | * [4 QUIC协议](#4-quic协议)
58 | * [4.1 QUIC要解决的问题](#41-quic要解决的问题)
59 | * [4.1.1 TCP的队首阻塞](#411-tcp的队首阻塞)
60 | * [4.1.2 HTTPS握手时延大](#412-https握手时延大)
61 | * [4.1.3 网络切换需要重新握手](#413-网络切换需要重新握手)
62 | * [4.2 QUIC原理](#42-quic原理)
63 | * [4.2.1 建立连接](#421-建立连接)
64 | * [4.2.2 传输数据](#422-传输数据)
65 | * [4.2.3 关闭连接](#423-关闭连接)
66 | * [4.3 QUIC好处](#43-quic好处)
67 | * [4.4 建立在QUIC上的HTTP/2](#44-建立在quic上的http2)
68 | * [5 CDN相关知识](#5-cdn相关知识)
69 | * [6 DNS相关知识](#6-dns相关知识)
70 | * [7 HTTP优化建议](#7-http优化建议)
71 |
72 |
73 |
74 | ## 0 底层
75 |
76 | ### 网络层
77 |
78 | **网络层用于实现主机之间跨网(物理链路)转发和交付。**
79 |
80 | IP分组头部格式
81 |
82 | 
83 |
84 | 
85 |
86 | **版本**:4位,指定IP协议的版本号。
87 |
88 | **首部长度**(IHL):4位,IP协议包头的长度,指明IPv4协议包头长度的字节数包含多少个32位。由于IPv4的包头可能包含可变数量的可选 项,所以这个字段可以用来确定IPv4数据报中数据部分的偏移位置。IPv4包头的最小长度是20个字节,因此IHL这个字段的最小值用十进制表示就是5 (5x4 = 20字节)。就是说,它表示的是包头的总字节数是4字节的倍数。
89 |
90 | **服务类型(QoS)**:定义IP协议包的处理方法,它包含如下子字段
91 |
92 | 过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
93 |
94 | 延迟字段:1位,取值:0(正常)、1(期特低的延迟)
95 |
96 | 流量字段:1位,取值:0(正常)、1(期特高的流量)
97 |
98 | 可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
99 |
100 | 成本字段:1位,取值:0(正常)、1(期特最小成本)
101 |
102 | 未使用:1位
103 |
104 | **长度**:IP包的总长
105 |
106 | **标识**:唯一标识一个IP分组的序号(防止重复)。
107 |
108 | **标志**:是一个3位的控制字段,包含:
109 |
110 | 保留位:1位
111 |
112 | 不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段)
113 |
114 | 更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)
115 |
116 |
117 | **段偏移量**:当数据分组时,它和更多段位(MF, More fragments)进行连接,帮助目的主机将分段的包组合。
118 |
119 | **TTL:**表示数据包在网络上生存多久,每通过一个路由器该值减一,为0时将被路由器丢弃。
120 |
121 | **协议**:8位,这个字段定义了IP数据报的数据部分使用的协议类型。常用的协议及其十进制数值包括ICMP(1)、TCP(6)、UDP(17)。
122 |
123 | **校验和**:16位,是IPv4数据报包头的校验和。
124 |
125 | 源IP地址:
126 |
127 | 目的IP地址:
128 |
129 | ## 1 传输层
130 |
131 | **传输层为应用层提供服务,用于实现进程到进程之间的通信,同时可以实现流量/拥塞/差错控制等。**
132 |
133 | ### 1.1 TCP与UDP的区别
134 |
135 | - TCP有连接,UDP无连接协议;TCP只能点对点,UDP可以点对多点通信。
136 | - 延迟和开销不同(TCP头部最少20字节,UDP只有8字节),UDP处理简单
137 | - TCP面向字节流传输,UDP面向用户数据报传输;这就要求应用层做不同处理(TCP存在粘包/拆包问题)
138 | - TCP可以实现按序、可靠交付,UDP不保证上述特性
139 | - TCP可实现流量控制、拥塞控制、差错控制,UDP无法实现(只提供简单的校验和)
140 | - 适用场景:
141 | - **UDP**:应用层数据较短(超过65535Byte则需要拆分成多个UDP,应用层需要自行控制顺序并合并分组)、不要求绝对可靠性(可在应用层做可靠性保证)、要求低时延。eg:DNS、RIP、DHCP、实时音视频流等多播协议。
142 | - **TCP**:文件传输等,eg:SSH、FTP
143 |
144 | 
145 |
146 | 两种协议的首部格式:
147 |
148 | 
149 |
150 | > - UDP最大数据长度为65535-28(sendto函数如果传入数据超过阈值则返回错误),长度过大则IP层会分包,一个fragment分组传送有问题,整个package消息就会丢弃。
151 | >
152 | > - TCP接收窗口最大为65535,发送窗口取决于min(拥塞窗口, 对端的接收窗口)。
153 |
154 | ### 1.2 三次握手和四次挥手
155 |
156 | 
157 |
158 | > - 三次握手中,`ACK.SEQ=SYN.SEQ+ 1`,SYN/SYN+ACK报文虽然未携带数据,但是它消耗一个序号,后续数据传输起始序号为`SYN.SEQ+1`
159 | > - ACK报文如果不携带数据则不消耗序号
160 | > - 四次挥手中,FIN也会消耗一个序号值,所以对方回应的`ACK.SEQ = FIN.SEQ + 1`
161 |
162 | #### 为什么要三次挥手?
163 |
164 | 为了确保对方收发正常:
165 |
166 | - 第一次握收:客户端发SYN请求建连;服务端收到后可确认**客户端发送正常**
167 | - 第二次握手:服务端响应SYN+ACK;客户端收到后可以确认**服务端收发正常**
168 | - 第三次握手:客户端收到SYN+ACK,响应ACK;服务端收到后可以确认**客户端接收正常**
169 |
170 | 为什么还要第三次握手,而不是两次?
171 |
172 | - 三次握手不是TCP本身的要求, 而是为了满足"**在不可靠信道上可靠地传输信息**"这一需求所导致的。三次通信是达成该需求所需的最小值。
173 |
174 | - 为了防止已经失效的SYN连接请求再次到达对端,引发错误(造成资源浪费)。
175 |
176 | > 第一个SYN延迟过大,客户端重发SYN并成功和服务端建立连接、完成数据传输、关闭连接;之后旧的SYN才到达,服务端误以为客户端又重新建立了连接,继续为该连接分配Socket资源。
177 |
178 | 握手时需要协商哪些东西?
179 |
180 | - MSS:最大报文段,一般在**选项字段**中,一般来说该值和底层物理网MTU值一致(MTU - IP头 - TCP头 = 1500-20-20=1460byte)
181 | - SEQ:初始传输序号,一般是一个随机值
182 | - RWND:接收窗口大小,在后两次握手中发给对方本端的接收窗口大小(和本端的buffer大小有关)
183 |
184 | #### 为什么要四次挥手?
185 |
186 | TCP的连接是全双工的,所以连接的拆除需要单独将两个通道分别拆除,而四次挥手所做的事情就是**拆除两条通道**和**释放资源**,**确认对端都完成数据发送并关闭收发**:
187 |
188 | - 第一次挥手:客户端发送FIN;服务端收到后确认客户端发送关闭,此时客户端依旧可以接收数据
189 | - 第二次挥手:服务端响应ACK;客户端收到后确认服务端接收关闭,此时服务端依旧可以发送数据
190 | - 第三次挥手:服务端发送FIN;客户端收到后确认服务端发送关闭
191 | - 第四次挥手:客户端响应ACK;服务端收到后确认客户端接收关闭
192 |
193 | 二三次挥手为什么能否合并?
194 |
195 | - 不能,服务端收到FIN后可能还需要继续发送数据。
196 |
197 | 为何需要在TIME-WAIT状态继续等到2MSL(最大报文段寿命、参考TTL)再进入CLOSING状态?
198 |
199 | - 防止最后一个ACK丢失导致连接无法正常断开:如果客户端在收到FIN并回复ACK后立即进入CLOSING状态,当ACK丢失,服务端将重新发送FIN,此时客户端无法再响应ACK,服务器将一直无法关闭连接(2MSL就是为了确保重发的FIN可以顺利收到并重新响应ACK所设计)。
200 | - 为使旧的数据包在网络因过期而消失:假设当前有一条TCP连接因某些原因,我们先关闭,接着很快以相同的四元组建立一条新连接,此时服务端无法感知到这是一个新连接,旧连接的数据包延迟到达后可能被错误的交到新的应用层。
201 |
202 | > MSL为最大报文生存时间,Windows/Linux/Unix为2min/60s/30s。
203 |
204 | #### 服务端出现大量CLOSE_WAIT/TIME_WAIT状态?
205 |
206 | - 服务端出现大量CLOSE_WAIT状态说明已经收到客户端的FIN并响应ACK,而一直处于该状态说明一直有数据要发(大概率是上层的应用程序处理逻辑有问题)。
207 |
208 | - 服务端出现大量TIME_WAIT状态说明短时间内有大量客户端成功断连(**服务端主动断连**),2MSL计时器还未结束,可以考虑修改系统参数`net.ipv4.tcp_tw_recycle = 1`和`net.ipv4.tcp_tw_reuse = 1`来加快回收/重用socket资源。
209 |
210 | > 项目中出现服务端大量ESTABLISHED状态,因为ns3仿真系统直接ctrl+c关闭,未发FIN/RST来通知服务端关闭连接;考虑开启keep-alive机制,但是默认时间较长为2h(75s x 10次)、且该机制不是标准协议的一部分ns-3不支持,最终决定应用层自己实现心跳机制。
211 |
212 | ### 1.3 TCP SYN攻击
213 |
214 | - **是什么**:SYN攻击是指客户端(或者伪造源IP)短时间内大量发起TCP连接请求(发SYN),但是在收到服务端的SYN+ACK后不回复ACK(如果伪造源IP则SYN+ACK将丢失),此时服务端短时间内会被消耗大量资源(为每一个TCP连接分配传送控制块TCB以及各种定时器)。
215 | - **预防**:
216 | - **回收半连接**:优化主机系统设置如降低SYN timeout时间,使得主机尽快释放半连接的占用;
217 | - **采用SYN cookie设置**:服务端收到第一个SYN后不做任何资源分配和存储,*将构成连接状态的最基本数据编码压缩(如对五元组做哈希、编码MSS最大报文段长度值)进SYN-ACK的序列号比特位里附带在SYN中*,收到合法的ACK后解析标识信息再进行资源分配;[参考资料](https://segmentfault.com/a/1190000019292140)
218 | - 如果短时间内收到了某个IP的重复SYN请求,我们就认为受到了攻击;
219 | - **防火墙**:采用防火墙设置等外部网络也可以进行拦截。
220 |
221 | ### 1.4 TCP如何保证可靠传输
222 |
223 | 校验和+序号/确认+自动重传+拥塞控制+流量控制。
224 |
225 | **【校序重流拥】**
226 |
227 | **校验和**:TCP首部有16bit校验和,用来计算数据包的位相加的结果,如果校验和校验失败则接受方丢弃分组。
228 |
229 | **序号+重传**:借助SEQ+ACK需要来完成分组确认,如果发送端有分组未被ACK确认(RTO超时或收到三个重复ACK)则立即重传该丢失分组重传。
230 |
231 | **流量控制**:收发双方都有接收/发送窗口,如归对端窗口被填满,则本端将停止/减缓发送速度,以减少丢包。
232 |
233 | **拥塞控制**:当TCP检测到网络发生拥塞时(一般采用ACK来辅助判断),则减缓数据发送数据,以减少丢包。
234 |
235 | ### 1.5 TCP的拥塞控制
236 |
237 | #### 经典Reno算法
238 |
239 | 
240 |
241 | TCP拥塞控制主要是通过调整发送窗口的大小来完成的。主要分为以下几个阶段:
242 |
243 | - **慢启动-指数增大SS**:该阶段窗口值指数增大。从一个MSS(最大报文段长度)开始,每确认一个报文段,则窗口增大一个MSS,直到达到门限值。
244 | - **拥塞避免-加法增大AI**:慢启动达到门限值后,为了避免增大过快导致拥塞,所以开始加法增大,每当整个窗口的报文段都被确认后才将窗口增大1。
245 | - **拥塞检测-乘法减小MD**:当拥塞发生(RTO超时或收到三个重复ACK),则开始进行拥塞避免:
246 | - RTO超时:重传计时器超时,发生拥塞的可能性较大,此时将拥塞窗口大小设为1,慢启动门限降低一半,重新开始慢启动过程
247 | - 收到三个重复ACK:收到三个重复ACK说明后续重传的重复分组已经到达了(某个报文段被丢弃,但是后续报文段成功到达),发生拥塞的可能性较小,此时执行**快重传+快恢复**
248 | - **快重传**:发送端不必等RTO超时,只要收到三个重复ACK则立刻重传未确认数据。
249 | - **快恢复**:发端收到三个重复ACK时,窗口门限降为当前的一半,窗口大小变成新门限值,开始拥塞避免阶段(加法增加)
250 |
251 | > 本端发送窗口大小 = Min [ rwnd, cwnd ] // 对端接收窗口、本端拥塞窗口中的较小者。
252 | >
253 | > 适用于低延时、低带宽的网络。
254 |
255 | #### BBR算法
256 |
257 | 传统的拥塞控制算法是计算cwnd值(利用丢包/ACK来计算)来规定当前可以发送多少数据,但是并不关注以什么样的速度发送数据。如果简单而粗暴地将窗口大小(send.cwnd、recv.cwnd的最小值)数据全部突发出去,这往往会造成路由器的排队,在深队列的情况下,会测量出rtt剧烈地抖动。bbr在计算cwnd的同时,还计算了一个与之适配的pacing rate(利用RTT和),该pacing rate规定cwnd指示的一窗数据的数据包之间,**以多大的时间间隔发送出去**。
258 |
259 | #### Vegas算法
260 |
261 | Vegas将时延 RTT 的增加作为网络出现拥塞的信号,RTT 增加,拥塞窗口减小,RTT 减小,拥塞窗口增加。具体来说,Vegas 通过比较实际吞吐量和期望吞吐量来调节拥塞窗口的大小,
262 |
263 | 
264 |
265 | ### 1.6 TCP流量控制
266 |
267 | **原因**:为了防止发送方发送过快,接受方处理不过来导致缓存溢出或丢包。
268 |
269 | **做法**:接收方在收到数据回复ACK时携带接收窗口大小值(代表接收缓存区大小)给发送方,如果该值为0则发送方停止发送,直到接受方回复大于0的窗口值则继续发送。
270 |
271 | ### 1.7 TCP发起连接方发起连接后被连接方没accept能传数据么?
272 |
273 | **可以**,即使服务端未调用Accept,内核依旧可以完成三次握手(`accept()`只是将Accept队列中的套接字拷贝到用户空间而已),并接收数据(数据存在内核缓冲区中,需要用户调用`recv()`取出,否则缓冲区满):
274 |
275 | 
276 |
277 | > - SYN队列:半连接队列,默认1024大小。
278 | > - ACCEPTE队列:全连接队列。
279 |
280 | ### 1.8 TCP Fast Open
281 |
282 | TCP快速打开是对TCP的一种简化握手手续的拓展,用于提高两端点间连接的打开速度。当TCP开启了快速打开选项:
283 |
284 | - 在服务端响应SYN+ACK时会带上一个Cookie值,客户端收到后保存,正常三次握手;
285 | - 当客户端下次重新连接服务器时,SYN中带上Cookie选项,服务端验证Cookie合法性后直接开始传送数据。
286 |
287 | 
288 |
289 | [标准定义rfc7413 (ietf.org)](https://datatracker.ietf.org/doc/html/rfc7413)
290 |
291 | ### 1.9 TCP半连接
292 |
293 | **全连接队列**存放的是已经完成 3次握手,等待应用层调用 `accept()` 处理这些连接;
294 |
295 | **半连接队列**,当服务端收到客户端的 SYN 包后,并且回复 SYN+ACK包后,服务端进入 SYN_RECV 状态,此时这种连接称为半连接,会被存放到半连接队列;
296 |
297 | 当完成 3 次握手之后,tcp 会把这个连接**从半连接队列中移到全连接队列**,然后等待应用层处理。
298 |
299 | ### 1.10 TCP支持哪些参数
300 |
301 | 建立连接相关参数
302 |
303 | - tcp_syn_retries:默认是5(180s左右)
304 | - tcp_synack_retries:默认是5
305 |
306 | 关闭连接相关参数
307 |
308 | - tcp_fin_timeout:主动断连方在FIN_WAIT2状态的空闲超时时间(对方可能来不及发FIN就被kill了)。
309 | - tcp_max_tw_buckets:保持TIME_WAIT(四次挥手完毕后等2MSL)的最大TCP连接数
310 | - tcp_tw_recycle:是否开启TCP连接中TIME-WAIT sockets的快速回收
311 | - tcp_tw_reuse:是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
312 |
313 | KEEPALIVE相关参数
314 |
315 | - tcp_keepalive_time:打开心跳机制后,如果连接上无数据,服务端发送心跳包的间隔,默认7200s
316 | - tcp_keepalive_probes:TCP发送keepalive探测以确定该连接已经断开的次数,默认是9
317 | - tcp_keepalive_intvl:探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有心跳响应的连接杀除的时间。默认值为75秒,即没有心跳活动的连接将在大约11分钟以后将被丢弃。
318 |
319 | 其它:
320 |
321 | - tcp_syncookies
322 | - tcp_sack
323 | - tcp_window_scaling:窗口缩放选项(如缩放因子值为1.5),可以将窗口有2^16=65535扩大一定倍数。
324 |
325 | ### 1.11 TCP的窗口大小和MSS的关系
326 |
327 | - 发送窗口大小 = min(对端接收窗口大小rwnd, 本端拥塞窗口大小cwnd),最大为2^16=65535B,如果支持窗口缩放选项则可增加到1GB
328 | - MSS:最大报文段长度(TCP交给IP的最大分段长度),取决于底层的MTU,如以太网中MTU=1500,除去20字节的IP和20字节的TCP头部,则MSS为1460字节
329 | - 初始拥塞窗口大小CWND为4段(后续优化成10段),即4x1460B=5.7KB
330 |
331 | ### 1.12 TCP的缺陷
332 |
333 | - 队首阻塞
334 | - 拥塞控制(慢启动)影响吞吐量,不适合短连接(增大初始拥塞窗口为10,禁用慢启动,重用TCP连接,窗口缩放)
335 | - 握手时延大(TCP Fast Open)
336 |
337 | ### 1.13 UDP的缺陷
338 |
339 | - UDP无状态,在面临NAT转换时,转换器必须维护状态表(TCP有自己的状态变换机制和握手机制,NAT可以利用它的机制来维护表项)。
340 | - UDP在NAT下很难实现P2P(NAT表项可能随时过期,需要手动维持双向心跳以刷新表项)
341 |
342 | 解决方法:
343 |
344 | - 借助公网服务器获取客户端映射后的外网地址和IP
345 | - 利用公网服务器中转流量
346 | - 结合以上两者
347 |
348 | ### 1.14 TCP/UDP Socket服务端不存在时会怎么处理?
349 |
350 | **TCP**
351 |
352 | 当客户端尝试和服务端的某个端口(改端口没有TCP在监听)建立连接时,当服务端收到SYN后将立即回复**RST端口不可达报文**,且RST分组的数据部分为原始SYN分组的IP层及其以上的数据。
353 |
354 | 
355 |
356 | **UDP**
357 |
358 | UDP Scoket如果给服务端的某个端口发送数据(该端口没有UDP在监听),则对端将返回**ICMP端口不可达消息**(`icmp destination unreachable`),ICMP的数据部分为原始UDP分组IP层及其以上的数据。
359 |
360 | 
361 |
362 | ### 1.15 TCP最大连接数
363 |
364 | 主要受到以下结果方面的限制:
365 |
366 | **文件描述符数量**:Linux中单个进程允许打开的文件描述符数量默认为1024,无论是客户端还是服务端,**每一个TCP连接都要占用一个文件描述符**(使用`ulimit -n`可以查看/或临时修改,可以在配置文件中做永久修改)。
367 |
368 | **端口数量限制**:每一个TCP套接字都需要占用一个端口,系统可用端口从1~65535,其中1~1024为系统保留端口。
369 |
370 | **系统性能限制**:系统的CPU和内存等硬件限制也会限制TCP连接数,连接数太大系统可能无法处理;同时系统需要为每一个连接分配TCP控制块(TCB),单个控制块占用1KB内存。
371 |
372 | 对于服务端套接字,只占用一个端口,但是每接受一个客户端连接则需要为其分配一个套接字,所以最大连接数主要受到文件描述符数量和系统性能限制;对于客户端套接字,每建立一个连接都需要申请一个文件描述符和一个端口号,所以客户端连接限制主要受到上述三个因素影响。
373 |
374 |
375 |
376 | ## 2 应用层
377 |
378 | ### =====Session======
379 |
380 | ### Session和Cookie的区别
381 |
382 | 两者是为了应对HTTP协议无状态的问题,用来跟踪浏览器用户身份的会话方式。
383 |
384 | - **存储位置**:Session对应的内容存储在服务器端(Tomcat底层将sessionid中包含的用户信息自动存储到了内存/磁盘中,不同Web服务器的session实现有所不同),cookie内容存储在客户端浏览器中。
385 | - **内容**:Cookie一般用来保存用户信息(k-v形式),而session只是一串id标识,服务端通过sessionid来查询之前保存的session数据信息。
386 | - **安全性**:一般来说Session要更安全,因为真正的信息存储在服务端,session只用作用户和用户数据的关联;而cookie在存储敏感信息时往往需要加密后写入cookie,之后在服务端解密。
387 |
388 | > Session实际上是存储在Cookie内的(以`sessionid`的属性存在),如果浏览器禁用cookie,则可以将`sessionid`放在URL中进行传递。
389 |
390 | **Session+Cookie结合使用**:
391 |
392 | 
393 |
394 | - 用户提交身份信息(包含用户名密码等)
395 | - 服务端验证用户身份信息,验证成功则生成一个sessionid存储到数据库中(常用Redis),同时将sessionid写入cookie(需要设置过期时间)返回给用户
396 | - 用户发起其它请求时,自动带上cookie
397 | - 服务端读取cookie中的session信息,验证用户身份成功后响应用户
398 |
399 | ### 分布式Session/Session共享解决方案
400 |
401 | 当采用对HTTP请求进行复杂均衡处理时,统一客户端的多次请求可能被分发到不同的后台Server上进行处理,此时Server之间需要共享Session数据才能正确处理请求。分布式Session解决方案主要有以下四种:
402 |
403 | **粘性Session**:在负载均衡服务器上设置策略,对请求源IP进行哈希运算,将统一ip的请求都分发到同一服务器上进行处理。
404 |
405 | **Session同步/复制**:在服务器集群所在的局域网中通过发送广播来异步同步session数据。
406 |
407 | **集中式Session管理**:可以使用Redis/数据库来集中存储session数据,每个服务器都将session数据存储到同一地方并从同一地方取session数据。
408 |
409 | 
410 |
411 | ~~**客户端存储Session**~~:即cookie?
412 |
413 | ### Session怎么存储?
414 |
415 | 不同Web服务器实现机制不一样!
416 |
417 | ### ======HTTP======
418 |
419 | ### HTTP消息结构
420 |
421 | HTTP是基于客户端/服务端(C/S)的架构模型。
422 |
423 | 客户端发送一个HTTP请求到服务器的请求消息包括以下格式:**请求行**(request line)、**请求头部**(header)、**空行**和**请求数据**四个部分组成,请求报文的一般格式
424 |
425 | 
426 |
427 | HTTP响应也由四个部分组成,分别是:**状态行**、**消息报头**、**空行**和**响应正文**。
428 |
429 | 
430 |
431 | ### 一次HTTP请求中发生了什么?
432 |
433 | 从**传输层及应用层**来看,主要过程如下:
434 |
435 | 1. **DNS 解析**:浏览器查询 DNS,获取域名对应的 IP 地址。具体过程包括:
436 | - 浏览器搜索自身的 DNS 缓存
437 | - 找本机的host文件
438 | - 路由器缓存
439 | - 向本地 DNS 服务器进行查询等(见DNS的查询过程)。
440 | 2. **TCP 连接**:浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立TCP连接,发起三次握手;
441 | 3. **发送 HTTP 请求**:TCP 连接建立起来后,浏览器向服务器发送 HTTP 请求;
442 | 4. **服务器处理请求并返回 HTTP 报文**:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
443 | 5. **浏览器解析渲染页面**:浏览器解析并渲染视图,若遇到对 js 文件、css 文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
444 | 6. **连接结束。**
445 |
446 | 从**传输层及其下层**来看:
447 |
448 | 1. 发DNS请求时依次使用UDP/IP进行封装,使用ARP进行IP地址到MAC地址的映射,IP分组被传递到网关
449 | 2. 发HTTP请求时依次使用TCP/IP进行封装,使用ARP进行IP到MAC地址的映射,IP分组被传递到网关
450 | 3. IP分组从网关出来后,通过路由转发(OSPF/RIP等)最终到达对应的目标服务器上;目的服务器响应也是类似的过程。
451 |
452 | ### HTTP和HTTPS的区别?
453 |
454 | - **构成**:HTTPS = HTTP + SSL/TSL(会话层加密协议)。
455 | - **安全性**:HTTP为明文传输,HTTPS为加密传输,HTTPS更加安全。
456 | - **默认端口**:HTTP的默认端口为80(TCP),HTTPS的默认端口为443(TCP或基于UDP的QUIC)。
457 | - **建连时延**:HTTP连接建立比HTTPS更简单,只需要TCP三次握手后即可传输HTTP报文;而HTTPS除了TCP三次握手,还需要SSL/TSL握手才可以进行加密HTTP报文传输。
458 | - **其它**:TSL的CA证书收费、加密解密消耗系统资源。
459 |
460 | 
461 |
462 | > TSL如何应对中间人攻击?
463 | >
464 | > - 场景:在TSL握手过程中,第三方截取来自服务器的公钥,替换成伪造的公钥发给客户端,最终在客户端和服务端之间分别握手,变成中间人,以解密客户端和服务端的数据。
465 | >
466 | > 
467 | >
468 | > - 应对手段:采用可行的第三方可信证书(包含第三方权威机构对服务器公钥的签名),证书中的签名是不可被篡伪造的
469 | > - 可信的第三方对服务器给出的公钥进行hash处理得到摘要H,利用可信三方自身的私钥加密H得到签名
470 | > - 服务器将公钥和权威机构对公钥的签名一起发给客户端
471 | > - 客户端根据内置的可信证书中包含的可信三方的公钥对签名进行解密得到H2,对公钥进行hash得到H1,检查H1和H2是否相等即可知道公钥是否已经被篡改。
472 |
473 | ### HTTP 1.0,1.1,2.0 的主要区别?
474 |
475 | #### HTTP 1.1比HTTP 1.0新增的功能
476 |
477 | **长连接机制***
478 |
479 | HTTP 1.0时期,每次请求一个HTTP资源都有新建一个TCP连接,请求完毕后关闭TCP连接,这将造成**很大的时延**,同时由于TCP慢启动过程的存在而**降低整体传输速率**(慢启动还没结束资源就传完了)。
480 |
481 | HTTP 1.1引入长连接机制(请求头增加Connection:Keep-alive字段),**多次HTTP请求可以复用一个TCP连接**,降低传输时延,消除TCP慢启动阶段的低速率影响。
482 |
483 | **管道机制***
484 |
485 | 在长连接机制下,浏览器需要按照FIFO的顺序来依次发送HTTP请求(收到一个响应后再发下一个请求);而管道机制的引入,将FIFO放在服务端进行(服务端同时处理多个请求,但是**按顺序响应**),可以减少整体往返时延。
486 |
487 | 
488 |
489 | > HTTP 1.1的的管道机制存在**队首阻塞**问题,在服务端,即使下一个请求资源已经就绪,还是得等前一个请求资源返回后才能发送,如果前一个请求响应慢或者无响应,将阻塞后续所有的请求响应。
490 | >
491 | > 即不支持多路复用!
492 |
493 | **节约带宽**
494 |
495 | HTTP 1.1支持POST请求值发送请求头Header而先不发送请求体Body,如果服务器鉴定客户端请求出错/无权访问,则直接返回401(有权则返回100 `Continue Status`),客户端无需传输Body到服务端,节约带宽。
496 |
497 | #### HTTP 2.0比HTTP 1.X新增的功能
498 |
499 | **二进制帧**
500 |
501 | HTTP 1.X时代,HTTP的数据都是采用字符串文本的方式进行传输(使用换行符进行分割)。而HTTP 2.0引入二进制帧格式,在一个TCP信道上传输多个流(逻辑信道,用ID标识,可以和一对HTTP请求/响应对应),流上传输逻辑消息(一次HTTP请求/响应);消息被拆分成多个二进制帧(如HEADER帧、DATA帧、PING帧等)进行传输。
502 |
503 | 
504 |
505 | **多路复用**
506 |
507 | 二进制帧的引入可以使得客户端/服务端把HTTP请求分解为互不依赖的帧,然后乱序发送,最后在对端进行重新组合(可以用数据流ID等来进行标识一次请求/响应);实现连接的多路复用,消除了**队首阻塞**作用!
508 |
509 | > 即好**几个HTTP请求或响应**(一对请求/响应为一个流,一个请求/响应被分成多个消息,一个消息分成多个帧)**可以混在一起传输,在对端进行拼接**。
510 |
511 | > **HTTP2.0并没有消除TCP的队首阻塞问题**!!!只是消除了HTTP1.1的队首阻塞(服务端短时间先后收到两个请求后,只能等第一个请求响应结束后才能继续响应下一个)问题。
512 |
513 | 
514 |
515 | **首部压缩**
516 |
517 | 用HPACK算法对header的数据进行压缩,同时基本单位是**二进制帧流**,这样的数据占用空间更少,在网络上传输就会更快。
518 |
519 | **服务端推送**
520 |
521 | 同SPDY一样,HTTP2.0也具有server push功能,客户端一次请求,服务端可以根据预测响应多份资源(客户端缓存资源后可直接从本地加载,无需再次请求)。
522 |
523 | ### HTTP状态码
524 |
525 | 
526 |
527 | ```text
528 | ### 成功状态码 #####################################
529 | 200 OK 请求正常处理完毕
530 | 204 No Content 请求成功处理,没有实体的主体返回
531 | 206 Partial Content GET范围请求已成功处理
532 |
533 | ### 重定向状态码 ####################################
534 | 301 Moved Permanently 久重定向,资源已永久分配新URI
535 | 302 Found 临时重定向,资源已临时分配新URI
536 | 303 See Other 临时重定向,期望使用GET定向获取
537 | 304 Not Modified 发送的附带条件请求未满足
538 | 307 Temporary Redirect 临时重定向,POST不会变成GET
539 |
540 | ### 客户端错误状态码 #################################
541 | 400 Bad Request 请求报文语法错误或参数错误
542 | 401 Unauthorized 要通过HTTP认证,或认证失败
543 | 403 Forbidden 请求资源被拒绝
544 | 404 Not Found 无法找到请求资源(服务器无理由拒绝)、参数错误
545 |
546 | ### 服务端错误状态码 #################################
547 | 500 Internal Server Error 服务器内部故障或Web应用故障
548 | 502 Bad Gateway 服务器作为网关或代理,从上游服务器收到无效响应。
549 | 503 Service Unavailable 服务器超负载或停机维护
550 | ```
551 |
552 | ### HTTP的 GET 和 POST 的区别?
553 |
554 | | 操作方式 | 数据位置 | 明文/密文 | 数据安全 | 幂等性 | 长度限制 | 应用场景 |
555 | | :------: | -------- | --------- | -------- | ------ | ------------ | -------- |
556 | | GET | HTTP包头 | 明文 | 安全 | 幂等 | 长度较小 | 查询数据 |
557 | | POST | HTTP正文 | 明文密文 | 不安全 | 不幂等 | 支持较大数据 | 修改数据 |
558 |
559 | 本质区别:GET 只是一次 HTTP请求,POST 先发请求头再发请求体(HTTP1.0之后),实际上是两次请求。
560 |
561 | - **参数位置**:GET请求的参数/数据放在URL(请求头)上,POST的放在请求体中;
562 | - **功能**:GET一般用来查询数据,POST一般用来新增数据;
563 | - **安全性**:POST 的安全性要比 GET 的安全性高,因为 GET 请求提交的数据将明文出现在 URL 上,而且 POST 请求参数则被包装到请求体中,相对更安全;
564 | - **长度限制**:GET 请求的长度受限于浏览器或服务器对 URL 长度的限制,允许发送的数据量比较小,而 POST 请求一般是没有大小限制的。
565 |
566 | > get请求中也可以携带body,但是标准中不建议加body,不保证所有的实现都支持(2014 年以前的规范中要求 GET 请求如果有 body,则 body 必须被忽略(虽然不一定报错,但 body 会被忽略);现在没有这个限制了。)。
567 | >
568 | > 且一般来说任何应用都不应让 GET 请求修改服务端的状态。
569 |
570 | ### HTTP 和 TCP 的KEEP_ALIVE机制的区别
571 |
572 | HTTP 1.1默认开启keep-alive机制:HTTP服务端在一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。
573 |
574 | TCP的keep-alive机制:TCP服务端为了检测客户端是否在线,定期发送空的TCP分组(心跳)到客户端,如果客户多次未响应则发RST关闭连接。
575 |
576 | ### =======DNS=======
577 |
578 | ### DNS解析的基本流程?
579 |
580 | 分为`递归解析`和`迭代解析`两种方式(具体使用哪种取决于DNS客户主机的请求)。
581 |
582 | 1. 主机向本地域名服务器的查询一般都是采用**递归查询**。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向**根域名服务器**继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的 IP 地址。
583 |
584 | 
585 |
586 | 2. 本地域名服务器向根域名服务器的查询的**迭代查询**。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。**根域名服务器通常是把自己知道的顶级域名服务器的 IP 地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询**。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的 IP 地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,本地域名服务器得到了所要解析的 IP 地址或报错,然后把这个结果返回给发起查询的主机。
587 |
588 | 
589 |
590 | ### DNS使用什么传输层协议?
591 |
592 | DNS 可以使用 **UDP 或者 TCP** 进行传输,使用的端口号都为 **53**。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:
593 |
594 | - 如果返回的响应超过的 **512 字节**(UDP 最大只支持 512 字节的数据)
595 | - **区域传送**(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据,相当于数据库中的Master和Slaver主从备份)
596 |
597 | ### DNS劫持是什么?
598 |
599 | DNS劫持是互联网攻击的一种方式,通过攻击/伪造DNS服务器的方法,把目标网站域名解析到错误的IP地址从而实现用户无法访问目标网站的目的 或者 蓄意或恶意要求用户访问指定IP地址(网站)的目的。
600 |
601 | > 比如利用DNS截止可以禁止用户访问国外网站,利用DNS截止可以让用户在访问正常网站时重定向到各种恶意网站。
602 |
603 | ### WebSocket是如何传输的?
604 |
605 | 
606 |
607 | - Websocket握手阶段基于HTTP,也是采用80端口。
608 | - **握手完毕后采用TCP进行双向通信**(WSS则是基于TSL+TCP),支持文本和二进制数据的传输。
609 | - 中途采用PING/PONG包来维持进行心跳维持。
610 |
611 | ### RestFul 是什么?RestFul URL的特点?
612 |
613 | Restful编写接口的结构协议,RestFul URL(URL中不可出现动词)是面向资源的,可以唯一标识和定位资源。用`GET/POST/PUT/DELETE`请求动作来定义对资源的获取/新增/修改/删除。
614 |
615 | ## 3 网络安全
616 |
617 | ### XSS(跨站脚本攻击)
618 |
619 | 让浏览器执行网站本不存在的js代码(攻击者植入的代码,比如在文本框输入``)。
620 |
621 | 
622 |
623 | **后果**:可能造成用户cookie被窃取、流量劫持和恶意跳转。
624 |
625 | **防范**:对输入框中的内容进行过滤(比如滤去标签)、对`>`等符号进行转义和编码。使用HttpOnly,即浏览器禁止页面JavaScript访问带有HttpOnly属性的Cookie。
626 |
627 | ### CSRF(跨站请求伪造攻击)
628 |
629 | 用户登录A网站并取得cookie.
630 |
631 | 用户访问B网站,无意间对A网站中发起请求(可能是转账请求,该请求会自动带上A完整的合法cookie),完成攻击。
632 |
633 |
634 |
635 | **防范**:
636 |
637 | - **服务器进行源地址检查**:通过检查请求来源,验证其合法性,如只允许自己的网站的请求(eg:图片防盗链,只允许自己的网页请求图片)。
638 | - **使用验证码**:对关键操作进行图形验证码或手机短信验证码的验证
639 | - **表单TOKEN**:CSRF是一种伪造请求,通过在提交表单中加入随机Token来防止伪造请求,随机Token由之前正常响应中获取的。
640 |
641 | ### SQL注入
642 |
643 | 注入攻击主要有两种形式,SQL注入攻击和OS注入攻击。SQL注入攻击的原理如图8.3所示。攻击者在HTTP请求中注入恶意SQL命令(drop table users;),服务器用请求参数构造数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。
644 |
645 | **例1**:
646 |
647 | 正常请求`http://localhost/sqliabs/Less-1/?id=3`,后台执行SQL`select username,password from table where id =3`
648 |
649 | 构造攻击请求 `http://localhost/sqliabs/Less-1/?id=3 or 1 = 1`,后台会执行`select username,password from table where id =3 or 1 = 1`
650 |
651 | **例2**:
652 |
653 | 
654 |
655 | **防范**
656 |
657 | - 请求参数过滤。通过正则匹配,过滤请求数据中可能注入的SQL,如`drop table`、`\b(?:update\b.*?\bset|delete\b\W*?\bfrom)\b`等。
658 | - 参数绑定:使用预编译手段,绑定参数是最好的防SQL注入方法。目前许多数据访问层框架,如MyBatis,Hibernate等,都实现SQL预编译和参数绑定,攻击者的恶意SQL会被当做SQL的参数,而不是SQL命令被执行。
659 |
660 | ### RSA AES CA
661 |
662 | - RSA:非对称加密,公钥+私钥,公钥可以直接传输,加解密开销大,不适合大文件。
663 | - AES:对称加密,私钥,加解密速度快,适合大文件,但是密钥不能直接传输。
664 | - CA:证书,由权威机构颁发,包含一对公钥+私钥。
665 | - 数据发送方:首先利用自己的私钥对**数据**进行签名生成**摘要**,然后请求接收方的CA,利用对方的公钥对**数据+摘要**进行加密;
666 | - 数据接收方:利用自己的私钥对加密**数据+摘要**进行解密,解密后请求发送方的CA,利用发送方的公钥对**摘要**进行验证确认数据是否为对方所发以及违背篡改。
667 |
668 | > 一般RSA和AES以及CA会结合使用:采用非对称加密算法来传输对称加密算法所需要的私钥,详将TSL握手过程!
669 |
670 | ### 数字签名 VS 数字证书
671 |
672 | 数字签名--防止内容被篡改
673 |
674 | 发送端(对原文用私钥进行签名,将原文和签名一起发送出去):
675 |
676 | 
677 |
678 | 接收端(对原文进行摘要得到摘要值1,用公钥对签名进行解密得到摘要值2,对比两个摘要值即可知道原文是否被篡改):
679 |
680 | 
681 |
682 | 数字证书--提供合法公钥
683 |
684 | 数字签名过程中,如果接收者的公钥被攻击者方替换,则攻击者可以篡改原文(用攻击者自己的私钥签名,接收者用攻击者伪造的公钥解密签名)。此时需要一个第三方权威机构对发送者的公钥进行合法性认证(CA证书)!
685 |
686 | - 第三方权威机构(证书中心)会对发送者的身份做认证,用权威机构的私钥加密发送者的公钥生成证书,并将证书颁发给发送者。
687 |
688 | 
689 |
690 | - 接收端收到发送者的证书后,用内置的权威机构的公钥解密证书验证发送者的公钥是否正确,进而验证内容是否被篡改。
691 |
692 | 
693 |
694 | ## 4 QUIC协议
695 |
696 | QUIC(Quick UDP Internet Connections )快速UDP协议,是由 Google 提出的实验性网络传输协议 ,位于 OSI 模型传输层。 QUIC 旨在解决 TCP 协议的缺陷,并最终替代 TCP 协议, 以减少数据传输,降低连接建立延迟时间,加快网页传输速度。主要是为了HTTP所设计的传输层协议。
697 |
698 | 
699 |
700 | https://segmentfault.com/a/1190000020881220
701 |
702 | https://www.mobibrw.com/2020/23190
703 |
704 | https://zhuanlan.zhihu.com/p/114384277
705 |
706 | https://quic.readthedocs.io/zh/latest/A%20QUIC%20Overview.html
707 |
708 | [TCP性能优化 - 程序员麻辣烫的文章 - 知乎](https://zhuanlan.zhihu.com/p/170582219)
709 |
710 | https://medium.com/codavel-blog/quic-vs-tcp-tls-and-why-quic-is-not-the-next-big-thing-d4ef59143efd
711 |
712 | [QUIC 协议原理浅解 ](https://www.sohu.com/a/456258632_100093134)
713 |
714 | ### 4.1 QUIC要解决的问题
715 |
716 | #### 4.1.1 TCP的队首阻塞
717 |
718 | TCP 的阻塞问题是因为传输阶段可能会丢包,一旦丢包就会等待重新发包,阻塞后续传输,这个问题虽然有**滑动窗口(Sliding Window)**这个方案,但是只能增强抗干扰,并没有彻底解决。应用层无法感知这个过程,只能等待数据完整后才能读取数据。
719 |
720 | HTTP/2 并没有解决 TCP 的队首阻塞问题,它仅仅是通过**多路复用**解决了以前 HTTP1.1 **管道化**请求时的队首阻塞。HTTP是应用层协议,无法解决TCP传输层协议的阻塞问题!
721 |
722 | > HTTP1.1队首阻塞问题:比如 HTTP/1.1 时代建立一个 TCP 连接,三个请求组成一个队列发出去,服务器接收到这个队列之后会依次响应,一旦前面的请求响应阻塞,后面的请求就会无法响应。
723 |
724 | #### 4.1.2 HTTPS握手时延大
725 |
726 | HTTPS在传输数据前经过TCP三次握手,TSL四次握手,最终至少需要3RTT才能开始HTTP数据传输。
727 |
728 | #### 4.1.3 网络切换需要重新握手
729 |
730 | 基于TCP的HTTP在用户网络切换后,需要重新建立TCP连接并完成握手(因为TCP连接由五元组来标识)。
731 |
732 | ### 4.2 QUIC原理
733 |
734 | #### 4.2.1 建立连接
735 |
736 | QUIC可以在0或1个RTT内完成握手。
737 |
738 | 
739 |
740 | - 第一次建立连接时,需要利用若干个步骤来交换密钥(DH算法),但是1RTT过后交换密钥会附带数据,所以认为只需要一个RTT即可完成握手并开始传输数据。
741 |
742 | - 在服务器和客户机第一次完成握手之后,它们缓存会话密钥,并且在建立新请求时,不需要重新握手。这就是所谓的0-RTT 特性。
743 | - 
744 |
745 | #### 4.2.2 传输数据
746 |
747 | 每个Packet(无论是否是重传的)都有唯一递增的Packet Number(递增使得窗口可以持续滑动),统计RTT更加准确。同时用Stream ID+Stream Offset来标识一个包所处流及其位置,以便在接收端完成排序。
748 |
749 | 
750 |
751 |
752 |
753 | #### 4.2.3 关闭连接
754 |
755 |
756 |
757 | ### 4.3 QUIC好处
758 |
759 | - **连接建立时延低**:0/1 RTT完成握手即可加密传输HTTP数据。
760 |
761 | - **灵活的拥塞控制**:在UDP上层(相当于是应用层)实现拥塞控制算法,十分灵活,不需要系统内核支持,针对一个应用的不同连接还可以使用不同的拥塞控制算法(可拔插)。
762 |
763 | - **无队头阻塞的多路复用**:分组中增加流ID标识,多个流的数据可以混合传输,流之间不会因为分组出错/丢失而产生相互阻塞。分组使用递增的Packet Number进行编号,支持乱序确认。
764 |
765 | > 假设丢失的包Packet Number为N,重传包为N+M,接收端利用包中的Steam Id+Stream Offset来确认这是一个丢失的包。
766 |
767 | - **连接迁移/保持**:用ID来标识连接(Connection UUID),而不是IP,客户端在切换网络时时可以立即继续传送数据无需重新握手。应用层感知不到网络切换。
768 |
769 | - **前向纠错**:在ARQ的基础上引入FEC前向纠错技术,将N个包的校验和(异或)建立一个单独的数据包发送,这样如果在这N个包中丢了一个包则可以直接恢复出来,完全不需要重传,有利于保证高速性,N可以根据网络状况动态调整。
770 |
771 | ### 4.4 建立在QUIC上的HTTP/2
772 |
773 | 由于QUIC将各种HTTP / 2机制与传输机制集成在一起,因此QUIC实现了许多在HTTP / 2中也指定的功能。 因此,QUIC允许HTTP / 2机制被QUIC的实现取代,从而降低了HTTP / 2协议的复杂性。 **可以通过QUIC提供对HTTP / 2的语义实现。**
774 |
775 |
776 |
777 | ## 5 CDN相关知识
778 |
779 | 内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。
780 |
781 | 
782 |
783 | ## 6 DNS相关知识
784 |
785 | DNS(域名系统)的作用就是把应用层的主机名字映射成IP地址。域名空间采用层次命名空间。
786 |
787 | DNS查询过程见 [DNS解析的基本流程?](#DNS解析的基本流程?) 主要有两种报文,查询报文和响应报文。查询类型主要有:
788 |
789 | - A:32Bit的IPV4地址
790 | - CNAME:别名
791 | - NS:名字服务器
792 | - MX:邮件交换记录
793 | - AAAA:128Bit的IPV6地址
794 | - ANY:所有记录
795 |
796 | **DDNS**
797 |
798 | 动态域名系统,DNS只是提供了域名和IP地址之间的静态对应关系,当IP地址发生变化时,DNS无法动态的更新域名和IP地址之间的对应关系,从而导致访问失败(需要修改DNS服务器的主文件配置)。
799 |
800 | 但是DDNS系统是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络时,DDNS客户端程序通过信息传递把该主机的动态IP地址传送给位于服务商主机上的DDNS服务器程序,实现动态域名解析。**DDNS客户端程序在后台运行并且每隔数分钟来检查电脑的IP地址,如果IP发生变更,就会向DNS服务器发送更新IP地址的请求**。
801 |
802 | ## 7 HTTP优化建议
803 |
804 | - 减少DNS查询:使用DNS缓存
805 | - 重用TCP连接
806 | - 使用CDN
807 | - 压缩传输内容
808 | - 并行处理请求和响应
809 | -
810 |
811 |
--------------------------------------------------------------------------------
/9.Web框架相关笔记.md:
--------------------------------------------------------------------------------
1 | # Web框架相关
2 |
3 |
4 |
5 | * [Web框架相关](#web框架相关)
6 | * [1 Spring框架](#1-spring框架)
7 | * [1.1 IoC是什么?有什么好处?](#11-ioc是什么有什么好处)
8 | * [1.2 AOP是什么?有什么好处?](#12-aop是什么有什么好处)
9 | * [1.3 Spring中的Bean是否线程安全?](#13-spring中的bean是否线程安全)
10 | * [1.4 Spring的事务隔离级别?](#14-spring的事务隔离级别)
11 | * [1.5 什么是SpringMVC](#15-什么是springmvc)
12 | * [2 SpringBoot框架](#2-springboot框架)
13 | * [2.1 SpringBoot和SpringMVC的区别?](#21-springboot和springmvc的区别)
14 | * [2.2 SpringBoot中使用什么注解将类放入IoC中进行管理?](#22-springboot中使用什么注解将类放入ioc中进行管理)
15 | * [2.3 Spring Boot 的自动配置是如何实现的?](#23-spring-boot-的自动配置是如何实现的)
16 | * [3 Mybatis框架](#3-mybatis框架)
17 | * [3.1 Mybatis的XML文件中${}和#{}的区别是什么?](#31-mybatis的xml文件中和的区别是什么)
18 | * [4 Netty框架](#4-netty框架)
19 |
20 |
21 |
22 | ## 1 Spring框架
23 |
24 | ### 1.1 IoC是什么?有什么好处?
25 |
26 | **----------是什么------------**
27 |
28 | IoC(Inverse of Control 控制反转)是一种**设计思想**,即将程序中需要手动创建的对象的控制权交由框架来进行管理,用户不需要关心具体的创建细节和依赖关系,只需要提供部分配置信息即可。具体过程如下所示:
29 |
30 | 
31 |
32 | 如下图所示,IoC是**依赖倒置原则**的一种实现思路,而实现IoC的方法可以采用**依赖注入**(DI),IoC容器就是实现了IoC的一种容器。
33 |
34 | 
35 |
36 | > DI:依赖注入是指将类所依赖的其它类的对象通过**构造/setter方法**注入进来,而不是在当前类的内部new一个所依赖的对象。
37 | >
38 | > 如:**汽车**<——依赖-——**车身**<——依赖——**底盘**<——依赖——**轮胎**
39 | >
40 | > 采用DI的方式,当我们轮胎发生变化时,只需要修改轮胎类即可,不影响其他类的代码编写。
41 | >
42 | > 
43 |
44 | 上图中,初始化一辆车需要很多new代码,而IoC容器则可以帮助我们省去这个麻烦的过程,使得我们创建实例时并不需要了解他的细节,**只需要提供一定的XML或者注解配置**即可:
45 |
46 | **-----------好处-----------**
47 |
48 | - IOC容器可以自动完成对象的初始化,用户不需要编写大量复杂的初始化代码,只需要维护/提供一部分必要的配置信息即可。
49 | - 用户在创建实例的时候可以不需要了解各个对象之间的依赖关系和具体的细节。
50 |
51 | ### 1.2 AOP是什么?有什么好处?
52 |
53 | AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,**却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制、统一全局异常处理等)封装起来**,便于**减少系统的重复代码**,**降低模块间的耦合度**,并有利于未来的可拓展性和可维护性。
54 |
55 | > 就比如,在编写业务逻辑代码的时候,我们习惯性的都要写:日志记录,事物控制,以及权限控制等,每一个子模块都要写这些代码,代码明显存在重复。这时候,我们运用面向切面的编程思想,采用横切技术**,将代码中重复的部分,不影响主业务逻辑的部分抽取出来,放在某个地方进行集中式的管理,调用**。 形成日志切面,事物控制切面,权限控制切面。 这样,我们就只需要关心业务的逻辑处理,既提高了工作的效率,又使得代码变的简洁优雅。这就是面向切面的编程思想,它是面向对象编程思想的一种扩展。
56 |
57 | Spring AOP是基于动态代理的:
58 |
59 | - 如果要代理的对象**实现了某个接口**,那么Spring AOP会使用**JDK动态代理**来生成AOP代理类
60 |
61 | - 创建实现`InvocationHandler`接口的类,重写`bind()`和`invoke`方法,前者表示绑定所代理的对象(必须实现某个接口),表示调用所代理对象的方法(可以在这里做一些:方法调用权限控制、功能增强等操作)。
62 |
63 | - 客户端代码:
64 |
65 | ```java
66 | ProxyHandler proxy = new ProxyHandler(); // 创建动态代理对象, ProxyHandler impl InvocationHandler
67 | Subject subject = (Subject) proxy.bind(new RealSubject()); // 获取代理目标 RealSubject impl Subject
68 | subject.doOperation(); // 开始调用方法
69 | // subject.destroy(); // 无权调用,产生异常(在ProxyHandler的invoke方法中做了权限控制)
70 | ```
71 |
72 | - 如果要代理的对象**没有实现接口**,那么Spring AOP会使用**Cglib**生成一个被代理对象的子类来作为代理类
73 |
74 | 使用 AOP 之后我们可以把一些**通用功能抽象**出来,在需要用到的地方直接使用即可,这样大大**简化了代码量**。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。
75 |
76 | > **代理模式**
77 | >
78 | > 
79 |
80 | ### 1.3 Spring中的Bean是否线程安全?
81 |
82 | Spring的Bean默认是单例的,所以是存在安全问题的。因为,当多个线程操作同一个对象的时候,对这个对象的成员变量的写操作会存在线程安全问题。
83 |
84 | > 但是,一般情况下,我们常用的 `Controller`、`Service`、`Dao` 这些 Bean(分别用`@Controller`和`@Service`和`@Repository`进行注解) 是**无状态**的(没有成员变量)。无状态的 Bean 不能保存数据,因此是线程安全的。
85 |
86 | 常见的有 2 种解决办法:
87 |
88 | 1. 在类中定义一个 `ThreadLocal` 成员变量,将需要的可变成员变量保存在[ `ThreadLocal` ](https://www.jianshu.com/p/3c5d7f09dfbd)中(推荐的一种方式)。
89 | 2. 改变 Bean 的作用域为 “prototype”:每次请求都会创建一个新的 bean 实例,自然不会存在线程安全问题。
90 |
91 | ### 1.4 Spring的事务隔离级别?
92 |
93 | Spring中的事务隔离采用ThreadLocal来实现的。
94 |
95 | ### 1.5 什么是SpringMVC
96 |
97 | MVC(Model模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器。
98 |
99 | - **模型**:用于封装业务逻辑处理(java类);
100 | - **视图**:用于数据展现和操作界面(Servlet);
101 | - **控制器**:用于协调视图和模型(jsp);
102 |
103 | 处理流程:用户将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现/返回处理结果;
104 |
105 | 
106 |
107 | ## 2 SpringBoot框架
108 |
109 | 将XML文件变成全部变成注解!避免了编写繁琐的XML语句。
110 |
111 | ### 2.1 SpringBoot和SpringMVC的区别?
112 |
113 | Spring Boot 简化了Spring MVC配置,Spring MVC的作用就是开发web应用。
114 |
115 | **spring boot 相比较mvc :**
116 |
117 | - spring boot自动配置的配置文件,无需我们在配置文件上面多花心思。
118 |
119 | - spring boot 并不是spring基础上的扩展,只是使应用更简单
120 |
121 | - spring boot 在第三方库配置实现了零配置,开箱机可用。
122 |
123 | **spring boot 和mvc比较哪里变化:**
124 |
125 | - 项目初始化有变化
126 |
127 | - 配置文件有变化
128 |
129 | - 不需要单独安装tomcat
130 |
131 | ### 2.2 SpringBoot中使用什么注解将类放入IoC中进行管理?
132 |
133 | - 注册Bean:`@Component`、`@Repository`、`@Service`、`@Controller`、`@Configuration`注解一个类;使用`@Bean`注解一个方法。
134 | - 使用Bean:`@Autowire`、`@Resource`。
135 |
136 | ### 2.3 **Spring Boot 的自动配置是如何实现的?**
137 |
138 | Spring Boot 项目的启动注解是:`@SpringBootApplication`,其实它就是由下面三个注解组成的:
139 |
140 | `@Configuration`
141 |
142 | `@ComponentScan`
143 |
144 | `@EnableAutoConfiguration`
145 |
146 | 其中`@EnableAutoConfiguration` 是实现自动配置的入口,该注解又通过 `@Import `注解导入了`AutoConfigurationImportSelector`,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 `EnableAutoConfiguration` 为 key 的数据,加载到 IOC 容器中,实现自动配置功能!
147 |
148 | ## 3 Mybatis框架
149 |
150 | ### 3.1 Mybatis的XML文件中`${}`和`#{}`的区别是什么?
151 |
152 | https://blog.csdn.net/qq_44543508/article/details/97106696
153 |
154 | https://blog.csdn.net/liangshui999/article/details/90258574?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
155 |
156 | - `#{}`是 sql 的参数占位符,相当于 `jdbc`中的`?`符号,`#{}`将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。可以防止SQL注入!如:`select * from user where id= #{user_id}`,如果传入的值是11,那么解析成sql时的值为`where id="11"` 。
157 | - `${}`是属于静态文本替换,在`JDBC`不支持使用占位符的地方,就只能使用`${}`,典型情况就是动态参数。如:`select * from emp_ ${year}`可以动态查询不同的`emp_xxx`表。
158 |
159 | 注意:
160 |
161 | - 如果只有一个参数则`#{value}`中的参数名可以随意写,如果有多个则需要和Dao中的`@Param`中的参数名对应;`${value}`中的参数名不可以随意写。
162 |
163 | - `#{}`可以防止SQL注入问题,如使用查询语句`select count(1) from tbl_user where id = #{id} and pwd = #{pwd}`,如果`pwd = #{pwd}`换成`pwd = ${pwd}`则当用户输入密码`pwd`为`"111 or 1 = 1"`,则SQL语句变成`select count(1) from tbl_user where id = 123 and pwd = 111 or 1 = 1`,条件将永远成立,用户可以直接登陆成功。
164 |
165 | - 有时`${}`和`#{}`都可以实现同样的功能,如实现一个模糊查询:
166 |
167 | ```xml
168 | # java调用时使用queryUserByUsername("%" + name + "%");
169 |
173 |
174 | # java调用时使用queryUserByUsername(name);
175 |
179 |
180 | # 最好的写法是------------------------------
181 | # java调用时使用queryUserByUsername(name);
182 |
186 | ```
187 |
188 | ## 4 Netty框架
189 |
190 | 以后再学吧!
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JavaNotesForInterview
2 |
3 | 个人在面试准备过程中整理的笔记,包含常见的Java面试知识点、面试重点、面试技巧、面筋等,适合在准备过程中进行路线和内容的参考,赶时间的同学也可以直接看我的笔记复习。
4 |
5 | 主要包含以下内容(带 :star: 的是重点,必须看的):
6 |
7 | > 建议使用Typora软件来阅读本文档,显示效果较好。
8 |
9 | - [0-面试记录和常见面试问题](0.个人面试记录.md)
10 | - [1-Java基础:star: :star:](1.Java基础知识.md)
11 | - [2-JVM:star: :star:](2.JVM相关笔记.md)
12 | - [3-Java并发编程:star: :star:](3.Java并发编程相关笔记.md)
13 | - [4-MySQL:star: :star:](4.MySQL相关笔记.md)
14 | - [5-Redis](5.Redis相关笔记.md)
15 | - [6-操作系统:star:](6.操作系统相关笔记.md)
16 | - [7-计算机网络:star:](7.计算机网络相关笔记.md)
17 | - [~~8-个人项目~~](8.项目相关笔记.md)
18 | - [9-Web框架相关笔记](9.Web框架相关笔记.md)
19 | - [10-数据结构和算法:star: :star:](10.数据结构和算法.md)
20 | - [11-分布式系统设计](11.分布式系统设计相关笔记.md)
21 |
22 | ## Java面试准备流程
23 |
24 | ### Java语言
25 |
26 | 语言不是很重要,你学Java也可以投非Java的岗位,只要有一门熟悉的语言来面试就可以。
27 |
28 | Java主要准备下面几点:
29 |
30 | - **基础语法**:网上找个视频快速入门语法,Java集合源码学习参考这个开源项目[JCFInternals](https://github.com/CarpenterLee/JCFInternals)。非常不建议看《 Java核心卷I/II 》,太厚了真没人看得下去!
31 |
32 | - **JVM**:看书《深入理解Java虚拟机 第三版》前八章+最后两章
33 |
34 | - **多线程并发**:《Java并发编程的艺术》全书
35 |
36 | ### 算法
37 |
38 | 新手不建议去看《算法导论》《算法 第三版》这种书,太厚了没几个人看得下去的,直接看下基本的数据结构(数组、队列、堆、栈、二叉树、链表)然后开始刷题:
39 |
40 | - [CS-Notes力扣题解](https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20题解%20-%20目录.md):按tag刷完接近200多道即可
41 |
42 | - 《剑指offer》至少刷两遍、里面的题目必须非常熟练
43 |
44 | - [CodeTop公司高频面试题](https://codetop.cc/home):可以在面试前找对应公司和对应岗位的高频题目来做做
45 |
46 | ### 数据库
47 |
48 | 数据库的面试大多数都是问理论知识,很少让写SQL语句的。主要准备:
49 |
50 | - MySQL:视频快速入门SQL基本增删改查语法、重点看书《MySQL技术内幕 InnoDB存储引擎》(3/4/7/8/9章略看)。
51 | - Redis:[狂神说Redis视频](https://www.bilibili.com/video/BV1S54y1R7SB)快速入门Redis语法、《Redis设计与实现 第二版》全书看
52 |
53 | ### 计算机网络
54 |
55 | 主要掌握TCP/UDP/DNS/HTTP/网络安全(CSRF、SQL注入、XSS攻击)。
56 |
57 | - 以前没学过:先看《 TCP/IP协议族》相关章节
58 |
59 | - 以前学过:可以直接看我整理的笔记!!!
60 |
61 | ### 操作系统
62 |
63 | 主要掌握进程和线程、内存管理两大块的知识。
64 |
65 | - 有时间的:看[清华陈俞老师的教学视频](https://www.bilibili.com/video/BV1uW411f72n)、《操作系统导论》全书、网上面筋
66 | - 没时间的:直接看我整理的面筋也够了
67 |
68 | ### Web框架
69 |
70 | spring/springmvc/springboot,看视频快速入门、会用,能写一个项目就可以,不是面试重点。没时间的话,如果有别的软件项目甚至可以不看Web框架。
71 |
72 | ### 其它加分点
73 |
74 | - 设计模式:《HeadFirst设计模式》,常见设计模式(单例、工厂、代理、生产者消费者模式)需要掌握一下。
75 | - 分布式、RPC框架、消息队列等知识
76 |
--------------------------------------------------------------------------------
/images/001A57D5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/001A57D5.png
--------------------------------------------------------------------------------
/images/006r3PQBjw1fbimb5c3srj30b40b40t9-20200404224750646.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/006r3PQBjw1fbimb5c3srj30b40b40t9-20200404224750646.jpg
--------------------------------------------------------------------------------
/images/05cd18e7e33c5937c7c39bf8872c5753.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/05cd18e7e33c5937c7c39bf8872c5753.jpg
--------------------------------------------------------------------------------
/images/0d2070e8f84c4801adbfa03bda1f98d9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/0d2070e8f84c4801adbfa03bda1f98d9.png
--------------------------------------------------------------------------------
/images/11859806-91afb99287720a23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/11859806-91afb99287720a23.png
--------------------------------------------------------------------------------
/images/121DF041.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/121DF041.png
--------------------------------------------------------------------------------
/images/1361655-20180413120416720-1194570336.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/1361655-20180413120416720-1194570336.png
--------------------------------------------------------------------------------
/images/1361655-20180413120441690-412327236.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/1361655-20180413120441690-412327236.jpg
--------------------------------------------------------------------------------
/images/1511516031351141.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/1511516031351141.png
--------------------------------------------------------------------------------
/images/1532166645819.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/1532166645819.jpg
--------------------------------------------------------------------------------
/images/1701765-20191126153931611-191817306.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/1701765-20191126153931611-191817306.png
--------------------------------------------------------------------------------
/images/20160901200252457:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20160901200252457
--------------------------------------------------------------------------------
/images/20170511174502192:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20170511174502192
--------------------------------------------------------------------------------
/images/20171213165317075:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20171213165317075
--------------------------------------------------------------------------------
/images/20180504214923703:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20180504214923703
--------------------------------------------------------------------------------
/images/20180504214933901:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20180504214933901
--------------------------------------------------------------------------------
/images/2019-01-31-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/2019-01-31-03.png
--------------------------------------------------------------------------------
/images/2019-3Java运行时数据区域JDK1.8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/2019-3Java运行时数据区域JDK1.8.png
--------------------------------------------------------------------------------
/images/20190622210958452.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20190622210958452.png
--------------------------------------------------------------------------------
/images/2019070810495327.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/2019070810495327.png
--------------------------------------------------------------------------------
/images/20200201180517.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20200201180517.png
--------------------------------------------------------------------------------
/images/20200412002533763.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20200412002533763.png
--------------------------------------------------------------------------------
/images/20201122214623249.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20201122214623249.png
--------------------------------------------------------------------------------
/images/20210118173547289.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20210118173547289.png
--------------------------------------------------------------------------------
/images/20210226175544304.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/20210226175544304.png
--------------------------------------------------------------------------------
/images/23f24c545d33ec4d6d72fc10e94a0ff7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/23f24c545d33ec4d6d72fc10e94a0ff7.jpg
--------------------------------------------------------------------------------
/images/2b27dac8cc647f8aac989da2d1166db2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/2b27dac8cc647f8aac989da2d1166db2.png
--------------------------------------------------------------------------------
/images/2e5bff4910ec189fe1ee6e2ecc7b4bbe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/2e5bff4910ec189fe1ee6e2ecc7b4bbe.png
--------------------------------------------------------------------------------
/images/32fa828ba61ea8d3c2502e396b1b3848251f58b0.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/32fa828ba61ea8d3c2502e396b1b3848251f58b0.jpeg
--------------------------------------------------------------------------------
/images/450px-Red-black_tree_example.svg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/450px-Red-black_tree_example.svg.png
--------------------------------------------------------------------------------
/images/50da81cb39dbb6fddfd1efbf6ecb031d952b3791.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/50da81cb39dbb6fddfd1efbf6ecb031d952b3791.jpeg
--------------------------------------------------------------------------------
/images/514dc04df2b8b2f3130b7d44776a825d.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/514dc04df2b8b2f3130b7d44776a825d.jpg
--------------------------------------------------------------------------------
/images/5Qj6BiZVf0RWCRWYnl30Tg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/5Qj6BiZVf0RWCRWYnl30Tg
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30326131666266642d376139642d343131342d393564662d6361323434353538376131662e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30326131666266642d376139642d343131342d393564662d6361323434353538376131662e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30663339396139662d313335312d346232642d623861342d3265626538326231613730332e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f30663339396139662d313335312d346232642d623861342d3265626538326231613730332e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f31363233663532342d623031312d343063382d623833662d6561623338643533386637362e706e67:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f31363233663532342d623031312d343063382d623833662d6561623338643533386637362e706e67
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34306336353730642d633164372d346333382d383433652d6261393931623233323863322e706e67:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34306336353730642d633164372d346333382d383433652d6261393931623233323863322e706e67
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34336433323361632d396630372d346534612d613331352d3465616638633338373636632e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34336433323361632d396630372d346534612d613331352d3465616638633338373636632e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34616238373731372d653236342d343233322d383235642d3861616630386631346538622e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f34616238373731372d653236342d343233322d383235642d3861616630386631346538622e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f39646161333631362d303061342d343863342d393134362d3739326463383439396265332e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f39646161333631362d303061342d343863342d393134362d3739326463383439396265332e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f61343261643361372d333537342d346334382d613738332d6564336430386130363838612e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f61343261643361372d333537342d346334382d613738332d6564336430386130363838612e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f62666561383737322d643031622d346135312d386164632d6564666437643364636538342e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f62666561383737322d643031622d346135312d386164632d6564666437643364636538342e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f64326330373263632d386231372d343830632d383133652d3138636462336234623531662e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f64326330373263632d386231372d343830632d383133652d3138636462336234623531662e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f65393864656235612d643564342d343239342d616139622d3932323064343438333430332e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f65393864656235612d643564342d343239342d616139622d3932323064343438333430332e6a7067
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f66646334356130392d663833382d343334382d383935392d6432633739333732373738382e706e67:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f66646334356130392d663833382d343334382d383935392d6432633739333732373738382e706e67
--------------------------------------------------------------------------------
/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f6d61737465722d736c6176652e706e67:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f63732d6e6f7465732d313235363130393739362e636f732e61702d6775616e677a686f752e6d7971636c6f75642e636f6d2f6d61737465722d736c6176652e706e67
--------------------------------------------------------------------------------
/images/68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d342f323031392d34254536254144254242254539253934253831312e706e67:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d342f323031392d34254536254144254242254539253934253831312e706e67
--------------------------------------------------------------------------------
/images/68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d372f6a6176612d646565702d616e642d7368616c6c6f772d636f70792e6a7067:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/68747470733a2f2f6d792d626c6f672d746f2d7573652e6f73732d636e2d6265696a696e672e616c6979756e63732e636f6d2f323031392d372f6a6176612d646565702d616e642d7368616c6c6f772d636f70792e6a7067
--------------------------------------------------------------------------------
/images/695151-20170705185452190-640259597.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/695151-20170705185452190-640259597.png
--------------------------------------------------------------------------------
/images/695151-20170705185523503-834605858.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/695151-20170705185523503-834605858.png
--------------------------------------------------------------------------------
/images/7896890-516eb4a9465451a6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/7896890-516eb4a9465451a6.png
--------------------------------------------------------------------------------
/images/7e2616937e3bc5323faf3ba4c09d739f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/7e2616937e3bc5323faf3ba4c09d739f.jpg
--------------------------------------------------------------------------------
/images/8412ab21453e1b33929dbe4cdf28aa9b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/8412ab21453e1b33929dbe4cdf28aa9b.png
--------------------------------------------------------------------------------
/images/849589-20171015231740840-6968181.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/849589-20171015231740840-6968181.gif
--------------------------------------------------------------------------------
/images/849589-20190306165258970-1789860540.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/849589-20190306165258970-1789860540.png
--------------------------------------------------------------------------------
/images/9093d242a2514effdbd745206661c180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/9093d242a2514effdbd745206661c180.png
--------------------------------------------------------------------------------
/images/B+树索引示意图.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/B+树索引示意图.png
--------------------------------------------------------------------------------
/images/IMG_0003(20210526-113302).PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/IMG_0003(20210526-113302).PNG
--------------------------------------------------------------------------------
/images/IMG_C563B131DD13-1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/IMG_C563B131DD13-1.jpeg
--------------------------------------------------------------------------------
/images/Java创建对象的过程.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Java创建对象的过程.png
--------------------------------------------------------------------------------
/images/Java线程生命周期.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Java线程生命周期.png
--------------------------------------------------------------------------------
/images/Kernel_Layout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Kernel_Layout.png
--------------------------------------------------------------------------------
/images/QQ20170331-004227.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/QQ20170331-004227.png
--------------------------------------------------------------------------------
/images/Red-black_tree_insert_case_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Red-black_tree_insert_case_3.png
--------------------------------------------------------------------------------
/images/Red-black_tree_insert_case_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Red-black_tree_insert_case_4.png
--------------------------------------------------------------------------------
/images/Red-black_tree_insert_case_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Red-black_tree_insert_case_5.png
--------------------------------------------------------------------------------
/images/Session-Based-Authentication-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Session-Based-Authentication-flow.png
--------------------------------------------------------------------------------
/images/Snipaste_2021-07-10_14-12-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Snipaste_2021-07-10_14-12-57.png
--------------------------------------------------------------------------------
/images/Token-Based-Authentication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/Token-Based-Authentication.png
--------------------------------------------------------------------------------
/images/b086cbbcab0b40079d6352196948c2b2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/b086cbbcab0b40079d6352196948c2b2.png
--------------------------------------------------------------------------------
/images/c7d6ca32e702d447f012c7f7b5925093.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/c7d6ca32e702d447f012c7f7b5925093.png
--------------------------------------------------------------------------------
/images/cde64bf682850738153e6c76dd3f6fb32201ce3c73c23415451da1eead9eb7cb-20190624173156.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/cde64bf682850738153e6c76dd3f6fb32201ce3c73c23415451da1eead9eb7cb-20190624173156.jpg
--------------------------------------------------------------------------------
/images/d1d70cf9cf6a05ef42c17d1e88c2ea2e.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/d1d70cf9cf6a05ef42c17d1e88c2ea2e.jpeg
--------------------------------------------------------------------------------
/images/d38202593012b457debbcd74994c6292.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/d38202593012b457debbcd74994c6292.png
--------------------------------------------------------------------------------
/images/d8f9d72a6059252dbd36f06e5c74ab3e5ab5b9a8.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/d8f9d72a6059252dbd36f06e5c74ab3e5ab5b9a8.jpeg
--------------------------------------------------------------------------------
/images/e7cd7b899e510fb3aa8c05042b22c093d0430ca7.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/e7cd7b899e510fb3aa8c05042b22c093d0430ca7.jpeg
--------------------------------------------------------------------------------
/images/ff96fed0e2a354bb16bbc84dcedf503a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/ff96fed0e2a354bb16bbc84dcedf503a.png
--------------------------------------------------------------------------------
/images/float_1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/float_1.gif
--------------------------------------------------------------------------------
/images/float_2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/float_2.gif
--------------------------------------------------------------------------------
/images/float_3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/float_3.gif
--------------------------------------------------------------------------------
/images/image-20200714213723072.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200714213723072.png
--------------------------------------------------------------------------------
/images/image-20200731150335238.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731150335238.png
--------------------------------------------------------------------------------
/images/image-20200731150443395.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731150443395.png
--------------------------------------------------------------------------------
/images/image-20200731154808258.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731154808258.png
--------------------------------------------------------------------------------
/images/image-20200731161124408.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731161124408.png
--------------------------------------------------------------------------------
/images/image-20200731161246609.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731161246609.png
--------------------------------------------------------------------------------
/images/image-20200731165300811.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731165300811.png
--------------------------------------------------------------------------------
/images/image-20200731215254764.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20200731215254764.png
--------------------------------------------------------------------------------
/images/image-20201009002906744.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201009002906744.png
--------------------------------------------------------------------------------
/images/image-20201009004538729.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201009004538729.png
--------------------------------------------------------------------------------
/images/image-20201009004827766.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201009004827766.png
--------------------------------------------------------------------------------
/images/image-20201009234019606.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201009234019606.png
--------------------------------------------------------------------------------
/images/image-20201013190809261.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201013190809261.png
--------------------------------------------------------------------------------
/images/image-20201015001140435.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201015001140435.png
--------------------------------------------------------------------------------
/images/image-20201016110541315.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201016110541315.png
--------------------------------------------------------------------------------
/images/image-20201017153106929.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201017153106929.png
--------------------------------------------------------------------------------
/images/image-20201017190216351.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201017190216351.png
--------------------------------------------------------------------------------
/images/image-20201023112046554.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201023112046554.png
--------------------------------------------------------------------------------
/images/image-20201104002431602.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201104002431602.png
--------------------------------------------------------------------------------
/images/image-20201104002457202.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201104002457202.png
--------------------------------------------------------------------------------
/images/image-20201108010515345.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201108010515345.png
--------------------------------------------------------------------------------
/images/image-20201112165335370.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201112165335370.png
--------------------------------------------------------------------------------
/images/image-20201124180258431.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201124180258431.png
--------------------------------------------------------------------------------
/images/image-20201130121534623.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201130121534623.png
--------------------------------------------------------------------------------
/images/image-20201130122201409.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201130122201409.png
--------------------------------------------------------------------------------
/images/image-20201221213831291.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201221213831291.png
--------------------------------------------------------------------------------
/images/image-20201221214920609.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201221214920609.png
--------------------------------------------------------------------------------
/images/image-20201230212625580.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20201230212625580.png
--------------------------------------------------------------------------------
/images/image-20210104102707688.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210104102707688.png
--------------------------------------------------------------------------------
/images/image-20210104103637384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210104103637384.png
--------------------------------------------------------------------------------
/images/image-20210109114515017.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210109114515017.png
--------------------------------------------------------------------------------
/images/image-20210111134608236.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210111134608236.png
--------------------------------------------------------------------------------
/images/image-20210111135656009.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210111135656009.png
--------------------------------------------------------------------------------
/images/image-20210111135713240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210111135713240.png
--------------------------------------------------------------------------------
/images/image-20210111174333342.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210111174333342.png
--------------------------------------------------------------------------------
/images/image-20210112145334579.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210112145334579.png
--------------------------------------------------------------------------------
/images/image-20210112150208927.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210112150208927.png
--------------------------------------------------------------------------------
/images/image-20210112152626932.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210112152626932.png
--------------------------------------------------------------------------------
/images/image-20210112161639348.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210112161639348.png
--------------------------------------------------------------------------------
/images/image-20210113110816813.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210113110816813.png
--------------------------------------------------------------------------------
/images/image-20210113111050396.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210113111050396.png
--------------------------------------------------------------------------------
/images/image-20210113112215272.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210113112215272.png
--------------------------------------------------------------------------------
/images/image-20210113113522651.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210113113522651.png
--------------------------------------------------------------------------------
/images/image-20210113114546129.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210113114546129.png
--------------------------------------------------------------------------------
/images/image-20210113115806574.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210113115806574.png
--------------------------------------------------------------------------------
/images/image-20210114161810365.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210114161810365.png
--------------------------------------------------------------------------------
/images/image-20210116125515496.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210116125515496.png
--------------------------------------------------------------------------------
/images/image-20210116125556541.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210116125556541.png
--------------------------------------------------------------------------------
/images/image-20210117100519545.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210117100519545.png
--------------------------------------------------------------------------------
/images/image-20210117104159390.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210117104159390.png
--------------------------------------------------------------------------------
/images/image-20210117105511943.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210117105511943.png
--------------------------------------------------------------------------------
/images/image-20210117105703387.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210117105703387.png
--------------------------------------------------------------------------------
/images/image-20210117105729503.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210117105729503.png
--------------------------------------------------------------------------------
/images/image-20210117161652747.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210117161652747.png
--------------------------------------------------------------------------------
/images/image-20210119160645824.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210119160645824.png
--------------------------------------------------------------------------------
/images/image-20210120140456783.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210120140456783.png
--------------------------------------------------------------------------------
/images/image-20210120153947951.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210120153947951.png
--------------------------------------------------------------------------------
/images/image-20210120162114871.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210120162114871.png
--------------------------------------------------------------------------------
/images/image-20210121133336651.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210121133336651.png
--------------------------------------------------------------------------------
/images/image-20210122103144748.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210122103144748.png
--------------------------------------------------------------------------------
/images/image-20210122112233202.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210122112233202.png
--------------------------------------------------------------------------------
/images/image-20210122112439914.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210122112439914.png
--------------------------------------------------------------------------------
/images/image-20210124162436993.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210124162436993.png
--------------------------------------------------------------------------------
/images/image-20210124192431964.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210124192431964.png
--------------------------------------------------------------------------------
/images/image-20210126175248822.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210126175248822.png
--------------------------------------------------------------------------------
/images/image-20210127233651581.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210127233651581.png
--------------------------------------------------------------------------------
/images/image-20210128162613899.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210128162613899.png
--------------------------------------------------------------------------------
/images/image-20210128162743590.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210128162743590.png
--------------------------------------------------------------------------------
/images/image-20210129165232639.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210129165232639.png
--------------------------------------------------------------------------------
/images/image-20210202214936190.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210202214936190.png
--------------------------------------------------------------------------------
/images/image-20210202214944985.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210202214944985.png
--------------------------------------------------------------------------------
/images/image-20210204204654697.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210204204654697.png
--------------------------------------------------------------------------------
/images/image-20210208171800439.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210208171800439.png
--------------------------------------------------------------------------------
/images/image-20210208181447107.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210208181447107.png
--------------------------------------------------------------------------------
/images/image-20210216210541646.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216210541646.png
--------------------------------------------------------------------------------
/images/image-20210216211744016.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216211744016.png
--------------------------------------------------------------------------------
/images/image-20210216215041849.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216215041849.png
--------------------------------------------------------------------------------
/images/image-20210216220514814.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216220514814.png
--------------------------------------------------------------------------------
/images/image-20210216220849469.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216220849469.png
--------------------------------------------------------------------------------
/images/image-20210216221903896.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216221903896.png
--------------------------------------------------------------------------------
/images/image-20210216222557043.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216222557043.png
--------------------------------------------------------------------------------
/images/image-20210216223414370.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216223414370.png
--------------------------------------------------------------------------------
/images/image-20210216223620975.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210216223620975.png
--------------------------------------------------------------------------------
/images/image-20210217001207875.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210217001207875.png
--------------------------------------------------------------------------------
/images/image-20210219151024238.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210219151024238.png
--------------------------------------------------------------------------------
/images/image-20210222115627251.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222115627251.png
--------------------------------------------------------------------------------
/images/image-20210222115655060.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222115655060.png
--------------------------------------------------------------------------------
/images/image-20210222120636856.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222120636856.png
--------------------------------------------------------------------------------
/images/image-20210222140326761.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222140326761.png
--------------------------------------------------------------------------------
/images/image-20210222165020169.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222165020169.png
--------------------------------------------------------------------------------
/images/image-20210222165858294.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222165858294.png
--------------------------------------------------------------------------------
/images/image-20210222172635632.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210222172635632.png
--------------------------------------------------------------------------------
/images/image-20210223220950463.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210223220950463.png
--------------------------------------------------------------------------------
/images/image-20210223231828868.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210223231828868.png
--------------------------------------------------------------------------------
/images/image-20210223232055329.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210223232055329.png
--------------------------------------------------------------------------------
/images/image-20210223232854949.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210223232854949.png
--------------------------------------------------------------------------------
/images/image-20210223234633061.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210223234633061.png
--------------------------------------------------------------------------------
/images/image-20210223234724450.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210223234724450.png
--------------------------------------------------------------------------------
/images/image-20210224151813407.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210224151813407.png
--------------------------------------------------------------------------------
/images/image-20210224162544611.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210224162544611.png
--------------------------------------------------------------------------------
/images/image-20210225191438396.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210225191438396.png
--------------------------------------------------------------------------------
/images/image-20210226181655874.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210226181655874.png
--------------------------------------------------------------------------------
/images/image-20210228004048651.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228004048651.png
--------------------------------------------------------------------------------
/images/image-20210228100637278.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228100637278.png
--------------------------------------------------------------------------------
/images/image-20210228101930508.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228101930508.png
--------------------------------------------------------------------------------
/images/image-20210228102337686.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228102337686.png
--------------------------------------------------------------------------------
/images/image-20210228103037750.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228103037750.png
--------------------------------------------------------------------------------
/images/image-20210228111632296.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228111632296.png
--------------------------------------------------------------------------------
/images/image-20210228194736403.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228194736403.png
--------------------------------------------------------------------------------
/images/image-20210228202051176.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228202051176.png
--------------------------------------------------------------------------------
/images/image-20210228202055260.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228202055260.png
--------------------------------------------------------------------------------
/images/image-20210228235719390.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210228235719390.png
--------------------------------------------------------------------------------
/images/image-20210301194115914.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210301194115914.png
--------------------------------------------------------------------------------
/images/image-20210302153008576.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210302153008576.png
--------------------------------------------------------------------------------
/images/image-20210303234741529.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210303234741529.png
--------------------------------------------------------------------------------
/images/image-20210304100854015.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210304100854015.png
--------------------------------------------------------------------------------
/images/image-20210308161945117.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210308161945117.png
--------------------------------------------------------------------------------
/images/image-20210308171124988.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210308171124988.png
--------------------------------------------------------------------------------
/images/image-20210308172028165.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210308172028165.png
--------------------------------------------------------------------------------
/images/image-20210310163549004.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210310163549004.png
--------------------------------------------------------------------------------
/images/image-20210310192131480.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210310192131480.png
--------------------------------------------------------------------------------
/images/image-20210313010816806.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210313010816806.png
--------------------------------------------------------------------------------
/images/image-20210314162014667.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210314162014667.png
--------------------------------------------------------------------------------
/images/image-20210314162440316.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210314162440316.png
--------------------------------------------------------------------------------
/images/image-20210316010042035.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210316010042035.png
--------------------------------------------------------------------------------
/images/image-20210316155832849.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210316155832849.png
--------------------------------------------------------------------------------
/images/image-20210316155941036.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210316155941036.png
--------------------------------------------------------------------------------
/images/image-20210316165727285.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210316165727285.png
--------------------------------------------------------------------------------
/images/image-20210317215126342.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210317215126342.png
--------------------------------------------------------------------------------
/images/image-20210317225704426.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210317225704426.png
--------------------------------------------------------------------------------
/images/image-20210318213553331.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210318213553331.png
--------------------------------------------------------------------------------
/images/image-20210319104247349.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210319104247349.png
--------------------------------------------------------------------------------
/images/image-20210319171350807.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210319171350807.png
--------------------------------------------------------------------------------
/images/image-20210319210124085.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210319210124085.png
--------------------------------------------------------------------------------
/images/image-20210320001109615.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210320001109615.png
--------------------------------------------------------------------------------
/images/image-20210320103208958.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210320103208958.png
--------------------------------------------------------------------------------
/images/image-20210325003351486.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210325003351486.png
--------------------------------------------------------------------------------
/images/image-20210325160624617.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210325160624617.png
--------------------------------------------------------------------------------
/images/image-20210325161523556.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210325161523556.png
--------------------------------------------------------------------------------
/images/image-20210325192631898.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210325192631898.png
--------------------------------------------------------------------------------
/images/image-20210326152227075.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210326152227075.png
--------------------------------------------------------------------------------
/images/image-20210326214809272.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210326214809272.png
--------------------------------------------------------------------------------
/images/image-20210326215602888.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210326215602888.png
--------------------------------------------------------------------------------
/images/image-20210328154428031.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210328154428031.png
--------------------------------------------------------------------------------
/images/image-20210328162746028.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210328162746028.png
--------------------------------------------------------------------------------
/images/image-20210401190712223.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210401190712223.png
--------------------------------------------------------------------------------
/images/image-20210406145013627.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210406145013627.png
--------------------------------------------------------------------------------
/images/image-20210406145633820.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210406145633820.png
--------------------------------------------------------------------------------
/images/image-20210409205007532.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210409205007532.png
--------------------------------------------------------------------------------
/images/image-20210409213512252.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210409213512252.png
--------------------------------------------------------------------------------
/images/image-20210409213547853.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210409213547853.png
--------------------------------------------------------------------------------
/images/image-20210411154859126.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210411154859126.png
--------------------------------------------------------------------------------
/images/image-20210411154940092.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210411154940092.png
--------------------------------------------------------------------------------
/images/image-20210411161846713.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210411161846713.png
--------------------------------------------------------------------------------
/images/image-20210411163248305.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210411163248305.png
--------------------------------------------------------------------------------
/images/image-20210411163528953.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210411163528953.png
--------------------------------------------------------------------------------
/images/image-20210411163737843.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210411163737843.png
--------------------------------------------------------------------------------
/images/image-20210414140141305.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210414140141305.png
--------------------------------------------------------------------------------
/images/image-20210414140321191.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210414140321191.png
--------------------------------------------------------------------------------
/images/image-20210414140807190.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210414140807190.png
--------------------------------------------------------------------------------
/images/image-20210414140841674.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210414140841674.png
--------------------------------------------------------------------------------
/images/image-20210414154710957.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210414154710957.png
--------------------------------------------------------------------------------
/images/image-20210416201758168.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210416201758168.png
--------------------------------------------------------------------------------
/images/image-20210416202741970.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210416202741970.png
--------------------------------------------------------------------------------
/images/image-20210417201651860.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210417201651860.png
--------------------------------------------------------------------------------
/images/image-20210417204950750.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210417204950750.png
--------------------------------------------------------------------------------
/images/image-20210420232925949.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210420232925949.png
--------------------------------------------------------------------------------
/images/image-20210427195048104.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210427195048104.png
--------------------------------------------------------------------------------
/images/image-20210510113441041.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210510113441041.png
--------------------------------------------------------------------------------
/images/image-20210516211109033.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210516211109033.png
--------------------------------------------------------------------------------
/images/image-20210516211210968.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210516211210968.png
--------------------------------------------------------------------------------
/images/image-20210516211321052.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210516211321052.png
--------------------------------------------------------------------------------
/images/image-20210519104213488.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210519104213488.png
--------------------------------------------------------------------------------
/images/image-20210519104501297.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210519104501297.png
--------------------------------------------------------------------------------
/images/image-20210525165256227.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210525165256227.png
--------------------------------------------------------------------------------
/images/image-20210525165325215.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210525165325215.png
--------------------------------------------------------------------------------
/images/image-20210526102252732.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210526102252732.png
--------------------------------------------------------------------------------
/images/image-20210526105102943.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210526105102943.png
--------------------------------------------------------------------------------
/images/image-20210526105257751.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210526105257751.png
--------------------------------------------------------------------------------
/images/image-20210526105535616.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210526105535616.png
--------------------------------------------------------------------------------
/images/image-20210526105619574.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210526105619574.png
--------------------------------------------------------------------------------
/images/image-20210527125950418.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210527125950418.png
--------------------------------------------------------------------------------
/images/image-20210601115348453.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210601115348453.png
--------------------------------------------------------------------------------
/images/image-20210601201642949.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210601201642949.png
--------------------------------------------------------------------------------
/images/image-20210601202855091.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210601202855091.png
--------------------------------------------------------------------------------
/images/image-20210601203526275.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210601203526275.png
--------------------------------------------------------------------------------
/images/image-20210601203547046.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210601203547046.png
--------------------------------------------------------------------------------
/images/image-20210601203634836.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210601203634836.png
--------------------------------------------------------------------------------
/images/image-20210602100123542.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210602100123542.png
--------------------------------------------------------------------------------
/images/image-20210602100317168.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210602100317168.png
--------------------------------------------------------------------------------
/images/image-20210602102557067.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210602102557067.png
--------------------------------------------------------------------------------
/images/image-20210602104400506.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210602104400506.png
--------------------------------------------------------------------------------
/images/image-20210602105501439.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210602105501439.png
--------------------------------------------------------------------------------
/images/image-20210602105542905.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210602105542905.png
--------------------------------------------------------------------------------
/images/image-20210603104745566.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210603104745566.png
--------------------------------------------------------------------------------
/images/image-20210603133709502.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210603133709502.png
--------------------------------------------------------------------------------
/images/image-20210604101837300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210604101837300.png
--------------------------------------------------------------------------------
/images/image-20210605003500665.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210605003500665.png
--------------------------------------------------------------------------------
/images/image-20210605003640528.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210605003640528.png
--------------------------------------------------------------------------------
/images/image-20210605003925901.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210605003925901.png
--------------------------------------------------------------------------------
/images/image-20210605004650576.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210605004650576.png
--------------------------------------------------------------------------------
/images/image-20210605010400636.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210605010400636.png
--------------------------------------------------------------------------------
/images/image-20210613235919833.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210613235919833.png
--------------------------------------------------------------------------------
/images/image-20210614001151079.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210614001151079.png
--------------------------------------------------------------------------------
/images/image-20210614001700186.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210614001700186.png
--------------------------------------------------------------------------------
/images/image-20210618153323650.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210618153323650.png
--------------------------------------------------------------------------------
/images/image-20210710141314929.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210710141314929.png
--------------------------------------------------------------------------------
/images/image-20210710143029918.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210710143029918.png
--------------------------------------------------------------------------------
/images/image-20210710143205778.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210710143205778.png
--------------------------------------------------------------------------------
/images/image-20210710155345259.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210710155345259.png
--------------------------------------------------------------------------------
/images/image-20210713220604248.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210713220604248.png
--------------------------------------------------------------------------------
/images/image-20210713221140673.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210713221140673.png
--------------------------------------------------------------------------------
/images/image-20210713221454439.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210713221454439.png
--------------------------------------------------------------------------------
/images/image-20210713221624187.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210713221624187.png
--------------------------------------------------------------------------------
/images/image-20210714102713952.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210714102713952.png
--------------------------------------------------------------------------------
/images/image-20210714102729452.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210714102729452.png
--------------------------------------------------------------------------------
/images/image-20210714103257982.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210714103257982.png
--------------------------------------------------------------------------------
/images/image-20210714113842059.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210714113842059.png
--------------------------------------------------------------------------------
/images/image-20210722163219602.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210722163219602.png
--------------------------------------------------------------------------------
/images/image-20210722163234488.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210722163234488.png
--------------------------------------------------------------------------------
/images/image-20210722163255297.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210722163255297.png
--------------------------------------------------------------------------------
/images/image-20210722163306125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210722163306125.png
--------------------------------------------------------------------------------
/images/image-20210722201828336.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210722201828336.png
--------------------------------------------------------------------------------
/images/image-20210723112902271.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210723112902271.png
--------------------------------------------------------------------------------
/images/image-20210723114026196.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210723114026196.png
--------------------------------------------------------------------------------
/images/image-20210723172322555.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210723172322555.png
--------------------------------------------------------------------------------
/images/image-20210723172351253.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210723172351253.png
--------------------------------------------------------------------------------
/images/image-20210723223359866.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210723223359866.png
--------------------------------------------------------------------------------
/images/image-20210723224100335.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210723224100335.png
--------------------------------------------------------------------------------
/images/image-20210724153430262.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210724153430262.png
--------------------------------------------------------------------------------
/images/image-20210725110713993.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210725110713993.png
--------------------------------------------------------------------------------
/images/image-20210726161649305.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210726161649305.png
--------------------------------------------------------------------------------
/images/image-20210726162006551.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210726162006551.png
--------------------------------------------------------------------------------
/images/image-20210726232418306.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210726232418306.png
--------------------------------------------------------------------------------
/images/image-20210728113453067.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210728113453067.png
--------------------------------------------------------------------------------
/images/image-20210728113739923.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210728113739923.png
--------------------------------------------------------------------------------
/images/image-20210728212757175.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210728212757175.png
--------------------------------------------------------------------------------
/images/image-20210729160624715.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210729160624715.png
--------------------------------------------------------------------------------
/images/image-20210730160523271.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210730160523271.png
--------------------------------------------------------------------------------
/images/image-20210731135305120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210731135305120.png
--------------------------------------------------------------------------------
/images/image-20210731135414584.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210731135414584.png
--------------------------------------------------------------------------------
/images/image-20210731135641898.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210731135641898.png
--------------------------------------------------------------------------------
/images/image-20210731140303264.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210731140303264.png
--------------------------------------------------------------------------------
/images/image-20210731140550509.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210731140550509.png
--------------------------------------------------------------------------------
/images/image-20210801170423528.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801170423528.png
--------------------------------------------------------------------------------
/images/image-20210801170719472.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801170719472.png
--------------------------------------------------------------------------------
/images/image-20210801170750810.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801170750810.png
--------------------------------------------------------------------------------
/images/image-20210801171530283.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801171530283.png
--------------------------------------------------------------------------------
/images/image-20210801172128364.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801172128364.png
--------------------------------------------------------------------------------
/images/image-20210801175912548.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801175912548.png
--------------------------------------------------------------------------------
/images/image-20210801213154533.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801213154533.png
--------------------------------------------------------------------------------
/images/image-20210801213442863.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801213442863.png
--------------------------------------------------------------------------------
/images/image-20210801214616026.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210801214616026.png
--------------------------------------------------------------------------------
/images/image-20210806205659200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806205659200.png
--------------------------------------------------------------------------------
/images/image-20210806205732293.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806205732293.png
--------------------------------------------------------------------------------
/images/image-20210806205754254.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806205754254.png
--------------------------------------------------------------------------------
/images/image-20210806205844777.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806205844777.png
--------------------------------------------------------------------------------
/images/image-20210806205912470.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806205912470.png
--------------------------------------------------------------------------------
/images/image-20210806210013973.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806210013973.png
--------------------------------------------------------------------------------
/images/image-20210806210258259.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806210258259.png
--------------------------------------------------------------------------------
/images/image-20210806210312815.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210806210312815.png
--------------------------------------------------------------------------------
/images/image-20210807144647587.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210807144647587.png
--------------------------------------------------------------------------------
/images/image-20210807151730255.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210807151730255.png
--------------------------------------------------------------------------------
/images/image-20210808172343063.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210808172343063.png
--------------------------------------------------------------------------------
/images/image-20210808172358783.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210808172358783.png
--------------------------------------------------------------------------------
/images/image-20210808172421257.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210808172421257.png
--------------------------------------------------------------------------------
/images/image-20210809172652766.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210809172652766.png
--------------------------------------------------------------------------------
/images/image-20210809173717973.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210809173717973.png
--------------------------------------------------------------------------------
/images/image-20210815205849148.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210815205849148.png
--------------------------------------------------------------------------------
/images/image-20210819165457226.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210819165457226.png
--------------------------------------------------------------------------------
/images/image-20210824213345537.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210824213345537.png
--------------------------------------------------------------------------------
/images/image-20210824214237309.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210824214237309.png
--------------------------------------------------------------------------------
/images/image-20210904112556698.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210904112556698.png
--------------------------------------------------------------------------------
/images/image-20210904113033277.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/image-20210904113033277.png
--------------------------------------------------------------------------------
/images/ioc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/ioc.png
--------------------------------------------------------------------------------
/images/redis过期时间.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/redis过期时间.png
--------------------------------------------------------------------------------
/images/threadlocal数据结构.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/threadlocal数据结构.png
--------------------------------------------------------------------------------
/images/v2-0204ff048148735a260fa5f94f475f14_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-0204ff048148735a260fa5f94f475f14_r.jpg
--------------------------------------------------------------------------------
/images/v2-1d41ca6712224fc7ee0226875c59336a_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-1d41ca6712224fc7ee0226875c59336a_r.jpg
--------------------------------------------------------------------------------
/images/v2-1e6d2ef6d8782117779143843798b79e_1440w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-1e6d2ef6d8782117779143843798b79e_1440w.jpg
--------------------------------------------------------------------------------
/images/v2-1ec1e7e0b313a92e0028691ae97c9766_1440w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-1ec1e7e0b313a92e0028691ae97c9766_1440w.jpg
--------------------------------------------------------------------------------
/images/v2-4803e11dc95cf478d95674f25efd9a7f_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-4803e11dc95cf478d95674f25efd9a7f_r.jpg
--------------------------------------------------------------------------------
/images/v2-5606413e1b5d2c727399711d347617a2_1440w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-5606413e1b5d2c727399711d347617a2_1440w.jpg
--------------------------------------------------------------------------------
/images/v2-5ba76e77f05b030b5879177bd336928f_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-5ba76e77f05b030b5879177bd336928f_r.jpg
--------------------------------------------------------------------------------
/images/v2-7cf8cec396a66dca2dd1fcd6dadab537_1440w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-7cf8cec396a66dca2dd1fcd6dadab537_1440w.jpg
--------------------------------------------------------------------------------
/images/v2-975920d028e58f620ca84125c1b211f4_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-975920d028e58f620ca84125c1b211f4_r.jpg
--------------------------------------------------------------------------------
/images/v2-99ad2cd809fcb86dd791ff7f65fb1779_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-99ad2cd809fcb86dd791ff7f65fb1779_r.jpg
--------------------------------------------------------------------------------
/images/v2-9b3d0b05fb2464193410a1712e4f49df_720w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-9b3d0b05fb2464193410a1712e4f49df_720w.jpg
--------------------------------------------------------------------------------
/images/v2-a14c65a4ec2fbb470fba728b818a6d22_1440w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-a14c65a4ec2fbb470fba728b818a6d22_1440w.jpg
--------------------------------------------------------------------------------
/images/v2-c8af39b5799f314608132fcfd92aa39c_720w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-c8af39b5799f314608132fcfd92aa39c_720w.jpg
--------------------------------------------------------------------------------
/images/v2-c8af39b5799f314608132fcfd92aa39c_hd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-c8af39b5799f314608132fcfd92aa39c_hd.jpg
--------------------------------------------------------------------------------
/images/v2-cd67258b67da762478f700866b59eb67_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-cd67258b67da762478f700866b59eb67_r.jpg
--------------------------------------------------------------------------------
/images/v2-d93943bf4f4fbed708f751c5303f8d6f_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-d93943bf4f4fbed708f751c5303f8d6f_r.jpg
--------------------------------------------------------------------------------
/images/v2-e01c7af752461c0794a10f383dbe465b_1440w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-e01c7af752461c0794a10f383dbe465b_1440w.jpg
--------------------------------------------------------------------------------
/images/v2-f81afcda08a62df36ae13be04b0ea020_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/v2-f81afcda08a62df36ae13be04b0ea020_r.jpg
--------------------------------------------------------------------------------
/images/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWppZ3Vv,size_16,color_FFFFFF,t_70#pic_center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWppZ3Vv,size_16,color_FFFFFF,t_70#pic_center.png
--------------------------------------------------------------------------------
/images/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxvX2JyYXZvXw==,size_16,color_FFFFFF,t_70:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxvX2JyYXZvXw==,size_16,color_FFFFFF,t_70
--------------------------------------------------------------------------------
/images/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxvX2JyYXZvXw==,size_16,color_FFFFFF,t_70-16287581769521:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbGxvX2JyYXZvXw==,size_16,color_FFFFFF,t_70-16287581769521
--------------------------------------------------------------------------------
/images/webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/webp
--------------------------------------------------------------------------------
/images/ws.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/ws.png
--------------------------------------------------------------------------------
/images/代理模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/代理模式UML.png
--------------------------------------------------------------------------------
/images/冒泡排序.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/冒泡排序.gif
--------------------------------------------------------------------------------
/images/单例模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/单例模式UML.png
--------------------------------------------------------------------------------
/images/原型模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/原型模式UML.png
--------------------------------------------------------------------------------
/images/命令模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/命令模式UML.png
--------------------------------------------------------------------------------
/images/外观模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/外观模式UML.png
--------------------------------------------------------------------------------
/images/工厂方法模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/工厂方法模式UML.png
--------------------------------------------------------------------------------
/images/建造者模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/建造者模式UML.png
--------------------------------------------------------------------------------
/images/归并排序.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/归并排序.jpg
--------------------------------------------------------------------------------
/images/抽象工厂模式UML-16271434591911.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/抽象工厂模式UML-16271434591911.png
--------------------------------------------------------------------------------
/images/抽象工厂模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/抽象工厂模式UML.png
--------------------------------------------------------------------------------
/images/插入排序.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/插入排序.gif
--------------------------------------------------------------------------------
/images/桥接模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/桥接模式UML.png
--------------------------------------------------------------------------------
/images/模板模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/模板模式UML.png
--------------------------------------------------------------------------------
/images/状态模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/状态模式UML.png
--------------------------------------------------------------------------------
/images/策略模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/策略模式UML.png
--------------------------------------------------------------------------------
/images/简单工厂模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/简单工厂模式UML.png
--------------------------------------------------------------------------------
/images/简单选择排序.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/简单选择排序.gif
--------------------------------------------------------------------------------
/images/糖果售卖机.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/糖果售卖机.png
--------------------------------------------------------------------------------
/images/组合模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/组合模式UML.png
--------------------------------------------------------------------------------
/images/装饰器模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/装饰器模式UML.png
--------------------------------------------------------------------------------
/images/观察者模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/观察者模式UML.png
--------------------------------------------------------------------------------
/images/迭代器模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/迭代器模式UML.png
--------------------------------------------------------------------------------
/images/适配器模式UML-16271435456162.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/适配器模式UML-16271435456162.png
--------------------------------------------------------------------------------
/images/适配器模式UML-16271435632083.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/适配器模式UML-16271435632083.png
--------------------------------------------------------------------------------
/images/适配器模式UML.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/QiuYukang/JavaNotesForInterview/64759afbc752de8dbf331fd78570e1d8b19eff5d/images/适配器模式UML.png
--------------------------------------------------------------------------------