首页 > 数据库 >java面试题--Redis

java面试题--Redis

时间:2023-05-18 22:24:33浏览次数:42  
标签:AOF 面试题 缓存 文件 -- redis Redis 命令

一、说一下redis的持久化机制原理?

  1. RDB文件: redis database。存储的是某个时间点的数据库内容的快照,是结果。
    1. redis默认的持久化策略。
    2. 落盘策略:使用SAVE或者BGSAVE命令。(1)SAVE: 有主线程执行,会阻塞客户端。(2)BGSAVE:会fork出一个子进程,不会出现阻塞问题。子进程使用写时拷贝的策略,子进程页表项指向与父进程页表项相同的物理内存页,所以不会占用大量的内存。 可以使用命令配置自动执行落盘的条件。例如:save 900 2  900秒之内至少有2次修改就执行BGSAVE。
    3. 恢复策略:自动加载。redis在启动时检测是否存在RDB文件,存在的话,就载入。在载入完成之前,服务对外不可用。
  2. AOF文件:AppendOnlyFile。存储的执行成功过的命令、参数。是过程。
    1. 落盘策略:分为三个阶段。(1)命令传播:命令、参数传播到AOF程序。(2)缓存追加:协议文本追加到aof_buf末尾。(3)文件写入和保存:调用faof.c/flushAppendOnlyFile 函数。这个函数执行以下两个工作:1、WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件。2、SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
    2. 三种保存模式:(1)AOF_FSYNC_NO:不保存。WRITE 都会被执行, 但 SAVE 会被略过。(2)AOF_FSYNC_EVERYSEC:每一秒钟保存一次(默认)。(3)AOF_FSYNC_ALWAYS:每执行一个命令保存一次。(不推荐)
    3. AOF重写:名称BGREWRITEAOF
      1. Redis可以在 AOF体积变得过大时,自动地在后台(Fork子进程)对 AOF进行重写。
      2. Redis 增加了一个 AOF 重写缓存, 这个缓存在 fork 出子进程之后开始启用,Redis 主进程在接到新的写命令之后, 除了会将这个写命令的协议内容追加到现有的 AOF 文件之外,还会追加到这个缓存中。
      3. 当子进程在执行 AOF 重写时, 主进程需要执行以下三个工作:

        1. 处理命令请求。
        2. 将写命令追加到现有的 AOF 文件中。
        3. 将写命令追加到 AOF 重写缓存中。
      4. 当子进程完成 AOF 重写之后, 它会向父进程发送一个完成信号, 父进程在接到完成信号之后, 会调用一个信号处理函数, 并完成以下工作:

        1. 将 AOF 重写缓存中的内容全部写入到新 AOF 文件中。

        2. 对新的 AOF 文件进行改名,覆盖原有的 AOF 文件。

        3. Redis数据库里的+AOF重写过程中的命令------->新的AOF文件---->覆盖老的。

        4. 当步骤 1 执行完毕之后, 现有 AOF 文件、新 AOF 文件和数据库三者的状态就完全一致了。
          当步骤 2 执行完毕之后, 程序就完成了新旧两个 AOF 文件的交替。

    4. AOF恢复策略:
      1. 创建一个不带网络连接的伪客户端(fake client):因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服 务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令 的效果和带网络连接的客户端执行命令的效果完全一样。

      2. 从AOF文件中分析并读取出一条写命令。

      3. 使用伪客户端执行被读出的写命令。

      4. 一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止。

  3. RDB和AOF混合
    1. 使用RDB头+AOF部分。如果AOF文件以REDIS开头,则先执行RDB的数据快照。再执行AOF命令。

二、说一下对redis缓存雪崩、穿透、击穿的理解?

  1. (1)缓存穿透:大量请求根本不存在的key。(2)缓存击穿:redis中一个热点key过期。(3)缓存雪崩:redis中大量key集体过期。
  2. 缓存穿透解决方案:
    1. 对空值进行缓存,但是过期时间很短。最长不超过5分钟。
    2. 使用布隆过滤器:将所有可能存在的数据哈希到一个足够大的BITMAP中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
    3. 网警。
  3. 缓存击穿解决方案:
    1. 加锁:在未命中缓存时,通过加锁避免大量请求访问数据库(只有一个线程可以进行热点数据的重构)。
    2. 不允许过期:物理不过期,也就是不设置过期时间。而是逻辑上定时的在后台异步的更新数据。
    3. 采用二级缓存。L1缓存失效时间短,L2缓存失效时间长。请求优先从L1缓存获取数据,如果未命中,则加锁,保证只有一个线程从数据库中读取数据,并更新到L1和L2缓存中。其他线程依然到L2缓存中获取数据。
  4. 缓存雪崩解决方案:
    1. 用加锁或者队列的方式保证缓存的单线程(进程)写。
    2. 将缓存失效时间分散开。比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机。
    3. 事前:这种方案就是在发生雪崩前对缓存集群实现高可用。如果是使用redis,可以使用主从+哨兵、Redis Cluster来避免redis全盘崩溃的情况。
    4. 事中:使用Hystrix进行限流和降级。比如设置允许一秒2000个请求通过该组件,那么过来5000个请求时,有3000个请求会走限流逻辑,然后去调用我们自己开发的降级组件,比如设置一些默认值,以此来保护最后的MySQL不会被大量请求打死。
    5. 事后:开启redis持久化机制,尽快恢复缓存集群。

三、redis的集群模式?

  1. 主从复制模式。
    1. 一主多从。
    2. 无法实现故障转移。  
  2. 哨兵模式。
    1. 一主多从。
    2. 故障转移步骤:
      1. master主观下线;
      2. master客观下线;
      3. Sentinel集群选举出Leader;
      4. Leader指定一个新的master。
  3. Jedis Cluster模式。
    1. 多主多从。

 

标签:AOF,面试题,缓存,文件,--,redis,Redis,命令
From: https://www.cnblogs.com/aleda-territory/p/17335957.html

相关文章

  • 5.18打卡
    一、实验内容定义一个Dog类,包括体重和年龄两个数据成员及其成员函数,声明一个实例dog1,体重5,年龄10,使用I/O流把dog1的状态写入磁盘文件。再声明一个实例dog2,通过读取文件dog1的状态赋给dog2。分别用文本方式和二进制方式操作文件。二、实验代码#include<bits/stdc++.h>usingna......
  • 2D机械手手眼标定
    2D情况下机械手手眼标定就是计算机械手坐标和图像坐标之间的仿射变换。如果机械手坐标平面和图像坐标平面不平行的话还会有透视变换,也叫单应性变换,但这里不考虑透视的情况。在标定的时候机械手坐标是机械手系统返回的坐标;而图像坐标一般是基于模板的定位算法返回的坐标。二者的坐......
  • 创新案例 | 肆拾玖坊白酒0到20亿增长是传销还是创新
    01.背景介绍中国证券报引用公开数据显示,2016年,规模以上白酒企业数量为1578家,2021年,这一数字下降到965家。同时,白酒产能逐年向优势产区集中,头部企业市场占有率不断提高。2021年,茅台、五粮液等8大头部酒企产量占全国白酒产量的20.67%,营收占比达45.89%,利润占比达58.18%。是中......
  • 05 高级光照
    一、Blinn-Phongmodel冯氏模型的镜面反射采取了观察方向与反射方向的夹角,这样会造成当夹角大于九十度时,就会造成镜面反射光为零,这样一般情况下问题不大,但是当镜面反射的glossy程度比较大时,就会出现镜面反射边缘的截断现象。Blinn-Phongmodel改用半程向量与法线的夹角,解决了问......
  • CTF 在线平台 wp
    1.逆向1.easyre先用虚拟机看看是多少位的文件; 拖进IDA看看,一下子就出来了; 2.reverse1先用虚拟机看看是多少位的文件;打开IDA,查找字符串;点击View->Opensubviews->Strings然后观察伪代码所有的’o’全都变成’0‘;flag{hell0_w0rld}3.reverse2一样的看看文件是......
  • Sentinel基本使用与源码分析
    系列文章目录和关于我一丶什么是SentinelSentinel官网Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。流量整形:限制流......
  • Manacher
    Manacher的几个模板模板一前后插入不等的特殊字符(不用写越界的判断条件)中间用#隔离(不用判断奇偶)#include<bits/stdc++.h>usingnamespacestd;constintN=22000005;chars[N],t[N];intcnt,mr,mid,len[N];voidbuild(){ cin>>s; t[++cnt]......
  • 浅谈一类信息的暴力重构手法
    loj#6515.「雅礼集训2018Day10」贪玩蓝月背包支持类似栈的加入与撤销(由于是最优化,不太能直接删除),而题目要求维护双端队列式的操作,这是一个经典问题——双栈模拟双端队列(也叫bakatrick)。直接给出方法:维护两个栈,两栈的拼接即为我们维护的队列,照常进行大部分操作,若某一栈在空......
  • html基础
    一、div样式1、style设置css样式(扩展了解style标签)2、align设置div盒子内的内容居中、居左、居右3、id 引人外部对应#(井号)选择符号样式4、class 引人外部对应.(句号)选择符号样式5、title设置div(标题)鼠标经过时显示文字(扩展了解 title标签)3、id案例<!DOCTYPEhtml......
  • 数论分块
    数论分块数论分块就是一个小结论对于一个常数n,和一个给定的数i(\(i<n\)),能使\[\lfloor{\frac{n}{i}}\rfloor=\lfloor{\frac{n}{j}}\rfloor\]的最大整数j(\(i\lej\len\))为\(\lfloor{\frac{n}{\lfloor{\frac{n}{i}}\rfloor}}\rfloor{}\)证明:设\(\lfloor{\frac{n}{i}}\rflo......