首页 > 数据库 >Redis面试题大全

Redis面试题大全

时间:2024-08-06 14:23:24浏览次数:13  
标签:面试题 缓存 Key 过期 Redis key 请求 大全

文章目录


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 命令,有一定的限制。
    在这里插入图片描述

标签:面试题,缓存,Key,过期,Redis,key,请求,大全
From: https://blog.csdn.net/qq_29279641/article/details/140951353

相关文章

  • 【链表OJ】常见面试题 2
    文章目录1.[链表分割](https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking)1.1题目要求1.2哨兵位法2.[链表的回文结构](https://www.nowcoder.co......
  • 月薪 27K,年薪 40 的甲方网络安全负责人面试题(二面)上
    二面相比于一面,比较偏向于技术方向,由于篇幅原因,预计会分2到3次发出。Fastjson反序列化漏洞是哪个版本,能说一下它的原理和修复方式吗,修复之后还有其他绕过方式吗?我们常说的最经典的FastJson反序列化漏洞是1.2.22-1.2.24版本的。FastJson它本身有一个叫做自省的......
  • 面试题 .NET Core 开发工程师
    在面试.NETCore高级开发工程师时,通常会涉及多个方面的问题,以评估候选人在不同领域的深度和广度。以下是一些常见的面试题目分类及示例问题:###基础知识1.**.NETCore与.NETFramework的区别?**-请解释.NETCore和.NETFramework的主要区别,以及在什么情况下选择使用......
  • 2024大模型秋招LLM相关面试题整理
    0一些基础术语大模型:一般指1亿以上参数的模型,但是这个标准一直在升级,目前万亿参数以上的模型也有了。大语言模型(LargeLanguageModel,LLM)是针对语言的大模型。175B、60B、540B等:这些一般指参数的个数,B是Billion/十亿的意思,175B是1750亿参数,这是ChatGPT大约的参数规模。强......
  • Redis可以通过以下几种方式来避免内存溢出
    Redis可以通过以下几种方式来避免内存溢出:设置最大内存限制:可以使用maxmemory配置项来限制Redis的最大内存使用量。当Redis的内存占用超过了设置的最大内存限制时,Redis会根据所配置的内存策略来处理数据,例如删除最近最少使用的键或者拒绝写入请求。使用内存淘汰策略:当......
  • redis如何避免内存溢出
    Redis可以通过以下几种方式来避免内存溢出:设置最大内存限制:可以使用maxmemory配置项来限制Redis的最大内存使用量。当Redis的内存占用超过了设置的最大内存限制时,Redis会根据所配置的内存策略来处理数据,例如删除最近最少使用的键或者拒绝写入请求。使用内存淘汰策略:当......
  • Redis02——缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、缓存工具封装)
    目录缓存概念添加Redis缓存业务场景缓存作用模型java代码缓存更新策略主动更新的三种策略主动更新——CacheAsidePattern实际应用缓存穿透概念解决方法实际应用缓存雪崩概念解决方法缓存击穿互斥锁介绍 实际应用逻辑过期介绍实际应用  互斥锁VS......
  • 最全前端技术大全,供大家参考
    基础技术HTML5语义化标签本地存储(localStorage,sessionStorage)离线存储(ApplicationCache)WebWorkersWebSocketsCSS3FlexboxGrid媒体查询预处理器(Sass,LESS)CSSModulesCSS-in-JS(StyledComponents,Emotion)JavaScriptES6+新特性(let/const,arrowfun......
  • Redis分布式锁防止缓存击穿
    一、Nuget引入StackExchange.Redis、DistributedLock.Redis依赖二、使用 StackExchange.Redis对redis操作做简单封装publicclassRedisHelper{privatestaticConnectionMultiplexer_redis;privatestaticstring_connectionString;//静态构造函数,确保在程序启动时......
  • 关于Redis的面试
    一、Redis介绍Redis是一个开源的远程字典服务,使用C语言编写、支持网络调用、基于内存亦可持久化的Key-Value数据库,并提供多种语言的API。二、为什么要使用Redis内存数据库,速度很快工作单线程worker,串行化,原子操作,IO线程是多线程的。避免上下文切换使用IO模型,天生支撑......