Redis面试题——简化提纯版-备战春招,秋招

1、redis的优缺点

优缺点:

        1. 是基于内存存储的, 读写性能快 2. 支持持久化机制 3. 支持多种数据类型 4. 支持事务 5. 支持主从复制 6. redis是单线程的,但是redis6.0是多线程,此时的多线程是处理网络数据的读写和协议解析, redis的 命令还是单线程的

缺点: 1. 对结构化的查询支持比较差 2. redis较难支持在线扩容,在集群容量达到上限时在线扩容会比较复杂

2、什么是redis,它的作用是什么?

        redis是一个缓存层的组件,由C语言编写,它是通过键值对的形式来存储数据的,redis还提供了多种持久化 机制(RDB,AOF),性能可以达到110000/s 的读取数据以及81000/s的写入数据,redis还提供了主从,哨兵 以及集群的搭建方式,可以更方便的横向以及垂直扩展。

        作用:主要是用来减轻数据库的压力,比如说可以把数据以键值对的形式存到redis中,后端访问数据库的时 候,可以先查询Redis中有没有这个数据,如果有直接取出来,就不用再去访问数据库了。

        可以解决数据共享问题,比如说在分布式架构中,或者是微服务项目中,咱们有很多服务,可以把数据放到 redis里面,这些服务就可以共享redis中的数据。

3、Redis持久化是什么?

        因为redis是一个将数据存放在内存中的数据库,一旦发生关机或者重启,内存中的数据都会丢失,所以为了 能够重启时恢复数据,redis提供了持久化的机制,正常运行的时候根据策略生成持久化文件。在机器重启 后,我们就可以通过持久化文件来恢复redis中的数据。

可以通过主从同步来解决? 主机挂掉之后,可以让从节点成为主节点

        在极端情况下,比如说如果整个机房都停电了,那么主节点和从节点内存中的数据都丢了,这个时候就只能依 靠持久化文件来恢复数据,这也是持久化存在的意义。

4、redis的持久化机制

        redis是存储在内存中的,当断电时会丢失数据,使用redis持久化机制可以将redis在内存中的数据持久化 到磁盘中,防止丢失

redis持久化机制分为rdb和aof

rdb机制: redis内存中的数据每隔一段时间就会将整个内存中的数据生成一个镜像文件保存到本地磁盘中,如果 redis重启则可以直接把保存的镜像文件加载到内存中去

        例如: save 900 1 :在900秒内有一个key发生了改变,就执行rdb持久化机制 save 300 10 :在300秒内有10个key发生了改变,就执行rdb持久化机制

  特点:rdb持久化文件速度较快,而且存储的是二进制文件,传输方便

        rdb是每隔一段时间持久化一次,如果修改了数据,但是修改的数据没有达到持久化的条件,此时 会导致数据的丢失,无法保证绝对的安全 rdb持久化机制数据恢复的速度快,但是生成镜像文件的速度慢

注意:如果不配置的话,redis磨人的持久化机制是rdb.

aof机制: aof持久化机制是当我们在redis中执行的所有的增删改查命令都会写入到一个aof文件中,redis重启 的时候,就会执行该aof文件中所有的命令,来完成数据的恢复

        特点:aof写入文件的性能相对于rdb较差,恢复数据慢 aof文件较大,不便于传输 aof的数据安全性比rbd高,但是也不能做到100%数据不丢失

        AOF持久化时机 appendfsync always:每执行一个写操作,立即持久化到AOF文件中,性能比较低。每执行一个增删改命令 都立即写入aof文件效率低,但是数据的安全性最高 appendfsync everysec:每秒执行一次持久化数据丢失最多丢失1s的数据 appendfsync no:会根据你的操作系统不同,环境的不同,在一定时间内执行一次持久化。

        rdb默认持久化机制,aof 非默认持久化机制,redis官方推荐同时开启rdb和aof,同时开启时,数据 恢复优先使用aof持久化机制

5、Redis的数据恢复策略是怎么样的?

1.同时配置了RDB和AOF,启动时只加载AOF文件恢复数据,如果AOF文件损坏,那么根据RDB文件恢复数据。

2.只配置RDB,启动时加载RDB持久化文件恢复数据。

3.只配置AOF,重启时加载AOF文件恢复数据。

7、redis的数据一致性问题以及解决方案

对于缓存和数据库的操作,主要有以下两种方式

        1.先删除缓存,再更新数据库 但这样会导致,先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的 是旧值,缓存不一致发生。

         解决方案:延时双删 延时双删的方案的思路是,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数据库 之后,再Sleep 一段时间,然后再次删除缓存。 对于Sleep 的时间要对业务读写缓存的时间做出评估,只要Sleep 时间大于读写缓存的时间即可。

         流程如下: 线程1删除缓存,然后去更新数据库。 线程2来读缓存,发现缓存已经被删除,所以直接从数据库中读取,这时候由于线程1还没有更新完成,所以读 到的是旧值,然后把旧值写入缓存。

        线程1,根据估算的时间,Sleep,由于 Sleep 的时间大于线程2读数据+写缓存的时间,所以缓存被再次删 除。 如果还有其他线程来读取缓存的话,就会再次从数据库中读取到最新值。

        2.先更新数据库,再删除缓存 这个就更明显的问题了,更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存 中读取到的就是旧值,还是会发生不一致。

         解决方案:消息队列 消息队列的思路是,先更新数据库,成功后往消息队列发消息,消费到消息后再删除缓存,借助消息队列的重 试机制来实现,达到最终一致性的效果。

8、redis的缓存穿透,击穿,雪崩,倾斜什么情况?以及他 们的解决方案

        缓存击穿:就是某一个热点数据,缓存中某一时刻失效了,因而大量并发请求打到数据库上,就像被击穿了一 样。

 解决方案:1)通过synchronized+双重检查机制:某个key只让一个线程查询,阻塞其它线程       2)设置value永不过期       3)使用互斥锁(mutex key)      

         缓存穿透:出现这种情况是因为恶意频繁查询会对系统造成很大的问题,比如说key不在redis缓存并且数据 库中不存在,所以每次查询都会查询数据库从而导致数据库崩溃。

解决方案:1) 使用布隆过滤器: 热点数据等场景(具体看使用场景)

        缓存雪崩:雪崩指的是多个key查询并且同时出现高并发,缓存中失效或者查不到,然后都去数据库中查询, 从而导致数据库的压力突然上升,从而崩溃。

解决方案:1)可以通过缓存reload机制,预先去更新缓存,在即将发生高并发访问前手动触发加载缓存       2)不同的key,设置不同的过期时间,具体值可以根据业务决定,让缓存失效的时间点尽量均匀       3)做二级缓存,或者双缓存策略。比如说设置一个主节点A1为原始缓存,一个从节点A2为拷贝缓 存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期,这样就可以保证A1失效后仍然可 以通过查询A2来降低数据库的查询压力。        

        缓存倾斜:又称热点key倾斜,就是一个热点key存在一个redis集群上,结果被访问时,高并发的集中到一台 服务器上,从而造成倾斜。

解决方案:1)将一些特别热点的key直接放在客户端进行存储,设置过期时间,过期后再从后台中查询

9、Redis采用的过期策略

        redis 主要是基于内存来进行高性能、高并发的读写操作的,而内存是很宝贵而且是有限的,当然是干掉不常 用的数据,保留常用的数据了,这是由 redis 的过期策略来决定。

Redis采用的过期策略是惰性删除+定期删除同时使用

   惰性删除流程 在进行get或setnx等操作时,先检查key是否过期, 若过期,删除key,然后执行相应操作; 若没过期,直接执行相应操作

   定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key) 遍历每个数据库(就是redis.conf中配置的"database"数量,默认为16) 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体时下 边的描述) 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历 随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

        但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除, 此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?

        答案是:走内存淘汰机制。

10、redis内存淘汰机制

redis 内存淘汰机制有以下几个:

noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用 的)。

allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用 吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。

volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。

volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

11、支持的数据类型

string(字符串): 可以是字符串,数值或者二进制

hash(哈希): 是一个键值对的集合

set(集合): 无序去重的集合, 对于实现共同好友,共同关注等功能很方便

zset(评分 集合): 有序的集合,可以实现排行榜和带权重的消息队列

list(列表): 有序可重复的集合

12、redis内存用完了怎么办?

        本质上是不可能使用完的,因为是基于内存存储的, 如果真的用完了,执行写入命令的时候会报错,但是还是可以正常读命令返回数据的

可以配置淘汰策略:

ALLkeys-lru: 当内存不足以写入新的数据时, 从数据集中移除最少最近使用的

key Allkeys-random: 当内存不足以写入新的数据时, 随机淘汰

key volatile-lru: 从数据集中移除最少最近使用的

key volatile-random: 从设置了过期时间的key中,从数据集中随机移除

key volatile-ttl: 从设置了过期时间的key中挑选将要过期的

key no-eviction: 禁止删除数据,如果内存不足时,写入操作会报错

13、redis集群

主从模式: 分为一主一从/一主多从, 只有主节点(master)节点负责读写操作, 从节点只负责读操 作; 当主数据库的数据发生变化的时候,会自动将数据同步到从数据库中

同步机制: 1. 保存主节点信息 2. 主从建立socket连接 3. 发送ping命令, 检查网络状态 4. 权限验证 5. 同步数据集 5. 命令持续复制

        优点: 读写分离, 增强了数据缓存并发读的能力, 增加了数据安全性, 数据备份能力, 还有读数据的可靠性的增加

         缺点: 主节点存在单点故障问题,无法解决 没有增强写的能力 redis的容量大小取决于主节点,容量无法进行拓展 哨兵(sentinel)模式: 其实就是在redis集群中每一个节点创建一个哨兵, 由哨兵负责监控当前节点是否存活 作用: 监控当前节点及主节点 当前主节点挂掉之后, 负责选取新的主节点

工作原理:

1. 每个sentinel每秒钟会向她所知的master节点发送一次ping的操作

2. 此时哨兵会记录该ping的时间是否超过指定的值, 如果操作则会记录该实例客 观下线

3. 当足够数量的哨兵在范围时间内去确定该master已经进入下线状态, 则会重新 选举出新的哨兵领导者,负责故障转移的工作

4. 哨兵会推选出表现良好的从节点晋升为主节点,然后通知其他从节点更新主节点 信息
        好处: 解决了主从模式下的单点故障问题, 当主节点挂掉之后会自动进行发起选择新的主节点 数据安全性提高

        缺点: 仍然没有增强redis的写性能 redis的容量大小取决于主节点,容量无法进行拓展操作

        去中心化模式: 本质上就是多主多从,就是有多台master节点负责读写操作, 多台master节点会将整个集群分为16384 个slot数据槽,数据都存储在这个槽中 工作原理:

        当我们执行set命令时, 首先会对执行的key值进行一个crc16算法的运算得到hash值, 此时这个hash 只一个很大的值,然后对16384进行取余操作,余数就是对应的存储的数据槽中

slot作用: 1. 便于集群存储数据 2. 便于数据的迁移 如果当前某个主节点挂掉,那么它所对应的从节点就会晋升为主节点

14、Redis为什么这么快?

1. 基于内存存储,读写的速度比较快

2. IO多路复用模型

3. 高效的数据结构: redis每种数据结构底层都进行了优化,目的追求更快地速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值