Redis的常见面试题

目录

前言

Redis支持哪些数据类型

五种核心类型 

Zset为什么用跳表不用红黑树 ?

Redis常见的应用场景? 

 如何检测Redis的连通性?

如何设置key的过期时间? 

Redis为什么是单线程模型? 

Redis里的IO多路复用是什么? 

RDB的持久化机制有哪些? 

AOF的重写机制是怎么样的? 

 Redis的过期删除策略是怎么样的?

Redis处理缓存雪崩的问题:

Redis的主从复制是怎么回事?

 介绍一下Redis哨兵

 Redis集群是干什么用的?

Redis的哈希槽是怎么回事? 

Redis集群会有操作丢失吗? 

 如何理解Redis的事务?和MySQL的事务有什么区别?

什么是缓存穿透、缓存雪崩、缓存击穿 

缓存穿透

缓存雪崩

缓存击穿

 Redis和MySQL如何保证双写一致性?

 Redis的“bigkey”问题


前言

Redis是一个高性能的key-value的内存数据库 ,在内存上的数据会随着掉电而通通消失,所以就有了不同的持久化的方式(搞到硬盘上)。Redis没有关系型数据库那种复杂查询的功能,而换来的是简单易用和高性能~~

Redis支持哪些数据类型

五种核心类型 

  • String
  • Hashmap
  • List
  • Set
  • Zset 

 后续新增了一些数据类型~

  • Bitmap:通过二进制位表示某个数是否存在
  • Bitfield:把字符串当作位图,进行位操作
  • Hyperloglog:基于位图实现计数效果
  • Geospatial:地理信息,存储经纬度,并可以进行一些空间计算
  • Stream:消息队列

Zset为什么用跳表不用红黑树 ?

跳表的插入、删除、查询的时间复杂度一样是O(logN),与红黑树一样。但是跳表更简单,不需要重新平衡这种操作

Redis常见的应用场景? 

  • 缓存:用来保存常见的热点数据,减少数据库的压力
  • 计数器:统计点击次数、收藏、点赞次数等
  • 排行榜:可以基于Zset简单实现
  • 分布式会话:使用Redis存储会话信息,可以让用户访问到系统的不同模块的时候都使用同一个公共会话
  • 分布式锁:对于分布式的一种并发控制手段,可以基于Redis来实现,上篇文章有详细展开
  • 消息队列:Redis自身支持Stream数据类型,可以作为简单的消息队列使用

 如何检测Redis的连通性?

给服务端发送一个 "ping" ,通顺的话就会收到 "pong" 

如何设置key的过期时间? 

可以在set key的时候通过EX选项指定过期时间,也可以再使用expire对已存在的key设置过期时间 

Redis为什么是单线程模型? 

Redis内部逻辑较为简单,大部分的性能瓶颈都是出现在IO或内存上,很少是CPU。因此使用多线程还没多大收益,还容易引入线程安全问题

从Redis6.0开始,Redis引入多线程,此时它也只是使用多线程去处理网络请求+协议解析,真正执行Redis命令的仍然是单线程完成,这样可以提高IO处理效率 

Redis里的IO多路复用是什么? 

 Redis主要是基于Linux提供的epoll机制来完成IO多路复用(之前文章详细讲述过)

所谓IO多路复用,其实就是一个线程来管理多个 socket ,并按需激活线程

|  假如在同一个单位时间内,有多个Redis客户端的请求到来了.....

使用传统的方式是给每一个客户端连接开一个线程,但是大部分的客户端不会频繁的给你      传输,即多数是空闲线程(不活跃) , 所以搞一堆线程不如就用一个线程来处理,反正并    发量不会太高而且处理速度又飞快

上述的操作被Linux封装好了,就是IO多路复用

在Linux中有三种实现方式:

  • select
  • poll
  • epoll

epoll是最新,也是最高效的版本(之前文章有详细讲述)这里浅浅谈一下

epoll在内核维护了一个红黑树,来管理这些socket,并且每一个节点都关联了一个事件回调,当系统内核感知到网卡收到数据,进一步判定这个数据是给哪一个socket的,随之调用对应的回调函数,进一步唤醒用户线程,来处理这个数据

RDB的持久化机制有哪些? 

 RDB和AOF两种

RDB:

  • RDB是一个紧凑的二进制文件,代表Redis某个时间的数据快照。适合备份,全量复制的场景。
  • Redis加载RDB文件来恢复数据远快于AOF
  • 但是RDB也没办法做到实时持久化。因为每次的bgsave都需要fork,全量复制对于cpu和硬盘的负荷大
  • 此外,RDB文件使用特定的二进制格式保存,Redis版本演进过程中有多个RDB版本,兼容性可能有冲突

 AOF:

  • AOF记录所有写入Redis的命令(文本方式),因此AOF的实时性高,适合在Redis宕机的时候恢复
  • AOF提供了重写功能,可以定期对AOF文件进行重写,取出冗余命令,减小AOF大小
  • 由于每次的命令都要同步到AOF文件中,所以会有一定的写入延迟
  • AOF文件是文本类型的数据比较大
  • 如果AOF的文件过大就会导致恢复速度比较慢了

AOF的重写机制是怎么样的? 

  1.  Redis在后台启动一个AOF重写进程
  2.  在AOF重写过程中,Redis继续处理客户端请求,并将这份数据同时保存到旧AOF文件以及一个缓冲区
  3. 新的AOF文件会遍历内存中的数据状态,只保留数据的最后状态。并与缓冲区共同生成一份完整的AOF文件
  4. 用新的AOF文件来代替旧的AOF文件

 Redis的过期删除策略是怎么样的?

惰性过期

只有当访问一个key的时候才能判断他是否过期,过期就清除。

这种策略方式可以节省CPU资源,但是会有可能出现大量过期的key未被再次访问,导致占用大量内存

定期过期

每个一段时间,会扫描一定数量的数据库expires字典中一定数量的key,并清除已过期的key。

expire字典中会保存所有设置了过期时间的key的过期时间数据,其中key是指向某个键的指针,value是该键的毫秒精度的UNIX时间戳表示过期时间

 Redis中则是同时使用了这两种策略:

  • 每隔100ms就随机抽取一定数量的key来检查和删除
  • 在获取key的时候检查一下是否过期,过期就删除

Redis处理缓存雪崩的问题:

首先对于定期删除来说,Redis会注册一个定时器,每个一定时间就触发一次

在删除的时候会根据事先统计好的过期key的个数来决定后续策略

如果过期key的个数超过总key的25%,就会让Redis持续删除过期key直到最大删除时间(默认25ms),但即使如此,有些对性能要求高的常见仍然会因为阻塞25ms导致性能下降

解决方案:可以在过期时间上加上随机值,使过期时间分散一点,降低触发这个25%阈值

Redis的主从复制是怎么回事?

 其实就是为了保证咱redis的高可用减少单个节点的负载(具体流程之前文章讲述过)

Redis主从复制icon-default.png?t=N7T8https://blog.csdn.net/Obto_/article/details/135946296

 介绍一下Redis哨兵

之前文章有详细讲述,感兴趣的可以看看这篇文章
Redis哨兵icon-default.png?t=N7T8https://blog.csdn.net/Obto_/article/details/135964383

Redis Sentinel是Redis的高可用的实现方案,在实际的生产环境中,对整个系统的高可用提升是非常有帮助的,当主从复制结构中某个节点宕机之后,哨兵能够自动发现故障并完成故障转移

如果是主节点故障,哨兵之中会互相协商(哨兵不只一个),当大多数哨兵节点达成主节点宕机的结果后,就会在哨兵之中推举出一个领导节点来自动完成故障转转移的工作,同时将这个变化通知给Redis客户端,这个过程是全自动的不需要人工介入

 Redis集群是干什么用的?

 之前的文章有详细讲述,感兴趣的可以看看这篇文章

Redis集群icon-default.png?t=N7T8https://blog.csdn.net/Obto_/article/details/136176895

Redis集群引入多组Master/Slave,每一组Master/Slave存储数据全集的一部分,从而构成更大的整体,解决单个Master/Slave能够达到的性能上限,能够存储更多的数据

好比一个30T的资源放在一个硬盘放不下,就可以放在3个10T的硬盘上 

 

Redis的哈希槽是怎么回事? 

在Redis集群中要合理的分配各个主节点的资源,所以就有了不同的hash方式将数据映射到对应的分片中

第一种就是直接hash 一个 N ,N为分片的总数,这样能够保证数据随机分配,但是一旦出现数据扩容的情况,N发生了变化,此时之前的映射关系全部作废,扩容的代价很大

第二种就是一致性hash,统一hash一个数,这样能解决上述因扩容而导致的映射关系被破坏,但是会导致数据的不均匀

因此哈希槽分区算法就出来了

哈希槽分区算法:

将所有的key都映射到16284(2^14) 个槽位上,再把这些槽均匀的分配给每个分片,每个分片只需要记录自己拥有哪些槽位即可 (详细的连接在上面Redis集群链接中)

 

Redis集群会有操作丢失吗? 

Redis并不能保证数据的强一致性,实际中集群在特定的条件下可能会丢失写操作

比如在成功写入一个key之后,正好主节点宕机,那么此时由于这个数据还未来得及同步到从节点,也没来得及写入AOF日志,就会丢失

 

 如何理解Redis的事务?和MySQL的事务有什么区别?

区别:

  • 弱原子性
  • 不保证一致性
  • 不需要隔离性
  • 不需要持久化 

Redis事务的本质就是在服务器搞了一个“事务队列”,每次客户端进行操作的时候,就先把命令保存在事务队列中,收到EXEC命令后才会一起执行

Redis事务和MySQL事务的概念上是一样的,都是把一系列的操作捆绑成一组,让一组批量执行

 

什么是缓存穿透、缓存雪崩、缓存击穿 

缓存穿透

访问的key不存在客户端也不存在服务端,此时这样的key就不被缓存起来,而高频的访问这个不存在的key就会导致Redis失去他“保护盾”的作用

解决办法:

1.布隆过滤器

2.将不存在的key也存在redis并随便设置value为'.'

3.对需要查询的key进行严格的合法性校验,不合规的不让查

缓存雪崩

短时间内大量的key 在缓存上失效,导致数据库压力暴增

解决方法:

1.部署高可用的Redis集群

2.不给key设置时间,或设置时间的时候添加随机时间因子

缓存击穿

相当于缓存血崩的特殊情况,就是针对热点key过期了,导致大量的请求访问到了MySQL上

解决方法:

1.基于统计的方式发现热点key,并设置永不过期

2.进行必要的服务降级,访问数据的时候使用分布式锁,限制并发数

 Redis和MySQL如何保证双写一致性?

什么是“双写一致性” ??

当用户修改数据的时候,需要修改数据库,同时也要更新缓存中的数据 

如果直接写数据库并写Redis,此时万一有一方写入失败,就容易出现数据不一致情况

解决方法:

方案一:延迟双删

1.删除缓存数据

2.更新数据库

3.再删除缓存数据

方案二:删除缓存重试

1.先删除缓存数据,如果失败,就把失败的key放到一个mq中,稍后进行重试

 

 Redis的“bigkey”问题

指的就是key对应的value很大占据较大的存储空间

可以使用redis-cli --bigkey查找bigkey,删除bigkey尽量不要用del,用unlink在后台删

这样的big可以会导致读写的时候性能下降,如果是集群分配部署,也会引起不同分片的数据倾斜

解决方案:

核心思路就是拆分,将大key拆成多个小key,每个key对应value的一部分数据 

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

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

相关文章

[计网底层小探索]:实现并部署多线程并发Tcp服务器框架(基于生产者消费者模型的线程池结构)

文章目录 一.网络层与传输层协议sockaddr结构体继承体系(Linux体系)贯穿计算机系统的网络通信架构图示: 二.实现并部署多线程并发Tcp服务器框架线程池模块序列化反序列化工具模块通信信道建立模块服务器主体模块任务回调模块(根据具体应用场景可重构)Tips:DebugC代码过程中遇到…

MySQL学习笔记3: MySQL数据库基础

目录 前言目标数据库操作(针对database 的操作)1. 创建数据库 create database 数据库名;2. 查看数据库 show databases;3. 选中数据库 use 数据库名;4. 删除数据库 drop database 数据库名; mysql中支持的数据类型1. 数值类型: NUMERIC(M,D)2. 字符串类…

linux platform架构下I2C接口驱动开发

目录 概述 1 认识I2C协议 1.1 初识I2C 1.2 I2C物理层 1.3 I2C协议分析 1.3.1 Start、Stop、ACK 信号 1.3.2 I2C协议的操作流程 1.3.3 操作I2C注意的问题 2 linux platform驱动开发 2.1 更新设备树 2.1.1 添加驱动节点 2.1.2 编译.dts 2.1.3 更新板卡中的.dtb 2.2 …

良好的 API 安全策略的重要性

根据 Cloudflare 2024 年 API 安全与管理报告,到 2024 年,API 请求占全球动态互联网流量的 57%,这证实 API 是现代软件开发的重要组成部分。但随着多年来它们的采用不断增加,相关的安全挑战也随之增加。 在过去两年中&#xff0c…

“目标检测”任务基础认识

“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的:检测在一个窗口中是否有物体。 eg:以猫脸检测举例,当给出一张图片时,我们需要框出猫脸的位置并给出猫脸的大小,如…

Meta 发布 MMCSG (多模态智能眼镜对话数据集)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

FFmpeg的HEVC解码器源代码学习笔记-1

一直想写一个HEVC的码流解析工具,看了雷神264码流解析工具,本来想尝试模仿写一个相似的265码流分析工具,但是发现265的解码过程和结构体和264的不太一样,很多结构体并没有完全暴露出来,没有想到很好的方法获得量化参数…

HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例

HAL STM32 HW I2C DMA SSD1306/SH1106驱动示例 📍硬件I2C DMA驱动参考:https://blog.csdn.net/weixin_45065888/article/details/118225993 🔖本工程基于STM32F103VCT6,驱动程序独立,可以移植到任意STM32型号上使用。…

VSCODE中使用Django处理后端data和data models

链接: Python and Django tutorial in Visual Studio Code MVC的理解 在实际的程序中采用MVC的方式进行任务拆分。 Model(模型)负责封装应用程序的数据和业务逻辑部分。Model包含数据结构,数据处理逻辑以及相关的操作方法&#…

如何在debian上实现一键恢复操作系统?

在Debian或任何其他Linux发行版上实现一键恢复操作系统,需要创建一个系统镜像或快照,并设置一个简单的方法来从该镜像恢复。以下是创建和恢复系统的基本步骤: 1. 创建系统镜像: 使用像dd,rsync或专门的备份工具&#…

Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

1、NFS介绍 NFS(Network File System)是一种分布式文件系统协议,允许客户端远程访问服务器上的文件,实现数据共享。它整合多个存储设备为统一文件系统,方便数据存储和管理,支持负载均衡和故障转移&#xf…

【专利】专利缴费清单与汇款金额不一致的处理方法

缴纳专利年费时,很容易算错滞纳金。比如有个专利年费滞纳金应交690,结果我算成了660,报给财务转账660。第二天补录缴费信息时,汇款金额660,然后缴费清单填写总是690无法修改,导致无法进行下一步&#xff01…

【AI大模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

【MySQL】学习连接查询和案例演示

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KOxr1rwR9cQTlydJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

win32 汇编读文件

做了2个小程序,没有读成功;文件打开了; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

探索海洋世界,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建海洋场景下海洋生物检测识别分析系统

前面的博文中,开发实践过海底相关生物检测识别的项目,对于海洋场景下的海洋生物检测则很少有所涉及,这里本文的主要目的就是想要开发构建基于YOLOv7不同系列参数模型的海洋场景下的海洋生物检测识别系统。 前文已有相关实践,感兴…

C#知识点-16(计算器插件开发、事件、递归、XML)

计算器插件开发 1、Calculator.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Calculator_DLL {//用来明确所有插件开发人员的开发规范public abstract class Calculator{public int N…

部署安装有道QanyThing

前提条件: 1、win10系统更新到最新的版本,系统版本最好为专业版本 winver 查看系统版本,内部版本要大于19045 2、CPU开启虚拟化 3、开启虚拟化功能,1、2、3每步完成后均需要重启电脑; 注:windows 虚拟…

(done) 如何判断一个矩阵是否可逆?

参考视频:https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆,那么 A 和 B 相似。原因&#xff1…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…