当前位置: 首页 > news >正文

redis面试知识点

Redis知识点
暂时无法在飞书文档外展示此内容

  1. Redis的RDB和AOF机制各是什么?它们有什么区别?
    答:Redis提供了RDB和AOF两种数据持久化机制,适用于不同的场景。
    RDB是通过在特定的时刻对内存中的完整的数据复制快照进行持久化的。
    RDB工作原理:
  • 当执行RDB持久化时,redis会调用fork方法,创建一个子线程,子线程会将内存中数据复制到快照文件中,当快照写完之后,会替换旧的RDB文件。
  • RDB在执行持久化时,不会影响主线程对redis的操作,读和写,对用户无感。
    优点:
  • RDB文件只保存内存快照,通常用于快速灾难恢复
  • RDB文件由于是子线程来处理的,对性能影响较小
    缺点:
  • RDB文件每次保存的都是全量的内存快照,数据量大时,比较耗时,并且会有大量的IO操作。
  • 如果两次RDB之间发生故障,数据无法通过RDB快照恢复。
    AOF是通过记录操作日志的方式进行持久化的。在redis重启后,AOF文件会进行操作重放来保证数据不丢失。
    AOF工作原理:
  • 每执行一个写操作,就会在AOF文件的末尾追加一条
  • AOF文件可以根据配置进行重写,重写后可以去除一些无效的或过期的指令
  • redis提供了三种不同的AOF刷新策略,从不同步、每秒同步、每次都同步。从不同步会依赖操作系统的刷盘策略,每隔30s刷一次。三种不同的策略会影响redis操作的性能,可以根据业务需求来配置写策略。
    优点:
  • 记录比较详细,通过配置能够保证数据尽可能的不丢失或只丢失1s
    缺点:
  • AOF文件通常比RDB文件大很多,并且处理速度更慢,
  • AOF刷新速度可能会影响redis的性能。
    区别:
  • 数据安全性:AOF提供了更好的数据安全性,能够最小化数据丢失的风险。
  • 性能影响:RDB对系统性能的影响较小,尤其适用于较大的数据集。
  • 数据恢复速度:RDB可以更快地进行数据恢复,因为它是直接读取单一的数据文件。
  • 文件大小和处理速度:AOF文件在没有重写的情况下可能会变得非常大,且处理速度较慢。
    在实际应用中,根据需求,可以单独使用RDB或AOF,或者将两者结合使用,以此来平衡性能与数据安全性的需求。
  1. Redis是单线程架构吗?为什么单线程还这么快?
    redis的主线程是单线程的,主线程主要完成从请求读取、解析、键值对操作、返回结果。redis运行时也会有子进程来和其它的线程来执行主线程之外的其它的事,比如RDB快照文件生成。
    redis在6.0引入了多IO线程来处理网络请求的读和写,在多核机器上能提高网络性能。
    单线程能够有效的减少线程上下文的切换,避免了锁的开销。
    内存操作、高效的数据结构、事件驱动模型、优化的命令执行也是其性能高的原因。

  2. redis实例在运行时变慢了,该怎么办?
    看哪里有阻塞,可以从cpu、内存、磁盘、网络来排查
    在这里插入图片描述

  3. 什么是缓存雪崩、缓存击穿、缓存穿透?如何解决

  • 缓存雪崩:缓存雪崩是指在缓存层面出现大面积的缓存失效的情况,导致大量的请求直接落到数据库上,从而引起数据库性能急剧下降,甚至宕机。缓存雪崩的解决方法是在设置过期时间时加一个随机数。
  • 缓存击穿:缓存击穿指一个热点key(大量并发访问)在缓存中失效的瞬间,导致大量请求直接击穿缓存访问数据库,可能会使数据库瞬间压力剧增。缓存击穿的解决方法是将热点缓存设置为永不过期。
  • 缓存穿透:缓存穿透是指查询不存在的数据,由于缓存不命中(因为数据根本就不存在),导致所有的查询请求都落在数据库上,如果有大量这样的请求,数据库可能会遭受很大压力。缓存穿透的解决方法是缓存空的结果,即使查不到数据,也缓存一个空的结果。这样查询就会落到缓存上。或者使用布隆过滤器前缀判断数据是否在缓存中存在,如果不存在,就直接返回空的结果。相比来说缓存空的结果会更友好并且更容易实现。
    如果mysql或redis压力过大,也可以考虑前端限流的方式。
  1. 缓存一致性问题如何解决
    缓存一般情况下有两种方法去更新:
  • 先删除缓存,再更新数据库
  • 先更新数据库,再删除缓存
    无并发情况:先删除缓存,再更新数据库
    暂时无法在飞书文档外展示此内容
    缓存已经被删除了,而数据库更新失败了,如果数据库有retry机制,那么可以重试,重试失败,那么缓存中没有数据,数据库中是旧的数据,缓存与数据库是一致的。如果数据库retry成功,那么缓存与数据库也是一致的。

无并发情况:先更新数据库,再删除缓存
在这里插入图片描述

数据库更新成功,而缓存删除失败了,那么下次查询请求就会查询到旧的数据,而这是我们不希望看到的,所以删除缓存也可以加retry,一般情况下redis都会删除成功。

有并发情况:
暂时无法在飞书文档外展示此内容

会出现旧数据被其它线程读取到缓存中的情况,这样你的服务会一直读到旧数据,这种方式可以采用两种方式来处理:
A. 绑定数据库连接,对于同一个id的操作(更新、查询)都通过同一个数据库连接来处理,这样就能保证对于同一个id操作的顺序性。这种方法比较重,需要修改数据库连接池,所以了解就行。
B. 缓存延迟双删策略,如果有数据更新操作,先做一次删除缓存,过一会儿再删除一下缓存,保证并发发生时的缓存被清理掉。过一会儿这个时间就需要看业务的容忍度咯,并且并不是所有的更新操作都会有并发,只有在并发发生时才可能出现缓存旧数据的情况,所以这个概率也是比较低的。
暂时无法在飞书文档外展示此内容

会出现删除缓存之前,所有并发的请求都会读到旧值,个人感觉这种可以直接忽略了,最终等A线程删除缓存之后就会读取到新的数据了。
暂时无法在飞书文档外展示此内容

这种情况也是我们不愿意看到的,但是说实话这种情况感觉一般不会发生,正常情况下读数据比写数据会更快。当然这种情况也是可以使用缓存延迟双删策略来处理。

相关文章:

  • oracle 还原被覆盖的视图
  • 算法每日一题(python,2024.05.29) day.11
  • 【Java基础-注解】Java中注解的分类有哪些,如何自定义一个注解,并使用举例
  • String常用操作
  • HashMap与Hashtable的异同
  • C语言:学生成绩管理系统(含源代码)
  • 【机器学习】机器学习与AI大数据的融合:开启智能新时代
  • Redis教程(十九):Redis的Redisson布隆过滤器
  • 定义类并创建类的实例
  • 【EFK日志系统】在kibana操作索引模板、生命周期、管道等
  • 通过提示工程将化学知识整合到大型语言模型中
  • Java实现对PDF、纵向、横向页面添加自定义水印功能
  • 堡垒机,日志审计系统,行为管理,漏洞扫描的作用
  • 【熊熊双语绘本】3、飞向星空的小火箭
  • 【C++面试50题】
  • 【EOS】Cleos基础
  • css系列之关于字体的事
  • JS+CSS实现数字滚动
  • Laravel 中的一个后期静态绑定
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MobX
  • MySQL的数据类型
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python利用正则抓取网页内容保存到本地
  • Python十分钟制作属于你自己的个性logo
  • React组件设计模式(一)
  • 机器学习 vs. 深度学习
  • 软件开发学习的5大技巧,你知道吗?
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • k8s使用glusterfs实现动态持久化存储
  • 湖北分布式智能数据采集方法有哪些?
  • ​比特币大跌的 2 个原因
  • #Linux(帮助手册)
  • (C++17) optional的使用
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (搬运以学习)flask 上下文的实现
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (四)opengl函数加载和错误处理
  • (一)u-boot-nand.bin的下载
  • (转)nsfocus-绿盟科技笔试题目
  • .Net mvc总结
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net开发时的诡异问题,button的onclick事件无效
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET文档生成工具ADB使用图文教程
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [ NOI 2001 ] 食物链
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [Angular] 笔记 6:ngStyle
  • [BZOJ3757] 苹果树
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [CocosCreator]Android的增加AndroidX的动态权限
  • [CSS3备忘] transform animation 等