From ff77b0cabf58cba007148a7c804ed27f681a16a3 Mon Sep 17 00:00:00 2001 From: Guide Date: Fri, 11 Apr 2025 07:23:35 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]redis=E3=80=81=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E9=83=A8=E5=88=86=E9=97=AE=E9=A2=98=E7=AD=94=E6=A1=88?= =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AE=8C=E5=96=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/redis/redis-questions-01.md | 8 +++---- .../threadpoolexecutor构造函数.png | Bin 20107 -> 0 bytes .../java-concurrent-questions-03.md | 20 ++++++++++-------- .../concurrent/java-thread-pool-summary.md | 10 ++++++--- docs/java/new-features/java24.md | 7 ++++++ 5 files changed, 29 insertions(+), 16 deletions(-) delete mode 100644 docs/java/concurrent/images/java-thread-pool-summary/threadpoolexecutor构造函数.png diff --git a/docs/database/redis/redis-questions-01.md b/docs/database/redis/redis-questions-01.md index 6493ebfe..7102985b 100644 --- a/docs/database/redis/redis-questions-01.md +++ b/docs/database/redis/redis-questions-01.md @@ -36,10 +36,10 @@ Redis 没有外部依赖,Linux 和 OS X 是 Redis 开发和测试最多的两 Redis 内部做了非常多的性能优化,比较重要的有下面 4 点: -1. Redis 基于内存,内存的访问速度比磁盘快很多; -2. Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用(Redis 线程模式后面会详细介绍到); -3. Redis 内置了多种优化过后的数据类型/结构实现,性能非常高; -4. Redis 通信协议实现简单且解析高效。 +1. **纯内存操作 (Memory-Based Storage)** :这是最主要的原因。Redis 数据读写操作都发生在内存中,访问速度是纳秒级别,而传统数据库频繁读写磁盘的速度是毫秒级别,两者相差数个数量级。 +2. **高效的 I/O 模型 (I/O Multiplexing & Single-Threaded Event Loop)** :Redis 使用单线程事件循环配合 I/O 多路复用技术,让单个线程可以同时处理多个网络连接上的 I/O 事件(如读写),避免了多线程模型中的上下文切换和锁竞争问题。虽然是单线程,但结合内存操作的高效性和 I/O 多路复用,使得 Redis 能轻松处理大量并发请求(Redis 线程模型会在后文中详细介绍到)。 +3. **优化的内部数据结构 (Optimized Data Structures)** :Redis 提供多种数据类型(如 String, List, Hash, Set, Sorted Set 等),其内部实现采用高度优化的编码方式(如 ziplist, quicklist, skiplist, hashtable 等)。Redis 会根据数据大小和类型动态选择最合适的内部编码,以在性能和空间效率之间取得最佳平衡。 +4. **简洁高效的通信协议 (Simple Protocol - RESP)** :Redis 使用的是自己设计的 RESP (REdis Serialization Protocol) 协议。这个协议实现简单、解析性能好,并且是二进制安全的。客户端和服务端之间通信的序列化/反序列化开销很小,有助于提升整体的交互速度。 > 下面这张图片总结的挺不错的,分享一下,出自 [Why is Redis so fast?](https://twitter.com/alexxubyte/status/1498703822528544770)。 diff --git a/docs/java/concurrent/images/java-thread-pool-summary/threadpoolexecutor构造函数.png b/docs/java/concurrent/images/java-thread-pool-summary/threadpoolexecutor构造函数.png deleted file mode 100644 index 6e3c7082eedf987b3a247caaf3fb81c752c15676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20107 zcmd43byQrz(l0tQ4DRj;GPt`0g2Ui2xXS>+-3h@pxI=*8?l8E!1$PUcpaBwykdRAq z&OPUR-&^mW_pNpB>)oqYbye+O*VL}AW)*wp_uB7W0G^V(qC5Zy1OR}K7vT3MARK`4 zw_##oVdCQ9;Ng-G5fT!S(2-F*UUYmk3^b3Ok3)!^g^s)>$x`FWLDzB)ri)oE`=XeiTYoi%}wOU%hNP1y<-7R`uuC zCt|XpV&|i*$6sgYKh0>f6#M}Jvn;pTsuQxUE}3cgwN&tl4k<7Zx2|zJ#39>tDsdTW}gLzIhzQ=^F2@7X1Cw^Uj*qq z6N?rW5i0-^RxkjI7XTQd`OA+Gt((o`=*vtEnC;71Fiz0$)j#Gk(Ent@V#emD`E5(5 z^;6EPn?eJ*kTWrXulkfq8z^`4q8{mr&jJI69av|uArC$LpI@cg27VXkeng~|JF^Mf zoK(Ce@<|u?$sZ5rL@*)vC%6y2qL_?0y?k^!>W|J&;da@%z9t%zi#(TNcfY=Vi0DOp zzgWrlR8CK~5|h6i-S)11bK3tH_k1#OUc)a>D9joz-@K6{m#*?|{==ru!0js|D#jnPLaOxfx17BP z1MBjxt#wE66726kp5XbF&&|fWc~H(??aY+hQJ);Chw$NF*!dr1e9a*30092sa=ZYg z7f9^9{dh-Xsaf}5q@&z<=@sD&W}fqruA}a9DOIf~0KQNm(}F+I;vFEJTDEBgAbX7Q z{&4^jioO*91x22mj2td(1;p^O&bRQq;SI#{>op4RzFz3vqtMOS&{iEr7cU)24A6|X z`J}jtu>MK*WU=4O1)s-cXCY^>^Eh^*rYeSq{eo_8YD}%y`8S|NF}d#L2bB{+qS)6n z2BVb3ohCWxNRo2?=D(6v-4uE=v{_XzkXN-t@h|L?DJQo6f3VLXnEGPSD$Qf zRX%RjO)=S{q(4vbU+u#S9GAyrK?eNW{>6SI9#aMQZ>9j@J%>D6-%+2G{~chqKGI;mCUgo} zlAW;trX?CYTOXA%f?t6QGN6#MEK3U4diDPQ#eO8vKkP^PW54$w3jqLBF}v_>Yo)(5 zW=2O#!CwlP&~+UFAP8>?ZVCnz%nOFem8)z69&jHO#r&K$3|E>Yx zlz6n06Au7-Y(Ovwfby7}A0!C7rHu0>3}tc)We(@%Ed@Z-5@xMeTVOlzvUg=q}*4Jonq! z4m&wu7d_1=yku%`u%$L1RE<#;#SyQwtGAAuDOdJE=H4`q&o>^UzPC?T7Mk8y~eI3x-cl5 zUldC0L3|qS-Dsr`1Ptykr>xX*-MT+)^p4B>+bp`j|7*9nL6Q2T?W|F_b&8}%+Sl%r zM3<9u4(TJ!BO!|AJ~rwZqJ}eat-4%=VvGtgO|T8!Ww&#V_g+jZGIx%>5uTZ-^*JlwR@}M|{6;^=f1sQZ%5@Rm`7<4E{`Zu9-(a{o<^{pOrTnGo3BiY?yr`24MB+yYf|UA){rX@XgqP7|6+WaNleC$Il5%ZxKDf*mB1 z0f%5Q6Fj+m4o1Dn^|2)ZG4|wGF-I!!7=n(C`3Ba?Oj55WwpS$=!QuT-I11UKB$QBO z^DoAo)AD>|^q@CuPt&l(;Bu241r6^9OiA*Ai&3f}V+IiveKHLQi8%)f3J&j@Ryfq` zN7G|$PW(+MPyfW`3-@S-_HLVEp%T`xW;VuE7KNfyij>O?Uc6sP55EFqG3-~Cgvj$o zs-4~@l-%lXZyLER(|fia1FC&pF)H;oVd2NX_|DU6ak5g5z>&CGArYiykr$*gu*1#N zJ9!npwH1tokvGRS_z4Ch!(=!;Lz>06HQjcuPNkP zawvr!21zEp^Uf=~Gc}{7R-ahDrB+Rjsk*A<^i;0VG~Vx72?&$UMP%jI>7{nRI?l5( zSc6o5I-c~Frp^bJ*|&KT=bPL*TzC$B4&nGH0k8`xhCOUWZsPZvL!T{0GI>tx^zzr_ zur~KF=hL2K+oNp+1HPPDp;MVJ-CZV^mTk7Z&57h_R+j4YxU?>?dt-O$Ex(bsKK_us z#M0(`eD-wBlxy+FD;Um2zDOdbjbp*eo>0r(C)&=_#YloLTSSXk{Cx5_PT>cyDzKbj z`g}9fb5mB01P?~9-sJ4_r63bX9-b~^aN@cMXzbLU+Q4*a`GS^7@0RbNt|9Mtdh#Em z3^CIXJ>{{p+xeELkHsb!+Xc2FD@}C_z197;%O1NMr-+u&)WVi*fzkoMu|#8IOJ4<$ zjiSlIIB|3f8j7niy(y+$?2o$Zo*@%TT1nBXS#kYgzIy9qi-*QWguyNCu&}}$ zNG++eQZ13}RuG&`FSD%Us4ghbf}g7C;dk}==z9YKF+wybRgz^Z zu;|74>^fX<#p59PUDoDIaZ?h}M)?9Z?XNkWbdEC#?h>lGt=$5e(a#LiZaWnG7c?63 zs(16O&kw<^(_FfYx%r?~g;Y>ReP*!98_HJ43=b5@cJz^qNbE1abHX9BU`k6rxaAzu zDY>MsJ##Vksb1{a@s@ypYnb>XiQD=T(6l$JxVFlnJ;8=bz`uh6{Uy6+EDfKk3PY<7Rqz} zRwJo|>{uXif3dDR>CzVOqsHOj zhjp$Sy&)uTq-@_qPTid7wjz@{J{KeBc}Qs?!NQP5JH}{Tli-j(siJ?u7_U`*Kew0- zX=}(j>#*f<5YqlI=YF7G|A|p5l%DSND6kxr$41YUTXba(US=7l+L`C1CR;Bl~+R~h#lc6R_{~c^x<6}i9wv-X0v1TShV|96z zEuze0&p}4=B2#6e%-#uyP4>%?$VOgV(L3eV8^QN(Y_BQGQtUll20J#A>v`1Hydu7Rhhe`V`n~lV8%LRcUYoj9)d`4~Sgr+Vn!obpGQ+XEQ4^H!#A!IeW8IuX zoUs@0`2{2D;EBqSj0(w)Yh#UFIhNPJ$x4Cli`Z2|H7_^Mom|EdJ(kgi4O#mzhszoZ z;()?b3|_L!mR}UE@GtN99moeqQytg8?*9VL=#OIRtgov2Rhy~ozgNH6Tx_}b;7qG- zs>>-csERbOoa75_t)V7=zJFiyWdS+^owh8mj`}|G3*m7P**25PSr&kH-}7VfU65)} z+n@BRY`OmS+pj`ir$^w7%Y}k^ z>3|QcYgz1}R(OtaM{b>%c1y;xy6!8V$XTC=8!1VDdJXoTzp-OSpQrF`85FFGS$`3 zmRrJs^uQQj4Z0?`&Mn?Lt7G|g3mcgIgl zZ(dwU&9AXCMw|zD>AjiD=MJnRAO%=(<5NlOW&Y>+b0C@)!XbApAkxLN7~j~tHX-~f z;K{Z3+IKlzD~Ucc%a2t()@*Yr?}=3x9bVUj>N>Hq*aLbA2DTNp-kw&mZHn?w=b6wV zP9GRO69$|%5j$Vns``YotHqV)h7=QWy8-~DDzJ5RjW^nHHMVpc9Q^P=l8xqNgkgZ? zx}yG2p7w%*b4mTmkBDENH4RQN<@IkB?ntkzhVuiKce}ruW472_^J^xc6VM+t?Zl$ zvR-YeKX!;T`$>*!+Isl@n{u2s4{U>Cl*JGfNZz65-^O*lS2gKFv2vQ&^$~_MPR<^F z-Ui*_geFTeohU-sz+J*88W=-M_MC2^IrA|k=wZiA3(K7~n?w@&rvBO*=Jx%bQ?V?` z!$gr6Jqnd70u8TIEp+PA*7fwg^cZy4Osb9Wx~TO6yE;3VGgVBBDU6J1<%cVxyq>xT z>gWlmi@L;DsQ%KESev6Ea>RHYUJROe(llnbfw~+{C=oRixKLbW`b+*KQ%dK|&NRZ( zF?W?0Z>F22BF&}&vBwGj& zj+Vd^9yG*tQGFi%qRdH%<6ivlR3_RT0I5BmJDVz#NbPN(K*VE@OQtCDXK9S6Fa zK-EfJ{r>YLH;IWJX*!d6WlgFHYBhocn(*hx(?+$ezKW~w-u{f0LAuDp{MOf|P~cy{ zfV4Q#X5D2Mlj9vGGJip9#>Z2!^X}ym%7Ij~)eqcC2DBz3m_sr6_}&YZY1N?6}( z^=6c0gUm}uA?yp0jWv~;c**VLRT7Y)2xFC6+Sl4xoP3rJ8|5zIm{(?@rGs$YPuNkR zHSF�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