From 066a24755b4f7f21851b95654644c8f1bcc99978 Mon Sep 17 00:00:00 2001 From: guide Date: Wed, 24 Aug 2022 18:10:02 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20=20improve]=20redis=20=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=A8=A1=E5=9E=8B&=E6=8C=81=E4=B9=85=E5=8C=96?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/redis/images/aof.jpeg | Bin 0 -> 13772 bytes .../redis/images/redis-event-handler.png | Bin 18061 -> 17276 bytes docs/database/redis/redis-questions-01.md | 66 ++++++++++++------ 3 files changed, 46 insertions(+), 20 deletions(-) create mode 100644 docs/database/redis/images/aof.jpeg diff --git a/docs/database/redis/images/aof.jpeg b/docs/database/redis/images/aof.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6cb072a30c9473fc594316631bf7178bcd0ae510 GIT binary patch literal 13772 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 R6{x)%l^qM=vgu~(e*u`G=QscW literal 0 HcmV?d00001 diff --git a/docs/database/redis/images/redis-event-handler.png b/docs/database/redis/images/redis-event-handler.png index e6ab67021e2e4079539b0a22d6cac62925c4ba23..f455e6788872b8252a089240c243439faf2738f6 100644 GIT binary patch literal 17276 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 KMNUMnLSTY)@qVlT literal 18061 zcmYg%byQT}7cU_xATYFofH0&=r-Xo%fJltM0Ma#dHwZ(g(jC$;^bB1?cgfJL)X+-T zV%0|NsahJk@Oi;w*{Vq~CV zih+UkNnJ(j!^6YF`povi&h5kL$ivpi6k{ z0SyfeOpMGC-=e7~0aw@80CI}4?q94dKxwJ>d^`eOU0t*^v`x;u1szI`}fbt(4+(2GraU~Y;0_3Xy`{|GFV6d*TB4ee5Z@8yQC=Z($do5 z{!w)?99B@9n^F+u6WZL|ymN3qGc)6z))x~K1AN7>v9XccFprCiTi-dE_Oqs>a~%eQ zS)1CnwY9n18UFe6M@3mRu57X*t}(;AjGKdH5Vdo;+M_71gq%4-HV*W+j_l90HkBtP z!Y146Q{5fCK7GR(6Tx@6MIKOdJ+`14G`aLe( zS^mAq1`2+&F_@q5&Frh??a@$5T!x)%Kt{YzY@l;*Z*NFQh=YSee?v~VpIy@^y0YhY zUGIvwvx%{es-}v}OlNr)EZxG^eQC1#=g*(JOU=vuHAWT=ldFHn+hzwFrn;*}ZVvn4 znO$4sjf$#TO}#Ux3&^9*4vjBgy}m_vj4U6Za=%3+E;sAJ8V7bKqs`6DBYxyupYN>p zdahLq&gT;Cb(-xBc~l{n;?s(py@Icf=g&5)IPJK6Ffe4Vl;qxPc`ocPciC)6zrZ~{ zIwiv{QpRe2&&0)E0Ig)CQE%<}$kCo4R{2 zvP?#BI|M7k2FSkvt7KZ` z`}mlgjl+pJC8hD5Wd7E9Ch-4bf{Lu$egCk?3MG9T{qCu5Vip~oR0jVZSKi4RGOH9v2?ssu-dycMzYWMvEgJX$lE?cNFyb%u! z8y!Le=Y`djMh>D0=G_|sDG8+u%bVEu-h*yI_%5#hZo2oY0lQMAf5Q4itetV~)n;dg2`ui#|TfJ3?* zBerrDxh=B};8GShBXmGE$@&7HN$$;5GtmjHw>bXy*PBl#TJL}>7|IGR_v+woqAil8#PJ8}oQ={g43`6M*3y2Ue zoKJ}T_Z&PyCK4=ti+kUcodU8ajwNDyQX71K-4m|)%7(OL&|)xsRk3C$_>kyYlM z0Bm+C5oF>rwKZ(Q`#XvZu&$h=rn;i?Tq*ry=B0ly-Q4k=*m6_~!KzdrsNi8PxANZM z<&=$z1D!ChkUg`}FaX@DYJ+5k=y@j0s0z|8YyB9IL{~Q=o%F!Jy5}~$Y+uW{$bYU* z$0i}(pQlkxw4PD&1s>eSF!Ys-f!h?tEVE+u?A1 zt=`O4o8DrvVBR-^i>Y+S2CLIFNw(ssyQJgB)wk%`XTNUlT3BFAIgL(wg+OlSB40_^ z`wIQfcIl|RL4tJdMT9}+JTGNjtTGQBWv+Dd+o`f~ixaXs*Oi6(q>Uo;#bIYF;kPgX zNR0E`R+78XIOl>Sj3GxLur~{|P-J6Z7m)4>0;Sz5wrSOwR)DygJHlpj9m4L8f2PH0OSp~Hce=s72DiS)mX z=sm7X$I`cg>>2q@Xj2Z_`7$z#hNZM#}`Q2)Z_9hBW0p= z!J!_bJVXRG`hBW|HOnFqj|xvhjpPEnobHs`;C<%Z)~CA^JAIq+uf8#0;%vthMIdag zc9GdFJ&xfb2{A?&(EZDT{(^p3IUYeY`y@r$&?EY&a;NmRzl*!3AM5_a-RM$I&DptHGn!CQVWPl}`1I<5G``3E^R2hF z-p9Orw9>3x#V63_;cx$P3pW$&^G!sAkm-s=9dBrcPO#Yn(hUj7E|G!(4v)hM$JkW- zr?b0jl7Da}TxvuwwxyRYh&^q%sS!Le`IGm)GC&DZLv<2?=P5oVFvyr|pDvb_A3FSR z<8S1^j?h*~t@q4!zEz9$&L+0Q_L`S1NyW3j_QZ0Z(I`zMrY5;|CcC zp{Tt5Uk=fW8oW{4f^`&~ou*gA*GKRf@+Y3hHz
  • BXEy)_CKMzZiP@TTYGaNW+@( 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 BITOP and desk1 20210308 20210309 @@ -193,7 +193,7 @@ Redis 中有一个叫做 `sorted set` 的数据结构经常被用在各种排行 (integer) 1 ``` -统计 20210308~20210309 在线活跃用户数: +统计 20210308~20210309 在线活跃用户数: ```bash > BITOP or desk2 20210308 20210309 @@ -218,6 +218,8 @@ PFCOUNT PAGE_1:UV ## Redis 线程模型 +对于读写命令来说,Redis 一直是单线程模型。不过,在 Redis 4.0 版本之后引入了多线程来执行一些大键值对的异步删除操作, Redis 6.0 版本之后引入了多线程来处理网络请求(提高网络 IO 读写性能)。 + ### Redis 单线程模型了解吗? **Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型** (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file event handler)。由于文件事件处理器(file event handler)是单线程方式运行的,所以我们一般都说 Redis 是单线程模型。 @@ -230,8 +232,8 @@ Redis 通过 **IO 多路复用程序** 来监听来自客户端的大量连接 另外, Redis 服务器是一个事件驱动程序,服务器需要处理两类事件: -- **文件事件(file event)** :用于处理 Redis 服务器和客户端之间的网络IO。 -- **时间事件(time eveat)** :Redis 服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是处理这类定时操作的。 +- **文件事件(file event)** :用于处理 Redis 服务器和客户端之间的网络 IO。 +- **时间事件(time eveat)** :Redis 服务器中的一些操作(比如 serverCron 函数)需要在给定的时间点执行,而时间事件就是处理这类定时操作的。 时间事件不需要多花时间了解,我们接触最多的还是 **文件事件**(客户端进行读取写入等操作,涉及一系列网络通信)。 @@ -258,19 +260,19 @@ Redis 通过 **IO 多路复用程序** 来监听来自客户端的大量连接 虽然说 Redis 是单线程模型,但是,实际上,**Redis 在 4.0 之后的版本中就已经加入了对多线程的支持。** +不过,Redis 4.0 增加的多线程主要是针对一些大键值对的删除操作的命令,使用这些命令就会使用主线程之外的其他线程来“异步处理”。 + +为此,Redis 4.0 之后新增了`UNLINK`(可以看作是 `DEL` 的异步版本)、`FLUSHALL ASYNC`(清空数据库)、`FLUSHDB ASYNC`(清空数据库)等异步命令。 + ![redis4.0 more thread](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/database/redis/redis4.0-more-thread.png) -不过,Redis 4.0 增加的多线程主要是针对一些大键值对的删除操作的命令,使用这些命令就会使用主处理之外的其他线程来“异步处理”。 +大体上来说,Redis 6.0 之前主要还是单线程处理。 -大体上来说,**Redis 6.0 之前主要还是单线程处理。** +**那 Redis6.0 之前为什么不使用多线程?** 我觉得主要原因有 3 点: -**那,Redis6.0 之前为什么不使用多线程?** - -我觉得主要原因有下面 3 个: - -1. 单线程编程容易并且更容易维护; -2. Redis 的性能瓶颈不在 CPU ,主要在内存和网络; -3. 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。 +- 单线程编程容易并且更容易维护; +- Redis 的性能瓶颈不在 CPU ,主要在内存和网络; +- 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。 ### Redis6.0 之后为何引入了多线程? @@ -292,8 +294,9 @@ io-threads 4 #官网建议4核的机器建议设置为2或3个线程,8核的 推荐阅读: -1. [Redis 6.0 新特性-多线程连环 13 问!](https://mp.weixin.qq.com/s/FZu3acwK6zrCBZQ_3HoUgw) -2. [为什么 Redis 选择单线程模型](https://draveness.me/whys-the-design-redis-single-thread/) +- [Redis 6.0 新特性-多线程连环 13 问!](https://mp.weixin.qq.com/s/FZu3acwK6zrCBZQ_3HoUgw) +- [为什么 Redis 选择单线程模型](https://draveness.me/whys-the-design-redis-single-thread/) +- [Redis 多线程网络模型全面揭秘](https://segmentfault.com/a/1190000039223696) ## Redis 内存管理 @@ -388,18 +391,25 @@ Redis 可以通过创建快照来获得存储在内存里面的数据在某个 快照持久化是 Redis 默认采用的持久化方式,在 `redis.conf` 配置文件中默认有此下配置: ```clojure -save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。 +save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。 -save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。 +save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。 -save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。 +save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。 ``` +### RDB 创建快照时会阻塞主线程吗? + +Redis 提供了两个命令来生成 RDB 快照文件: + +- `save` : 主线程执行,会阻塞主线程; +- `bgsave` : 子线程执行,不会阻塞主线程,默认选项。 + ### 什么是 AOF 持久化? 与快照持久化相比,AOF 持久化的实时性更好,因此已成为主流的持久化方案。默认情况下 Redis 没有开启 AOF(append only file)方式的持久化,可以通过 appendonly 参数开启: -```conf +```clojure appendonly yes ``` @@ -409,7 +419,7 @@ AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数 在 Redis 的配置文件中存在三种不同的 AOF 持久化方式,它们分别是: -```conf +```clojure appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度 appendfsync everysec #每秒钟同步一次,显式地将多个写命令同步到硬盘 appendfsync no #让操作系统决定何时进行同步 @@ -422,6 +432,22 @@ appendfsync no #让操作系统决定何时进行同步 - [Redis 的 AOF 方式 #783](https://github.com/Snailclimb/JavaGuide/issues/783) - [Redis AOF 重写描述不准确 #1439](https://github.com/Snailclimb/JavaGuide/issues/1439) +### AOF 日志是如何实现的? + +关系型数据库(如 MySQL)通常都是执行命令之前记录日志(方便故障恢复),而 Redis AOF 持久化机制是在执行完命令之后再记录日志。 + +![图片来自《Redis 核心技术与实战》](./images/aof.jpeg) + +**为什么是在执行完命令之后记录日志呢?** + +- 避免额外的检查开销,AOF 记录日志不会对命令进行语法检查; +- 在命令执行完之后再记录,不会阻塞当前的命令执行。 + +这样也带来了风险(我在前面介绍 AOF 持久化的时候也提到过): + +- 如果刚执行完命令 Redis 就宕机会导致对应的修改丢失; +- 可能会阻塞后续其他命令的执行(AOF 记录日志是在 Redis 主线程中进行的)。 + ### AOF 重写了解吗? AOF 重写可以产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。