13、Redis高频面试题

news2024/11/17 11:25:08

1、项目中为什么用Redis

我们项目中之所以选择Redis,主要是因为Redis有下面这些优点:

  1. 操作速度快:Redis的数据都保存在内存中,相比于其它硬盘类的存储,速度要快很多
  2. 数据类型丰富:Redis支持 string,list,set,Zset,hash 等数据类型,基本满足我们开发中的各种使用场景
  3. 使用场景丰富:Redis可用于缓存,消息队列,按 key 设置过期时间,过期后将会自动删除

2、Redis的数据类型有哪些

Redis最常见的数据类型有5种,分别是String、List、Hash、Set、ZSet,下面给您详细介绍一下:

  1. String:简单的 key-value 类型,最大能存储512MB数据。场景:计数、缓存文章标题、微博内容等

  2. List:底层是链表,特点是:增删容易,随机访问困难。场景:发布与订阅或者说消息队列

  3. Hash:类似于Java中的HashMap,适合存储对象。场景:系统中对象数据的存储

  4. Set:是一种无序集合,可以方便的求交、并、差集。 场景:共同关注、共同粉丝、共同喜好等功能

  5. ZSet:相比于set来讲,多了1个权重参数 score,元素会按照score进行排序。场景:各种排行榜,弹幕消息

3、Redis为什么这么快

Redis之所以运行速度比较快,主要是由于这样一些原因:

  1. 纯内存操作:Redis的绝大部分请求是纯粹的内存操作,非常快速

  2. 单线程:Redis的核心部分是单线程运行的,避免了不必要的上下文切换,也不存在线程切换导致的 CPU消耗

  3. 使用 I/O 多路复用模型和非阻塞 IO

    什么是 I/O 多路复用

    I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源
    目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能
    其中Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器
    在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程
    

4、Redis的过期删除策略有哪些

Redis的过期删除策略指的是当Redis中的key过期之后在什么时候进行删除的处理方案,常用的删除策略就两个:

  • 惰性删除:只会在取出 key 的时候才对数据进行过期检查,过期了就删除
  • 定期删除:每隔一段时间抽取一批 key执行删除过期 key 操作

两者相比,定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是定期删除+惰性/懒汉式删除。

5、Redis的内存淘汰策略有哪些

Redis的内存淘汰策略指的是当Redis的内存已经存满,又有新的数据需要保存时的处理方案,官方提供了8种淘汰策略:

  • no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。
  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
  • allkeys-lru:在所有的数据集中选择最近最少使用的数据淘汰
  • allkeys-random:在所有的数据集中任意选择数据淘汰
  • allkeys-lfu:在所有的数据集中选择最不经常使用的数据淘汰

6、Redis的RDB和AOF区别

Redis是一个基于内存的数据存储,为了保证数据安全,需要将内存中的数据备份到磁盘上,官方提供了两种数据持久化的方式,分别是RDB和AOF

  1. RDB采用的是定期更新的方式,它会定期将Redis中的数据生成的快照同步到磁盘上,磁盘上保存的就是Redis的内存快照

    优点是数据文件的大小相比于AOF较小,数据恢复速度较快

    缺点是比较耗时,存在丢失数据的风险

  2. AOF是将Redis所执行过的所有写指令都记录到磁盘上,在下次Redis重启时,只需要将指令重写一遍就可以了

    优点是数据丢失的风险大大降低了

    缺点是数据文件的大小相比于rdb较大,而且数据恢复的时候速度较慢

在我们公司是同时开启RDB和AOF 持久化机制的,这样做的好处是:

  1. 在Redis重启时先使用AOF日志进行恢复,然后再使用RDB快照进行备份
  2. 而且将AOF的appendfsync 参数为 everysec,保证每秒将AOF缓冲区中的写操作同步到 AOF 文件中,提高数据的持久化能力
  3. 定期进行RDB快照的备份,以便在需要时进行全量数据的恢复

这样的配置可以充分利用RDB和AOF两种持久化机制的优势,提高数据的可靠性和恢复能力

7、RDB期间可以同时处理写请求吗

Redis在进行RDB期间是可以同时处理写请求的,这得益于Redis使用操作系统的多进程写时复制技术来实现快照持久化

具体来说,就是Redis在持久化时会产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求

当主线程执行写指令修改数据的时候,这个数据就会复制一份副本, 然后修改副本中的数据,RDB结束后,主进程读取这个副本数据写到 RDB 文件

这既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响

8、Redis集群有哪些方案

在Redis中提供的集群主要有三种,分别是主从、哨兵和分片集群

  1. 主从集群主要用来解决Redis的并发问题,一般是一个主节点负责数据写入,多个从节点负责数据读取,主节点的数据会实时同步给从节点

  2. 哨兵集群主要用来解决Redis的高可用问题,哨兵会监控集群中节点的状态,并在主节点出现问题时进行重新选主

  3. 分片集群主要用来解决Redis的海量数据存储问题,它要求有多个主节点,然后数据写入的数据会经过计算落到其中一个上

    在这个计算的过程中Redis引入了哈希槽的概念,Redis集群有16384个哈希槽,每个 key通过CRC16校验后对16384取模来决定放置哪个槽

    而分片集群的每个节点负责一部分 hash 槽,这样就可以计算出一个key会出现在哪个节点上了,查询的时候也是同时的方式来定位即可

9、如何保存Redis数据与MySQL一致

保证Redis和MySQL数据一致性的方案有很多,最常见的有三种

  1. 同步双写,即在程序更新完MySQL之后后立即同步更新redis
  2. 异步监听,即通过Canal监听MySQL的binlog日志变化,然后再通过程序将变化的数据更新数据到 Redis
  3. MQ异步,即程序在更新完MySQL后,发送一条消息到MQ中,然后在通过一个程序监听MQ,获取到消息,然后更新Redis

10、什么是缓存预热

缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统。

避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。

如果不进行预热,那么 Redis 初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库中,对数据库造成流量的压力。

缓存预热解决方案主要有下面几个:

  • 数据量不大的时候,工程启动的时候进行加载缓存动作
  • 数据量大的时候,设置一个定时任务脚本,进行缓存的刷新
  • 数据量太大的时候,优先保证热点数据进行提前加载到缓存

11、什么是缓存穿透, 怎么解决

在我们的项目中会将缓存放到数据库前面,查询的时候先查缓存,缓存有了就不用再去查数据库了,这样可以大大减轻数据库的访问压力

而缓存穿透指的是请求一直在查询一个数据库中不存在的数据,这样缓存中没有,请求就会到达数据库,而数据库也没有,也就没法缓存

所以每一次请求都会直接到数据库中查询,这就极有可能导致数据库被压垮

常用的解决方案有两个:

  1. 查询返回的数据为空,仍把这个空结果进行缓存,但过期时间尽量设置稍短一些

  2. 使用布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询

12、什么是缓存击穿,怎么解决

在我们的项目中会将缓存放到数据库前面,查询的时候先查缓存,缓存有了就不用再去查数据库了,这样可以大大减轻数据库的访问压力

缓存击穿指的是对于一个设置了过期时间的key,在其缓存失效的瞬间,有大量的请求访问这个它,这些请求在缓存找不到就会直接到数据,导致数据库被压垮

常用的解决方案有两个:

  1. 使用互斥锁:当缓存失效时,不立即去数据库查询,而是先去获取一把全局锁,那个线程获取到了,就去数据库查询,获取不到的就等待重试查询缓存

  2. 修改设置key有效期的逻辑,大体如下:

    在设置key的时候,不给它设置过期时间,而是单独设置一个过期时间字段一块存入缓存中

    当查询的时候,从redis取出数据后判断时间是否过期,如果过期则开通另外一个线程进行数据同步,当前线程正常返回数据
    在这里插入图片描述

两种方案对比:

解决方案优点缺点
互斥锁没有额外的内存消耗 ,保证一致性线程需要等待,性能受影响
逻辑过期线程无需等待,性能较好不保证一致性,有额外内存消耗

13、什么是缓存雪崩,怎么解决

在我们的项目中会将缓存放到数据库前面,查询的时候先查缓存,缓存有了就不用再去查数据库了,这样可以大大减轻数据库的访问压力

缓存雪崩指的是大量的key在某一时刻同时失效,这样大量的请求全部转发到DB,DB 瞬时压力过重雪崩

解决方案也很简单,就是在设置key的过期时间的时候,尽量加一些随机值,这样缓存过期时间的重复率就会降低

14、用过Redis的事务吗

Redis中本身是没有事务的概念的,但是他有几个命令组合起来能实现类似于事务的效果。也就是说,Redis事务的本质是一组命令的集合。

这里用到的命令主要有5个,分别是:

  1. MULTI:用来组装一个事务
  2. EXEC:执行一个事物
  3. DISCARD:取消一个事务
  4. WATCH:用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行
  5. UNWATCH:取消 WATCH 命令对所有key的监视

总结说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。Reids中,单条命令式原子性执行的,但事务不保证原子性,且没有回滚。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32蓝牙小车、红外循迹小车、超声波避障小车项目设计

一、前言 本文旨在分享我学习STM32的过程中,为了强化学习成果,试着制作一些实训项目。最开始做的就是STM32蓝牙小车、STM32红外循迹小车、STM32超声波避障小车。 相信看完本文的你,一定可以亲手制作一辆属于自己的智能小车! 注&am…

HTML--表单

睡不着就看书之------------------------ 表单 作用:嗯~~动态页面需要借助表单实现 表单标签: 主要分五种: form,input,textarea,select,option 从外观来看,表单就包含以下几种&…

【已解决】丨Details: An error occurred while executing command: “host-status

Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…

代码随想录 Leetcode18. 四数之和

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月15日&#xff09;&#xff1a; class Solution { public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;sort(nums.begin(), nums.end(…

谷粒商城-商品服务-品牌管理-阿里云云存储+JSR303数字校验+统一异常处理

阿里云云存储OSS 分布式系统上传文件 分布式系统上传文件 单体应用上传&#xff1a;上传文件到服务器&#xff0c;想获取文件时再向服务器发请求获取文件。 分布式系统上传&#xff1a; 因为有多台服务器&#xff0c;为防止负载均衡导致获取文件时没找到对应的服务器&#xf…

stack,queue和prioriy_queue

MySTL stack和queue template <class T, class Container deque<T> > class queue;template <class T, class Container deque<T> > class stack;选择适配器的宗旨是要能达到预想的功能 queue——只能使用list和deque stack——可以使用vector和…

019、错误处理:不可恢复错误与panic!

鉴于上一篇文章过长&#xff0c;不方便大家阅读和理解&#xff0c;因此关于Rust中的错误处理&#xff0c; 我将分以下3篇来讲。 另外&#xff0c;随着我们学习的不断深入&#xff0c;难度也会越来越大&#xff0c;但不用担心。接下来只需要让自己的脚步慢一些&#xff0c;认真搞…

微信商家转账到零钱怎么开通?场景模板

商家转账到零钱是什么&#xff1f; 使用商家转账到零钱这个功能&#xff0c;可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景&#xff0c;提高效率。 商家转账到零钱的使用场景有哪些&#xff1f; 商家…

数据结构之bool类

bool类 bool 是布尔类。它是最简单的一个类&#xff0c;其取值有两种&#xff0c;1和O&#xff0c;即 True 和 False。可以这样简单地理解&#xff0c;除了1和0以及 True 和 False 的情况之外&#xff0c;但凡有值&#xff08;非空&#xff09;即为真&#xff0c;但凡无值&…

C#编程-属性和反射

属性和反射 属性是将元数据信息和行为添加到应用程序代码中的简单技术。属性是允许您将声明信息添加到程序的元素。此声明信息在运行时用途广泛,可使用应用程序开发工具在设计时使用。 介绍属性 对象是由其属性值描述的。例如,汽车可以使用它的构造、型号或颜色来描述。类似…

遇到问题不要慌,轻松搞定内存泄露

当一个系统在发生 OOM 的时候&#xff0c;行为可能会让你感到非常困惑。因为 JVM 是运行在操作系统之上的&#xff0c;操作系统的一些限制&#xff0c;会严重影响 JVM 的行为。故障排查是一个综合性的技术问题&#xff0c;在日常工作中要增加自己的知识广度。多总结、多思考、多…

PVE虚拟机配置文件恢复(qm list不显示虚拟机,web控制台看不到虚拟机)

本文章的目的是故障后复盘&#xff1a; 故障现象在命令行执行qm list不显示虚拟机&#xff0c;web控制台看不到虚拟机&#xff0c;网上查不到相关现象的处理办法。 处理思路&#xff1a;虚拟机还在正常工作&#xff0c;通过查看kvm进程ps aux | grep kvm&#xff0c;百度查看…

【RTOS】快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比

目录 十一、调试11.1 打印任务空闲栈11.2 打印所有任务栈信息11.3 CPU占用比11.4 空闲任务和钩子函数 十一、调试 该部分在上份代码基础上修改得来&#xff0c;代码下载链接&#xff1a; https://wwzr.lanzout.com/in63o1lauwwh 密码:9bhf 该代码尽量做到最简&#xff0c;不添加…

怎么安装IK分词器

.安装IK分词器 1.在线安装ik插件&#xff08;较慢&#xff09; # 进入容器内部 docker exec -it elasticsearch /bin/bash ​ # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elastics…

一个程序员“玩”出来的网站:每月成本仅 350 元,如今赚了 16.4 万元

很难想象&#xff1a;一个每月运行成本不到 50 美元&#xff08;约人民币 358 元&#xff09;的网站. 是如何做到收入 2.3 万美元&#xff08;约人民币 16.4 万元&#xff09;的&#xff1f; ** 如果你也对网站开发感兴趣&#xff1f; ** 首先&#xff0c;这个网站只有创始…

​LeetCode解法汇总82. 删除排序链表中的重复元素 II

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个已排序的链表的头 head &#xf…

年终总结各类表格模板Excel,大屏可视化,PPT总结等

马上就要进行年底总结,很多职场人找不到模板而浪费很多时间 今天就给大家分享一些常用的模板,报表,可视化,大屏,PPT汇报,表格等。 AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作 PowerBI 商业智能 68集 数据库Mysql 8.0 54集 数据库Oracle 21C 142集 Office 2021实战应…

[Docker] Docker为什么出现

Docker为什么出现 一款产品&#xff1a; 开发–上线 -->两套环境 | 应用配置 开发即运维&#xff01; 环境配置十分麻烦&#xff0c;每一个机器都要部署环境&#xff08;Redis, ES, Hadoop&#xff09; 费时费力 项目带上配置环境安装打包。 传统&#xff1a; 开发jar&…

Python——VScode安装

⼀、下载安装 [root192 ~]# rpm --import https://packages.microsoft.com/keys/microsoft.asc[root192 ~]# sh -c echo -e "[code]\nnameVisualStudio Code\nbaseurlhttps://packages.microsoft.com/yumrepos/vscode\nenabled1\ngpgcheck1\ngpgkeyhttps://packages.mi…

华清远见作业第二十八天——网络编程(第三天)

思维导图&#xff1a; 向服务器发送数据实现下载 代码&#xff1a; #include <a.h> void menu(); int download(int cfd, struct sockaddr_in sin); #define SER_PORT 69 #define SER_IP "192.168.125.4" int main(int argc, const char *argv[]) {//1创建用…