Redis 的持久化机制是什么?各自的优缺点是什么?

[复制链接]
查看6208 | 回复0 | 2022-4-9 16:31:01 | 显示全部楼层 |阅读模式
面试官今天要不来聊聊Redis的持久化机制吧?$ j/ }2 M. E# D
候选者:嗯,没问题的
3 c2 v8 X3 O$ {$ _. g9 ~候选者:在上一次面试已经说过了Redis是基于内存的
7 c5 [) k- M+ w$ l候选者:假设我们不做任何操作,只要Redis服务器重启(或者中途故障挂掉了),那内存的数据就会没掉
( c& f' M6 O) `2 X4 i& w$ j" N候选者:我们作为使用方,肯定是不想Redis里头的数据会丢掉9 i3 ~% E& `6 u9 J/ m2 e1 m
候选者:所以Redis提供了持久化机制给我们用,分别是RDB和AOF
. R% L3 g" W# z! s0 K) f6 A* R2 U( O1 a9 ~3 h2 ]8 W
Redis 的持久化机制是什么?各自的优缺点是什么?-1.jpg 4 `2 e0 ~+ g- I; s* c- K

! a. k0 b; @4 g; g0 L4 S候选者:RDB指的就是:根据我们自己配置的时间或者手动去执行BGSAVE或SAVE命令,Redis就会去生成RDB文件" |& W; }) _* a" P2 d' v9 c
候选者:这个RDB文件实际上就是一个经过压缩的二进制文件,Redis可以通过这个文件在启动的时候来还原我们的数据4 O5 s2 Q" _7 ^
候选者:而AOF则是把Redis服务器接收到的所有写命令都记录到日志中/ d' m" Y1 Z3 m8 {
候选者:Redis重跑一遍这个记录下的日志文件,就相当于还原了数据
/ w1 M' m2 Z' D& p! T2 y* I0 J) L: Y* I
Redis 的持久化机制是什么?各自的优缺点是什么?-2.jpg
. O$ f& A7 m5 |" y" g6 }
" }$ [- R- T. W2 m0 e面试官那我就想问了,你上次不是说Redis是单线程吗' c$ y$ [* V2 I$ G2 b+ P3 Q3 S: c
面试官那比如你说的RDB,它会执行SAVE或BESAVE命令,生成文件" {. O* x8 x8 f; y* O
面试官那不是非常耗时的吗,那如果只有一个线程处理,那其他的请求不就得等了?2 b0 X5 c4 u, S6 e9 V
候选者:嗯,没错,Redis是单线程的。
  ?: A# c7 a" r4 Q" \  ~候选者:以RDB持久化的过程为例,假设我们在配置上是定时去执行RDB存储; [& C2 a" o; X5 |) ^
候选者:Redis有自己的一套事件处理机制,主要处理文件事件(命令请求和应答等等)和时间事件(RDB定时持久化、清理过期的Key等的)) U2 \% G9 j, J8 h, V; L; l1 O9 w
候选者:所以,定时的RDB实际上就是一个时间事件
6 B) c; S1 n$ X! U候选者:线程不停地轮询就绪的事件,发现RDB的事件可执行时,则调用BGSAVE命令
4 `) ]3 ]+ L2 W1 o8 U候选者:而BGSAVE命令实际上会fork出一个子进程来进行完成持久化(生成RDB文件)
+ S# P* k6 q- f* X' ]$ |3 x4 ~9 h  k% T: i! R& u
Redis 的持久化机制是什么?各自的优缺点是什么?-3.jpg & _8 y0 L2 ]# n# Q

& G0 J/ B% N) h2 @/ O候选者:在fork的过程中,父进程(主线程)肯定是阻塞的。
- M$ q3 i2 M6 v, U候选者:但fork完之后,是fork出来的子进程去完成持久化。处理请求的进程该干嘛的就干嘛- Q. L, u, D/ P
候选者:所以说啊,Redis是单线程,理解是没错的,但没说人家不能fork进程来处理事情呀,对不对% }* p/ R3 w8 C% a
候选者:还有就是,其实Redis在较新的版本中,有些地方都使用了多线程来进行处理
, ]- k' h* @, ?; L+ @, D' Y. [+ w6 c候选者:比如说,一些删除的操作(UNLINK、FLUSHALL ASYNC等等)还有Redis 6.x 之后对网络数据的解析都用了多线程处理了。! M' W9 \( V4 n$ {8 f
候选者:只不过,核心的处理命令请求和响应还是单线程。
! `2 \- z* j1 B: k2 K2 X
. T! C0 E6 y! v( n6 @& m Redis 的持久化机制是什么?各自的优缺点是什么?-4.jpg
' s( \, b) L) q4 R2 b% e4 \4 }7 V1 R. y$ J3 i1 _' g
面试官那AOF呢?AOF不是也要写文件吗?难道也是fork 了个子进程去做的?1 s. x' F. h8 V1 n* u& ~2 a
候选者:emm,不是的。AOF是在命令执行完之后,把命令写在buffer缓冲区的(直接追加写)7 V# I$ R) K' p- t9 h5 M; n, F
候选者:那想要持久化,肯定得存盘嘛。Redis提供了几种策略供我们选择什么时候把缓冲区的数据写到磁盘; a8 {9 t2 A5 x: ^1 A; h) _
候选者:我记得有:每秒一次/每条命令都执行/从不存盘;一般我们会选每秒一次/ U9 I5 C5 K6 N( E5 l
候选者:Redis会启一个线程去刷盘,也不是用主线程去干的
( i- L6 C( s7 K+ `3 j" A3 ]9 d6 _面试官那如果把执行过的命令都存起来
) t1 o7 B1 \6 A* S3 S: w面试官等启动的时候是可以再把这些写命令再执行一遍,达到恢复数据的效果
# [$ v  T4 w; E4 I$ d- `面试官这样会有什么样的问题吗?
$ S. R  K1 m  k  W. i# J2 B候选者:嗯,问题就是,如果这些写入磁盘的「命令集合」不做任何处理,那该「命令集合」就会一直膨胀
" I! g/ Q6 e3 q1 h  w候选者:其实就是该文件会变得非常大
3 F$ P1 C, a$ n" {+ ?6 U2 _& {候选者:Redis当然也考虑了这一点,它会fork个子进程会对「原始」命令集合进行重写2 F1 n1 Z! e$ a' z
候选者:说白了就是会压缩,压缩完了之后只要替换原始文件就好了
  ~  f  ^) O* T' t5 p
% T( @1 y5 T1 K& e& `" H: \ Redis 的持久化机制是什么?各自的优缺点是什么?-5.jpg
+ q; b$ T  Q& \+ x
8 g0 G4 ?8 x# K* n面试官那我又想问了,既然它是fork一个进程来对AOF进行重写的. c( X2 f# Y' ~1 x' a
面试官前面你也提到了再fork时,主进程是阻塞的,但fork后,主进程会继续接收命令. |; B+ Q& k6 k- d
面试官你是说重写完(压缩)会进行文件覆盖
% P1 I& C1 s. u) D# U, O- V面试官那这样不会丢数据吗?毕竟主进程在fork之后是一直会接收命令的
% @2 W* d; I, d候选者:哦,我明白你的意思了。
3 ~% l! U/ R: [- q8 O' h候选者:其实做法很简单啊,在fork子进程之后,把新接收到命令再写到另一个缓冲区不就好了吗
0 Q5 Z2 K) Y, p. E) Z. O面试官:可以! m& K" L4 f! C
面试官:那AOF和RDB用哪一个呢?
+ ^/ h3 p! z7 t4 s) }候选者:主要是看业务场景吧,我们这边是基于Redis自研了一套key-value存储
# O: i7 v* H+ Q$ |1 w面试官自研的?你们的Redis架构是什么?8 c2 ~5 s( y. R* z
候选者:别别别,当我没说。就是开源的,开源的。我们回到RDB和AOF上吧。
+ T4 y& g2 V2 [) q/ O% S候选者:在新增namespace(实例) 的时候也会让你选择对应的使用场景
! u0 M% L6 ^, u; E, k候选者:就是会让你通过不同的应用场景进行配置选择4 k+ E0 r" m0 S& I( B' {
候选者:比如说,业务上是允许重启时部分数据丢失的,那RDB就够用了(:+ i8 O3 `' E9 b& u
候选者:RDB在启动的时候恢复数据会比AOF快很多
" w7 R8 G* i; Y" e+ H1 B候选者:在Redis4.0以后也支持了AOF和RDB混合
2 K* }. b! d* f% |  v4 Q! U! o6 y& ^3 {+ R
Redis 的持久化机制是什么?各自的优缺点是什么?-6.jpg   _  ?% X( _5 k7 T

  G3 M, O$ o) O+ U# t$ {: o候选者:在官网是不建议仅仅只使用AOF的,如果对数据丢失容忍度是有要求的,建议是开启AOF+RDB一起用( M7 \" U( U3 H  l5 o
候选者:总的来说,不同的场景使用不同的持久化策略吧
# Z5 v9 }0 M3 t, d5 f( `面试官:了解4 \2 n$ o/ n/ N6 T  o( S$ r
面试官顺便我想问下,假如Redis的内存满了,但业务还在写数据,会怎么样?. v! {+ H( [( c) T9 }
候选者:嗯,这个问题我也遇到过
5 m) U; U- F6 A. e. T7 b0 L: i3 L候选者:一般来说,我们会淘汰那些「不活跃」的数据,然后把新的数据写进去7 e1 q4 Y3 e$ {: j7 J7 V3 {5 M
候选者:更多情况下,还是做好对应的监控和容量的考量吧
5 d- e! {5 o1 S/ o+ W候选者:等容量达到阈值的时候,及时发现和扩容
7 o* V7 H+ X7 T0 e% o面试官:你这懂得有点多啊
# F' I2 b- |4 P; A/ Z本文总结
& d( c& y" f7 x4 o, [: [
    9 J$ g' z" C7 P6 F
  • Redis持久化机制:RDB和AOF( _6 @# r3 k! t
  • RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制)9 K+ p* }$ s: a( F3 j9 Z7 H
  • AOF持久化:根据配置将写命令存储至日志文件中,顺序写&&异步刷盘(子线程),重写AOF文件也是需要 fork 子进程。Redis4.0之后支持混合持久化,用什么持久化机制看业务场景
    3 e+ ?! c9 a4 k
% o! U1 F4 P# h+ o6 F. p1 D# O
Redis 的持久化机制是什么?各自的优缺点是什么?-7.jpg
* B3 u0 o" ?& c我最近一直在连载《对线面试官》系列,目前已经连载38篇啦!一个说人话的面试系列!* l6 }- @! x1 y+ R7 x" Z
    + M& q/ }0 z$ f5 }9 |
  • 【对线面试官】HTTP; M5 n$ |' E6 i3 F) J0 _
  • 【对线面试官】Java注解8 x) V. E3 L1 b/ }$ }0 D
  • 【对线面试官】Java泛型
    - |+ W' i( o6 @" [
  • 【对线面试官】 Java NIO
    * i) O( i! J0 Z
  • 【对线面试官】Java反射 && 动态代理
    & [$ e. g: y# d9 Q* c! S
  • 【对线面试官】多线程基础
    5 D' r/ c  ]1 _* i, G& `
  • 【对线面试官】 CAS" ^4 ~5 ^8 s# D0 f$ \* [
  • 【对线面试官】synchronized9 k  O- `) `3 r- h
  • 【对线面试官】AQS&&ReentrantLock6 L. b. Q7 @% D) w- K) t
  • 【对线面试官】线程池4 t& ]. {& V. B' {: d
  • 【对线面试官】ThreadLocal
    $ P9 N8 n8 M* {6 D0 f$ g! A
  • 【对线面试官】CountDownLatch和CyclicBarrier6 i7 o7 g/ S3 }+ H
  • 【对线面试官】为什么需要Java内存模型?
    6 E8 L1 J5 @5 [1 U- Z7 H& h1 d0 C
  • 【对线面试官】深入浅出 Java 内存模型2 s8 s3 e# ^$ I8 `. P8 J# P
  • 【对线面试官】Java从编译到执行,发生了什么?" V0 U1 p! l- w3 `! w
  • 【对线面试官】双亲委派机制' S! D4 j, t$ {  O+ T" }! z
  • 【对线面试官】JVM内存结构
    ' Q. Y" L3 N9 ~8 D7 c! d7 X
  • 【对线面试官】垃圾回收机制
      F! D' ]: R$ y+ _4 S: f
  • 【对线面试官】CMS垃圾回收器" ^) U; S, P2 s+ j3 U# O# ]
  • 【对线面试官】G1垃圾收集器8 |$ f3 g4 I- h) O
  • 【对线面试官】JVM调优2 j0 X3 p# U" p0 B0 y
  • 【对线面试官】List
    # ?1 L) T- ]/ G. T! s7 Q  L
  • 【对线面试官】Map
    8 _/ [. c# E' r2 C' v+ a3 P
  • 【对线面试官】SpringMVC3 h$ S5 A. ^+ J. H& y2 e8 m
  • 【对线面试官】Spring基础1 G" B) v- b- T. {" [# I. f
  • 【对线面试官】SpringBean生命周期0 c: O: a1 E2 y
  • 【对线面试官】Redis基础, F- g1 Y& R) ?7 [/ C9 F
  • 【对线面试官】Redis持久化
    + a, e2 ^* `/ K; Y% A# j8 G
  • 【对线面试官】Redis主从架构
    8 @6 @% Q+ P) M( t; h4 _. n
  • 【对线面试官】Redis分片集群
    9 S1 n4 E/ Q" g9 E) q
  • 【对线面试官】Kafka基础8 _1 _4 R* W: r% l
  • 【对线面试官】使用Kafka会考虑什么问题?
    % V6 t$ F# x( ]' {
  • 【对线面试官】MySQL索引
      J* I4 r2 Z# U8 |6 e* p; ~
  • 【对线面试官】MySQL 事务&&锁机制&&MVCC' d' f5 u, g# ]3 W: S) q
  • 【对线面试官】MySQL调优
    % Y1 s5 [/ ^- q, `
  • 【对线面试官】如何实现幂等和去重?1 a* l  r/ B! I9 a1 t0 L
  • 【对线面试官】系统需求多变时,如何设计' q  s0 x$ L! E; W
  • 【对线面试官】设计模式
    2 j9 @3 p! E0 J( A
  • ..., U. L: @8 E' R# @, E+ }0 S% ?
【大厂面试知识点】、【简历模板】、【原创文章】电子书,共有1263页
$ D" r: ?' C, N" v2 C. |: Z我把这些上传到网盘,你们有需要直接下载就好了。做到这份上了,不会还想白嫖吧点赞转发又不用钱。  K! w# R% U0 p# v' `
  \1 S+ z6 L% z% c1 F8 _
Redis 的持久化机制是什么?各自的优缺点是什么?-8.jpg ! j; l& s' _7 \: M! J

6 e- y" w3 }/ B$ F% |链接:pan.baidu.com/s/1pQTuKBYs… 密码:3wom7 A* `) |1 a; ^# r
不会有人刷到这还想白嫖吧?不会吧?点赞对真的我很重要!要不加个关注? @Java3y
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

206

金钱

0

收听

0

听众
性别

新手上路

金钱
206 元