redis详细教程(用了这么久的Redis你懂它吗)(1)

Redis 作为我们最常用的内存数据库,很多地方你都能够发现它的身影,比如说登录信息的存储,分布式锁的使用,其经常被我们当做缓存去使用。

可是,用了这么久的redis,你懂它吗?

其他《面试八股文》系列文章


目录1.什么是 redis?它能做什么?

redis详细教程(用了这么久的Redis你懂它吗)(2)

redis: redis 即 Remote Dictionary Server,用中文翻译过来可以理解为远程数据服务或远程字典服务。其是使用 C 语言的编写的key-value存储系统

应用场景:缓存,数据库,消息队列,分布式锁,点赞列表,排行榜等等

2.redis 有哪八种数据类型?有哪些应用场景?

redis 总共有八种数据结构,五种基本数据类型和三种特殊数据类型

redis详细教程(用了这么久的Redis你懂它吗)(3)

五种基本数据类型:

3.redis为什么这么快?

redis详细教程(用了这么久的Redis你懂它吗)(4)

官方数据 redis 可以做到每秒近10w的并发,这么快的原因主要总结为以下几点:

4.听说 redis 6.0之后又使用了多线程,不会有线程安全的问题吗?

不会

其实 redis 还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程,所以是不会有线程安全的问题。

之所以加入了多线程因为 redis 的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高redis的性能。

5.redis 的持久化机制有哪些?优缺点说说

redis 有两种持久化的方式,AOF 和 RDB.

redis详细教程(用了这么久的Redis你懂它吗)(5)

AOF:

AOF的优缺点

redis详细教程(用了这么久的Redis你懂它吗)(6)

redis详细教程(用了这么久的Redis你懂它吗)(7)


RDB:

RDB的优缺点

redis详细教程(用了这么久的Redis你懂它吗)(8)

redis详细教程(用了这么久的Redis你懂它吗)(9)

6. Redis的过期键的删除策略有哪些?

过期策略通常有以下三种:

redis详细教程(用了这么久的Redis你懂它吗)(10)

7. Redis的内存满了怎么办?

实际上Redis定义了「8种内存淘汰策略」用来处理redis内存满的情况:

8.Redis 的热 key 问题怎么解决?

热 key 就是说,在某一时刻,有非常多的请求访问某个 key,流量过大,导致该 redi 服务器宕机

redis详细教程(用了这么久的Redis你懂它吗)(11)

解决方案:

9.缓存击穿、缓存穿透、缓存雪崩是什么?怎么解决呢?

缓存穿透:

redis详细教程(用了这么久的Redis你懂它吗)(12)

解决方案:

缓存击穿:

redis详细教程(用了这么久的Redis你懂它吗)(13)

解决方案:

缓存雪崩:

redis详细教程(用了这么久的Redis你懂它吗)(14)

解决方案:

10.Redis 有哪些部署方式?

redis详细教程(用了这么久的Redis你懂它吗)(15)

11.哨兵有哪些作用?12.哨兵选举过程是怎么样的?

选出领头哨兵后,就开始了故障修复,会从选出一个从数据库作为新的master

13.cluster集群模式是怎么存放数据的?

一个cluster集群中总共有16384个节点,集群会将这16384个节点平均分配给每个节点,当然,我这里的节点指的是每个主节点,就如同下图:

redis详细教程(用了这么久的Redis你懂它吗)(16)

14.cluster的故障恢复是怎么做的?

判断故障的逻辑其实与哨兵模式有点类似,在集群中,每个节点都会定期的向其他节点发送ping命令,通过有没有收到回复来判断其他节点是否已经下线。

如果长时间没有回复,那么发起ping命令的节点就会认为目标节点疑似下线,也可以和哨兵一样称作主观下线,当然也需要集群中一定数量的节点都认为该节点下线才可以,我们来说说具体过程:

redis详细教程(用了这么久的Redis你懂它吗)(17)

15.主从同步原理是怎样的?

因为不会阻塞,所以,这部分初始化完成后,当主数据库执行了改变数据的命令后,会异步地给slave,这也就是我们说的复制同步阶段,这个阶段会贯穿在整个中从同步的过程中,直到主从同步结束后,复制同步才会终止。

16.无硬盘复制是什么?

我们刚刚说了主从之间是通过RDB快照来交互的,虽然看来逻辑很简单,但是还是会存在一些问题,但是会存在着一些问题。

为了解决这种问题,redis在后续的更新中也加入了无硬盘复制功能,也就是说直接通过网络发送给slave,避免了和硬盘交互,但是也是有io消耗的

,