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线程删除缓存之后就会读取到新的数据了。
暂时无法在飞书文档外展示此内容

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解深度学习中的激活层:Sigmoid和Softmax作为非终结层的应用

深入理解深度学习中的激活层:Sigmoid和Softmax作为非终结层的应用Sigmoid 和 Softmax 激活函数简介Sigmoid函数Softmax函数 Sigmoid 和 Softmax 作为非终结层多任务学习特征变换增加网络的非线性实际案例 注意事项结论 深入理解深度学习中的激活层:Sigmo…

探索研究大语言在生物识别技术——使用ChatGP-4从完成从人脸识别到年龄估计

0.引言 论文提出以下几要点: (1). 人脸识别、性别检测和年龄估计的性能评估: 进行了一项研究,使用GPT-4这样的大型语言模型来处理人脸识别、性别检测和年龄估计等任务。这些任务是生物识别技术中的常见应用&#xff…

【评测体验】OrangePi AIpro 系统构建及性能测试

感谢香橙派社区能够邀请我评测这款开发板,祝愿国产开发板发展越来越好!在这里能够尽自己的一份力量是我的荣幸。 这篇文章是 OrangePi AIpro 开发板的评测,内容包括开发板简介、系统构建过程、系统性能测试、压缩算法性能测试、内核编译。 到…

分析和设计算法

目录 前言 循环不变式 n位二进制整数相加问题 RAM模型 使用RAM模型分析 代码的最坏情况和平均情况分析 插入排序最坏情况分析 插入排序平均情况分析 设计算法 分治法 总结 前言 循环迭代,分析算法和设计算法作为算法中的三个重要的角色,下面…

【深度 Q 学习-01】 Q学习概念和python实现

文章目录 一、说明二、深度 Q 学习概念三、python实现四、结论 关键词:Deep Q-Networks 一、说明 在强化学习 (RL) 中,Q 学习是一种基础算法,它通过学习策略来最大化累积奖励,从而帮助智能体导航其环境。它…

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了,下面收集了淘宝/京东/拼多多的618红包二维码,手机扫描或识别即可每天领红包,可参考好物分享中的商品下单: 淘宝618超级红包:即日起至2024.6.10,每天可领一次 京东618无门…

P9 【力扣+知识点】【算法】【二分查找】C++版

【704】二分查找(模板题)看到复杂度logN,得想到二分 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&#xff0…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反,垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说,内存会一直挂起,直到垃圾收集器可以评估它是否真正不再使用,而…

SpringCloud:Nacos配置管理

程序员老茶 🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 P   S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈&#…

01--nginx基础

前言: 本文用来整理一下nginx的用法,应该是本人中间件专栏的第一篇文章,这里开始概念和实操将会同样重要,面试时基本概念的理解非常重要,深有体会,不会再让概念成为压死骆驼的稻草。 1、nginx简介 Nginx…

vue连接mqtt实现收发消息组件超级详细

基本概念: MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级消息传输协议,专为低带宽、高延迟或不稳定的网络环境设计。以下是MQTT实现收发消息的基本原理: 客户端-服务器模型&#xff1a…

【数据结构】-- 栈

栈 引入: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则,先入栈的元素总是先后出栈。 压栈:栈的插入操作叫…

HCIP-Datacom-ARST自选题库__OSPF多选【62道题】

1.如图所示,路由器所有的接口开启OSPF,图中标识的IP地址为设备的LoopbackO接口的IP地址,R1、R2、R3的LoopbackO通告在区域1,R4的Loopback0通告在区域0,R5的LoopbackO通告在区域2,下列哪些IP地址之间可以相互…

Docker CIG使用

Docker CIG是什么 CIG为:CAdvisor监控收集、InfluxDB存储数据、Granfana图表展示 这个组合是一个常见的监控 Docker 容器的解决方案,它包括以下三个组件: cAdvisor (Container Advisor): cAdvisor 是一个开源的容器资源监控和性能分析工具。它能够收集有关正在运行的…

【Linux系统】进程间通信

本篇博客整理了进程间通信的方式管道、 system V IPC的原理,结合大量的系统调用接口,和代码示例,旨在让读者透过进程间通信去体会操作系统的设计思想和管理手段。 目录 一、进程间通信 二、管道 1.匿名管道 1.1-通信原理 1.2-系统调用 …

【VTKExamples::Utilities】第十五期 ShepardMethod

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ShepardMethod,并解析接口vtkShepardMethod,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

HTML+CSS 圆形菜单

效果演示 实现了一个圆形菜单的效果,点击菜单按钮后,菜单项会从菜单按钮中心点向外展开,并且菜单项上有文字链接。可以将这段代码的效果称为“圆形菜单展开效果”。 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8…

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…

(IDEA修改Java版本)java: 警告: 源发行版 X 需要目标发行版 X

搜索关键词&#xff1a;一致、发行 错误信息 其他错误&#xff1a; java: 错误: 不支持发行版本 6 java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) 思路 有两个地方要检查&#xff0c;JDK版本保持一致即可。 比如统一用JDK8或…

[排序算法]4. 图解堆排序及其代码实现

先来看看什么是堆? 堆是一种图的树形结构&#xff0c;被用于实现“优先队列”&#xff08;priority queues&#xff09; 注:优先队列是一种数据结构&#xff0c;可以自由添加数据&#xff0c;但取出数据时要从最小值开始按顺序取出。 在堆的树形结构中&#xff0c…