Redis面试题大全

news2025/2/22 23:50:53

文章目录

  • Redis有哪几种基本类型
  • Redis为什么快?
  • 为什么Redis6.0后改用多线程?
  • 什么是热key吗?热key问题怎么解决?
    • 什么是热Key?
    • 解决热Key问题的方法
  • 什么是缓存击穿、缓存穿透、缓存雪崩?
    • 缓存击穿
    • 缓存穿透
    • 缓存雪崩
  • Redis的过期策略
  • Redis持久化方式有哪些?区别?
  • Redis高可用
    • 1. 主从复制(Master-Slave Replication)
    • 2. Sentinel(哨兵)
    • 3. Cluster(集群)


Redis有哪几种基本类型

Redis 提供了丰富的数据类型,这些数据类型使得 Redis 不仅仅是一个简单的键值存储系统,而是一个多功能的 NoSQL 数据库。下面是 Redis 支持的主要数据类型及简介:

  1. String(字符串)
    最基本的数据类型,可以存储单个值,如字符串、整型或浮点型数据。适用于大多数简单的键值存储需求。

  2. Hashes(哈希)
    哈希是一个键值对的集合,每个键都是一个字段名,值可以是任意类型。哈希非常适合存储对象,比如用户信息,其中每个字段代表用户的一个属性。

  3. Lists(列表)
    列表是由字符串元素构成的有序集合,可以看作是一个双端队列。可以在列表的头部或尾部添加或弹出元素,常用于消息队列或任务队列。

  4. Sets(集合)
    集合是一组无序的不重复的字符串元素。集合成员是唯一的,可以进行交集、并集和差集等集合运算,适用于处理唯一元素的集合。

  5. Sorted Sets(有序集合)
    类似于集合,但每个成员都有一个分数(score)与其关联,以此来确定成员的排序。有序集合可以高效地获取指定范围内的成员,适用于排行榜、时间序列数据等场景。

详细的介绍可以看文章:Redis的几种基本类型详解


Redis为什么快?

Redis之所以非常快速,主要归功于以下几个设计特点和技术优势:

  1. 内存存储
    Redis将所有的数据都保存在主服务器的内存中,读写速度极快,不受磁盘I/O速度的影响。由于内存访问速度远高于硬盘,这大大提升了数据的读取和写入效率。

  2. 非阻塞架构
    Redis采用了事件驱动的非阻塞I/O模型,可以同时处理多个客户端请求,无需等待慢速的I/O操作完成,提高了并发处理能力。

  3. 多路复用器(epoll/kqueue)
    Redis使用了高效的事件处理器,如Linux下的epoll和BSD下的kqueue,这些机制可以让Redis在高负载下仍然保持良好的性能。

  4. 异步数据交换
    在主从复制和持久化过程中,Redis采用异步方式处理背景任务,避免影响主线程的工作效率,保证在线服务的速度不受影响。

  5. 精简的数据结构
    Redis提供了多种高度优化的数据结构(如跳跃表、压缩列表、整数集合),针对不同的应用场景进行了专门的设计,在节省空间的同时也加快了操作速度。

  6. 单线程模型
    Redis采用单线程模型处理命令请求,避免了复杂的锁竞争问题,简化了内部调度流程,减少了上下文切换带来的开销。


为什么Redis6.0后改用多线程?

redis使用多线程并非是完全摒弃单线程,redis还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程。

需要注意的是,Redis的多线程仅限于后台任务如AOF、BGSAVWE、IO等,对于数据处理和客户端请求的处理依然保持单线程,这是因为单线程模型可以避免复杂的并发控制问题,保证数据的一致性和安全性。多线程的引入主要是为了释放CPU资源,让主线程专注于更关键的实时数据处理工作。


什么是热key吗?热key问题怎么解决?

什么是热Key?

在分布式缓存系统中,热Key指的是那些访问频率非常高,以至于对整个系统的性能产生负面影响的键值。

解决热Key问题的方法

  1. 分散热点
  • Key前缀随机化:通过对Key增加随机前缀,可以使原本相同的Key分布到不同的节点上,从而分散请求的压力。

  • 一致性Hash:使用一致性Hash算法可以更好地均衡各个节点间的负载,避免单一节点成为瓶颈。

  1. 缓存更新策略
  • 延时双删法:即“Cache Aside”模式的变体,先删除缓存再更新数据库,然后再异步更新缓存,这样即使缓存失效,也能防止所有请求立即打到数据库。

  • 加锁更新:在更新热Key时,可以使用分布式锁,确保同一时间内只有一个进程能够更新这个Key,其他请求则可以从旧缓存中读取数据,直到新数据准备好。

  1. 缓存降级
  • 备用数据源:当热Key失效时,可以暂时使用预先准备好的静态数据或默认值作为替代,避免直接访问数据库。
  1. 读写分离
  • 对于读多写少的场景,可以考虑将读操作和写操作分离,使用只读副本应对大部分读请求,减少主节点的负载。
  1. 限流与熔断
  • 限流:对访问频率过高的Key实施限流措施,避免过度消耗资源。

  • 熔断:当检测到某个Key的访问异常时,自动切断对该Key的访问,直到恢复正常。


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

缓存击穿

缓存击穿的概念就是单个key并发访问过高,过期时导致所有请求直接打到db上,这个和热key的问题比较类似,只是说的点在于过期导致请求全部打到DB上而已。

解决方案:

加锁更新,比如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户,这样后面的请求就可以从缓存中拿到数据了。
将过期时间组合写在value中,通过异步的方式不断的刷新过期时间,防止此类现象。
https://tva

缓存穿透

缓存穿透是指查询不存在缓存中的数据,每次请求都会打到DB,就像缓存不存在一样。
在这里插入图片描述

针对这个问题,加一层布隆过滤器。布隆过滤器的原理是在你存入数据的时候,会通过散列函数将它映射为一个位数组中的K个点,同时把他们置为1。

这样当用户再次来查询A,而A在布隆过滤器值为0,直接返回,就不会产生击穿请求打到DB了。

显然,使用布隆过滤器之后会有一个问题就是误判,因为它本身是一个数组,可能会有多个值落到同一个位置,那么理论上来说只要我们的数组长度够长,误判的概率就会越低,这种问题就根据实际情况来就好了。
在这里插入图片描述

缓存雪崩

当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上,这样可能导致整个系统的崩溃,称为雪崩。雪崩和击穿、热key的问题不太一样的是,他是指大规模的缓存都过期失效了。
在这里插入图片描述

针对雪崩几个解决方案:

针对不同key设置不同的过期时间,避免同时过期
限流,如果redis宕机,可以限流,避免同时刻大量请求打崩DB
二级缓存,同热key的方案。


Redis的过期策略

redis主要有2种过期删除策略

惰性删除
惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有一个缺点就是如果这些过期的key没有被访问,那么他就一直无法被删除,而且一直占用内存。

定期删除
定期删除指的是redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所以redis会每次随机取一些key去做检查和删除。

那么定期+惰性都没有删除过期的key怎么办?
假设redis每次定期随机查询key的时候没有删掉,这些key也没有做查询的话,就会导致这些key一直保存在redis里面无法被删除,这时候就会走到redis的内存淘汰机制。

volatile-lru:从已设置过期时间的key中,移除最近最少使用的key进行淘汰
volatile-ttl:从已设置过期时间的key中,移除将要过期的key
volatile-random:从已设置过期时间的key中随机选择key淘汰
allkeys-lru:从key中选择最近最少使用的进行淘汰
allkeys-random:从key中随机选择key进行淘汰
noeviction:当内存达到阈值的时候,新写入操作报错


Redis持久化方式有哪些?区别?

Redis 提供了两种主要的持久化方式:RDB (Redis Database Backup) 和 AOF (Append Only File)。

RDB
使用定时记录某个时间点的内存快照,将数据存储到磁盘中进行持久化。
所以,可能存在数据丢失的风险,在保存周期内发生故障就会丢失数据,但重启后数据恢复速度相较于AOF快。

AOF
AOF 记录每一次写操作命令,类似于事务日志,可以追加到文件末尾,因此不会覆盖已有的数据。
所以相较于RDB数据完整性好,但重启需要重新加载所有命令,启动速度慢。

Redis高可用

Redis 高可用性的实现主要包括以下几种方式,每种方法都有其特定的适用场景和优缺点:

1. 主从复制(Master-Slave Replication)

  • 原理:通过建立一个或多个从服务器(slave),从主服务器(master)同步数据。从服务器可以用来处理读请求,实现读写分离,提高系统性能;同时,当主服务器宕机时,可以从中服务器中选择一台升级为主服务器,实现故障转移。
  • 优点:简单易行,可以实现读写分离,提高读操作的性能。
  • 缺点:写操作依然是单点,如果主服务器失败,需要手动干预进行故障转移。
    在这里插入图片描述

2. Sentinel(哨兵)

  • 原理:Sentinel 是一组运行在独立 Redis 服务器上的进程,它们负责监控主从服务器的状态,当主服务器不可用时,Sentinel 能够自动选出一个新的主服务器,实现故障转移。
  • 优点:自动化故障检测和故障转移,降低了运维难度。
  • 缺点:Sentinel 本身也需要管理,增加了系统的复杂度。
    在这里插入图片描述

3. Cluster(集群)

  • 原理:Redis Cluster 是一种原生的集群解决方案,它不仅提供了数据分区的能力,还可以实现自动故障转移。每个节点都是一个完整的 Redis 实例,数据按照哈希槽的方式分布到不同节点上。
  • 优点:支持水平扩展,可以动态添加或删除节点;自动故障转移,高可用性较好。
  • 缺点:配置相对复杂,不适合简单的读写分离场景;不支持所有 Redis 命令,有一定的限制。
    在这里插入图片描述

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

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

相关文章

python爬虫预备知识三-多进程

python实现多进程的方法:fork、multiprocessing模块创建多进程。 os.fork方法 os.fork方法只适合于unix/linux系统,不支持windows系统。 fork方法调用一次会返回两次,原因在于操作系统将当前进程(父进程)复制出一份…

ESP8266使用舵机以及16路PWM舵机PCA 9685的使用方式

PWM全称 50Hz也就是一秒内变换50次 根据上面的公式 一个高电平一个低电平叫一个脉冲。 例如每个脉冲占20毫秒,那么他的频率是多少? 就是用1去除以他的周期,也就是我们上面说的20,那么就是除0.02,1秒等于1000毫秒,20…

网络安全 - 应急响应检查表

前言 本项目旨在为应急响应提供全方位辅助,以便快速解决问题。结合自身经验和网络资料,形成检查清单,期待大家提供更多技巧,共同完善本项目。愿大家在应急之路一帆风顺。 图片皆来源于网络,如有侵权请联系删除。 一…

南山智尚10亿元定增质疑声连连,与控股股东超70亿资金往来引瞩目

《港湾商业观察》施子夫 王璐 近期,南山智尚(300918.SZ)发布了《向特定对象发行A股股票募集说明书(修订稿)》。 据了解,公司此次拟募集资金总额不超过10亿元,扣除发行费用后的募集资金净额将全部用于年产8万吨高性能…

鸿蒙HarmonyOS实战:ArkUI组件添加内容背景模糊效果

动画效果可以丰富界面的细节,提升UI界面的真实感和品质感。例如,模糊和阴影效果可以让物体看起来更加立体,使得动画更加生动。ArkUI提供了丰富的效果接口,开发者可快速打造出精致、个性化的效果。本章中主要对常用的模糊、阴影和色…

速卖通、Lazada、虾皮卖家是如何自建买家账号测评的?

在跨境电商领域,速卖通、Lazada、Shopee等平台上的卖家为了提升店铺信誉、提高产品排名和销量,常常需要借助买家账号进行测评。然而,依赖外部服务商往往存在风险,如账号质量参差不齐、恶意差评等问题。因此,自己养国外…

Crowd-SAM:SAM作为拥挤场景中目标检测的智能标注器

摘要 目标检测是一项重要任务,广泛应用于各种场景。通常,它需要大量的标签进行训练,这相当耗时,尤其是在拥挤的场景中。最近,Segment Anything Model(SAM)作为一种强大的零样本分割器应运而生&…

数学中常用字母符号读法

文章目录 一、希腊字母二、其他字母1.字母上一横2.拉长的s(‌∫)‌3.数列中的e4. N:非负整数集合或自然数集合{0,1,2,3,…n} 一、希腊字母 Ω ω:欧米伽 Omega。 ∑ σ:西格玛 Sigma。 作用:是一个求和符号&#xf…

滑动窗口专题——找到所有字母的异位词

一、题目解析: 题意如图 二、算法分析 本题依旧是两种方法:暴力枚举、滑动窗口 暴力枚举: 枚举出所有的字串进行比较,符合则记录位置,最终返回结果数组。 滑动窗口哈希表: 思路:1、初始化左…

怎么区分Alpha因子和风险因子?

这是一个絮絮叨叨的专题系列,跟大伙儿唠一唠量化相关的小问题,有感而发写到哪算哪,这是第3期,来唠个14块钱的~ 不知大伙儿有木有这样的疑惑? 看到Barra里面有Size、Liquid等因子,这些因子同样出现在很多人的…

【Redis】String字符串

目录 String字符串 常见命令 SET GET MSET MGET SETNX 计数命令 INCR INCRBY DECY DECYBY INCRBYFLOAT 其他命令 APPEND GETRANGE SETRANGE STRLEN 内部编码 String类型的典型使用场景 缓存(Cache)功能 计数功能 共享会话(Session) String字符串 字符…

bat批处理文件 —— 用于自动化环境配置和项目执行

文章目录 一、什么是 bat ?1.1、支持 bat 的编辑软件1.2、常用命令 三、项目实战3.1、入门案例3.2、(自动化)环境配置与python库安装3.3、将 bat 当成一个简易的 .exe 可执行文件 四、标识符详解4.1、rem:添加注释4.2、echo off&a…

网工内推 | 上市公司IT工程师,最高15薪,周末双休

01 上海索辰信息科技股份有限公司 🔷招聘岗位:IT工程师 🔷岗位职责: 1、熟悉代码研发类企业的内部信息化管理,参与公司自主开发系统的规划和建设,搭建高级别内部信息安全体系,对内部信息的安全…

【practise】删除有序数组中的重复项

关于博主: 今天分享一道简单的关于“双指针”算法的题目。算是双指针中非常基础的题目,有兴趣可以借鉴一波~ 目录 1.题目介绍2.题解思路:双指针法3.代码示例 1.题目介绍 题目链接:LINK 本题要求是:对给定的有序数组…

Android中的沉浸式丝滑转场之共享元素转场动画

文章目录 1. 介绍2. 实现方法3. 举例演示3.1 举例一:普通页面间共享元素转场动画3.2 举例二:列表页面共享元素转场动画 4. 总结 1. 介绍 在Android开发中,经常会有页面转场的动画效果。普通的转场动画不过是左进右出,渐显渐隐&am…

树莓派4B学习笔记24:Python_SYN6288语音模块的控制函数

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1: ​ Python 版本3.7.3: 今日学习SYN6288语…

叛逆,批判

1、对以往说法的批判之一(第一次这么公开批判是2004-2005年): 这部英文版的《数学百科全书》似乎是从俄语版翻译过来的?我查了三本引用的图书文献,都没有关于“nonsingular”和“singular”的类似下面的说法&#xff…

加密市场再遭重创:多重利空因素引发超10亿美元抛售潮

四年前的全球“熔断潮”仿佛还在眼前,如今金融市场再度迎来剧烈震荡,全球股市与加密货币市场遭遇多重利空冲击,尤其是比特币和以太坊的闪崩使得市场恐慌情绪蔓延。这个“黑色星期一”不仅见证了股市的跳水,还标志着加密市场的又一…

每日学习笔记:C++ STL算法之已排序区间算法

目录 查找元素 检查某个元素是否存在: binary_search(beg, end, value) binary_search(beg, end, value, op) 检查数个元素是否存在: includes(beg, end, searchBeg, searchEnd) includes(beg, end, searchBeg, searchEnd, op) ​编辑 查找第一个或最后一…

网安新声 | 微软蓝屏事件安全启示录

网安加社区【网安新声】栏目,汇聚网络安全领域的权威专家与资深学者,紧跟当下热点安全事件、剖析前沿技术动态及政策导向,以专业视野和前瞻洞察,引领行业共同探讨并应对新挑战的策略与可行路径。 2024年7月19日,微软发…