redis的常见面试题

1、redis是什么

redis是C语言开发的(遵从BSD协议)的高性能内存数据库。
**优点:**数据在内存中,读写速度非常快,性能优越,支持并发10wQPS;
支持多种数据类型(String,Set,List,Hash,ZSet);
支持数据持久化;
可以做缓存、数据库、消息中间件;
主从复制、哨兵、高可用;
可以做分布式锁。

2、redis的5中数据类型

Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value
redis的常见面试题_第1张图片
String 是 Redis 最基本的类型,可以理解成与 Memcached一模一样的类型,一个 Key 对应一个 Value。Value 不仅是 String,也可以是数字。
String 类型是二进制安全的,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。
Hash是一个键值(key-value)的集合。Redis 的 Hash 是一个 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。常用命令:hget,hset,hgetall 等。
List 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等。
应用场景:List 应用场景非常多,也是 Redis 最重要的数据结构之一,比如 Twitter 的关注列表,粉丝列表都可以用 List 结构来实现。
数据结构:List 就是链表,可以用来当消息队列用。Redis 提供了 List 的 Push 和 Pop 操作,还提供了操作某一段的 API,可以直接查询或者删除某一段的元素。
实现方式:Redis List 的是实现是一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了额外的内存开销。
Set 是 String 类型的无序集合。集合是通过 hashtable 实现的。Set 中的元素是没有顺序的,而且是没有重复的。常用命令:sdd、spop、smembers、sunion 等。
应用场景:Redis Set 对外提供的功能和 List 一样是一个列表,特殊之处在于 Set 是自动去重的,而且 Set 提供了判断某个成员是否在一个 Set 集合中。
Zset 和 Set 一样是 String 类型元素的集合,且不允许重复的元素。常用命令:zadd、zrange、zrem、zcard 等。
使用场景:Sorted Set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。
当你需要一个有序的并且不重复的集合列表,那么可以选择 Sorted Set 结构。
和 Set 相比,Sorted Set关联了一个 Double 类型权重的参数 Score,使得集合中的元素能够按照 Score 进行有序排列,Redis 正是通过分数来为集合中的成员进行从小到大的排序。
实现方式:Redis Sorted Set 的内部使用 HashMap 和跳跃表(skipList)来保证数据的存储和有序,HashMap 里放的是成员到 Score 的映射。
而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 Score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
数据结构总结
redis的常见面试题_第2张图片

3、redis的缓存雪崩、穿透、击穿

缓存雪崩:所有的缓存同一时间失效,造成大量请求访问数据库
解决:给缓存设置不同的失效时间
缓存穿透:大量请求缓存和数据库中不存在的数据(例如数据库中的id自增从1开始,但是以id=-1进行大量请求就会造成缓存穿透)
解决:对请求进行校验,对于不合法的请求直接return,或者使用redis的布隆过滤器(内部通过高效算法确定是否存在该数据)
缓存击穿:指某个非常热点的key失效,造成大量请求访问数据库
解决:热点的key设置永不过期

4、redis的单线程模型

Redis 完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度是 O(1)。
数据结构简单,对数据操作也简单。
采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的 CPU 切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。
使用多路复用 IO 模型,非阻塞 IO。

5、Redis 和 Memcached 的区别

存储方式上:Memcache 会把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部分数据存在硬盘上,这样能保证数据的持久性。
数据支持类型上:Memcache 对数据类型的支持简单,只支持简单的 key-value,,而 Redis 支持五种数据类型。
使用底层模型不同:它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
Value 的大小:Redis 可以达到 1GB,而 Memcache 只有 1MB。

6、redis的淘汰策略

redis的常见面试题_第3张图片

7、redis的持久化

两种持久化的方式:AOF和RDB
rdb:间隔一定时间将内存中的数据保存到一个dump文件中
缺点:redis宕机可能会丢失某个间隔时间的数据
aof:把所有对redis服务器的操作命令保存到一个文件中,命令的集合
缺点:随着命令的增多,aof文件体积会变大,同时写操作也会耗时
:redis默认使用rdb持久化的方式,redis重启时会优先使用aof回复数据

8、RDB和AOF

RDB:当redis需要进行持久化的时候,会fork出一个子进程,将数据写到一个临时的rdb文件,当临时文件写完之后再替换原来的rdb文件。
AOF:使用 AOF 做持久化,每一个写命令都通过 write 函数追加到 appendonly.aof 中

9、redis的主从复制

由于redis存在单点故障,所以需要配置主从模式,可以利用redis中的哨兵模式,来监控主节点的状态,如果主节点挂掉,从节点可以继续提供功能。

10、哨兵模式

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
redis的常见面试题_第4张图片
哨兵的作用
向服务器(包括从服务器)发送命令,来检测服务器的状态;
当主服务器宕机时,以发布订阅的模式通知其他从服务器,修改配置文件, 切换主机。
多哨兵模式:单一的哨兵监控服务器可能会出现问题,可以使用多个哨兵来进行监控,同时哨兵之间还可以相互监控,这就是多哨兵模式。
主观下线:当哨兵A发现主服务器宕机时,并不会立即执行failover操作,仅仅是哨兵A发现服务器不可用,这就称之为主管下线。
客观下线:当某一个哨兵发现主服务器宕机后,其他哨兵也检测到这一现象并达到一定数量时,哨兵之间会进行一次投票,进行failover操作,完成切换后,再以发布订阅的模式通知其他哨兵监控的从服务器进行主服务器的切换,这一过程称之为客观下线。
redis的常见面试题_第5张图片

12、主从复制的作用

数据冗余:主从复制实现数据的热备份,是持久化之外的一种数据冗余方式
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障 恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

13、从节点开启主从模式有三种方式

A:配置文件:在从服务器的配置文件中加入:slaveof
B:命令行:redis-server启动命令后加入 --slaveof
C:Redis服务器启动后,直接通过客户端执行命令:slaveof
,则该Redis实例成为从节点。

14、主从复制的过程和原理

redis的常见面试题_第6张图片
主从复制的6个过程
1)保存主节点信息,执行slaveof 命令后,从节点会保存主节点的信息;
2)建立socket连接:从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接,如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行 slaveof no one 取消复制;
3)发送 ping 命令,如果没有收到主节点的pong回应,从节点会断开复制连接,下次定时任务会发起重连;
4)权限验证,如果主节点设置了 requirepass 参数,则需要密码验证,从节点必须配置 masterauth 参数保证与主节点相同的密码才能通过验证;如果验证失败复制将终止,从节点重新发起复制流程;
5)同步数据集,主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分操作是耗时最长的步骤;
6)命令持续复制,当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。

你可能感兴趣的:(redis)