【云驻共创】Redis 常见面试题有哪些?

举报
架构师聊技术 发表于 2022/10/14 17:37:25 2022/10/14
【摘要】 Redis在项目开发中是非常流行的缓存中间件,主要是为数据库分压使用、分布式锁及简单的广播消息队列使用,在面试中也是经常聊起的技术点,这篇文章整理了在面试中经常被问起的功能点,欢迎拍砖

Redis在项目开发中是非常流行的缓存中间件,主要是为数据库分压使用、分布式锁及简单的广播消息队列使用,在面试中也是经常聊起的技术点,这篇文章整理了在面试中经常被问起的功能点,欢迎拍砖

 

 

1.Redis是什么?

  • Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

2.redis 的五大数据类型

  • Redis 有 5 种数据类型:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
  • Redis 的列表相当于 Java 语言里面的 LinkedList ,注意它是链表而 不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
  • Redis 的哈希相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
  • Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。 当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
  • zset 类似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。

3.Redis真的是单线程的吗?

  • 0之前是单线程的,Redis6.0之后开始支持多线程;redis内部使用了基于epoll的多路服用,也可以多部署几个redis服务器解决单线程的问题;redis主要的性能瓶颈是内存和网络;内存好说,加内存条就行了,而网络才是大麻烦,所以redis6内存好说,加内存条就行了;而网络才是大麻烦,所以redis6.0引入了多线程的概念,
  • 0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。

4.Redis主从、哨兵、集群架构优缺点比较

  • 主从:主从切换需要运维介入
  • 哨兵模式:主从切换不需要运维介入就能切换成功,哨兵配置略微复杂,性能和高可用表现一般。例如当主从切换的瞬间存在访问瞬断的情况,并且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发。单个节点内存不宜设置过大,否则会导致持久化文件过大,影响数据恢复或主从同步效率。单个节点100个G,性能就会比较低。
  • 集群架构:redis集群是一个由一个主从节点群组成的分布式服务器群。其不需要哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展。分片存储的,100G分别分配给不同的节点来,该系统也会出现瞬断问题,属于局部瞬断。

5.Redis 与其它 key-value 存储有什么不同?

  • Redis 有着更为复杂的数据结构并且提供对它们的原子性操作,这是一个不同于其它数据库的进化路径。Redis 的数据类型都是基于基本数据结构的,同时对程序员透明,无需进行额外的抽象。
  • Redis 运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同复杂度的数据结构,在内存中操作起来非常简单,这样 Redis可以做很多内部复杂性很强的事情。同时,在磁盘存储格式方面它们是紧凑的、以追加的方式产生的,因为它们并不需要进行随机访问。

总结

 Redis因为在开发中太常用,所以在面试的时候,一般都会涉及到一些交流的技术点,平时可以多做些准备,熟悉每个Redis的技术点,对如果在实际项目上使用也是非常有帮助、游刃有余。

 如果有异地多活方面的问题,欢迎留言或者私信沟通。

喜欢的朋友记得给个关注~

本文参与华为云社区【内容共创】活动第20期。
https://bbs.huaweicloud.cn/blogs/374925

任务30:Redis 常见面试题有哪些?

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。