今年5月,我在一家大工厂的Java开发职位面试中不自量力,一种风尘仆仆的挣扎心情迎面扑来,屏幕还开着的Mac。他礼貌地对我笑了笑,然后说了一句“抱歉让你久等了”,然后示意我坐下,说:“我们开始吧,看看你的简历,觉得你应该对Redis有一个很好的掌握。咱们今天讨论Redis”。我想,“来吧,来吧,来吧,来吧。”
Redis 是什么
面试官:请先告诉我Redis是什么!Me:(这是对Redis的定义和特点的总结)Redis是用C语言开发的开源(遵循BSD协议)键值内存数据库,可以作为数据库、缓存、消息中间件等使用。
这是一个NoSQL(不仅仅是SQL)数据库。
我停顿了一下,然后说,Redis作为内存中的数据库:
性能出色,数据在内存中,读写速度非常快,支持并发10W QPS。单进程单线程,线程安全,采用IO复用机制。丰富的数据类型,支持字符串、哈希、列表、集合、排序集合等等。支持数据持久性。您可以将内存中的数据保存到磁盘,并在重新启动时加载。主从副本,包容老师,高可用性。可以用作分布式锁。它可以作为消息中间件,支持发布和订阅。
五种数据类型
面试官:总结的不错。看来我准备好了。刚才听你提到Redis支持五种数据类型,那么你能简单介绍一下这五种数据类型吗?我:当然,但是在说之前,我觉得有必要知道Redis的内存管理是如何描述这五种数据类型的。
说着,我拿起笔,给面试官画了一幅画:
我:首先,Redis内部使用一个redisObject对象来表示所有的键和值。
redisObject最重要的信息如上图所示:type表示一个value对象是什么样的数据类型,编码是不同的数据类型在Redis中的存储方式。
例如,type=string意味着值存储一个普通字符串,因此编码可以是raw或int。
我停顿了一下,然后说,让我简单谈谈以下五种数据类型:
(1) String是Redis最基本的类型,可以理解为和Memcached一样的类型,一个Key对应一个Value。值不仅是一个字符串,也是一个数字。
String类型是二进制安全的,这意味着Redis的String类型可以包含任何数据,例如jpg图片或序列化对象。String类型的值最多可以存储512M。
哈希是一组键值。Redis的Hash是字符串的键值映射表。哈希特别适合存储对象。常用命令:hget、hset、hgetall等。
List list是一个简单的字符串列表,按照插入顺序排序。您可以将元素添加到列表的头部(左)或尾部(右)。常用命令:lpush、rpush、lpop、rpop、r range等。
应用场景:List的应用场景很多,也是Redis最重要的数据结构之一。比如推特的关注列表和粉丝列表都可以用列表结构来实现。
结构:列表是一个链表,可以作为消息队列使用。Redis提供了List的Push和Pop操作,还提供了操作某一节的API,可以直接查询或删除某一节的元素。
实现:Redis List是一个双向链表,不仅可以支持反向搜索和遍历,而且操作起来也更加方便,但是也会带来额外的内存开销。
集合是字符串类型的无序集合。集合是通过哈希表实现的。集合中的元素没有顺序,并且没有重复。常用命令:sdd、spop、smembers、sunion等。
场景:Redis Set提供的功能是一个和list一样的List。特别之处在于集合自动删除重复项,集合提供判断成员是否在集合集合中的能力。
ZSet和Set一样,是String类型元素的集合,不允许重复元素。常用命令:zadd、zrange、zrem、zcard等。
使用场景:排序集可以通过用户提供额外的评分参数对成员进行排序,并有序插入,即自动排序。
快速酒窝需要一个有序且不重复的集合列表,所以可以选择排序集合结构。
与“集合”相比,“排序集合”与双类型权重的参数相关联。
Score,使得集合中的元素能够按照 Score 进行有序排列,Redis 正是通过分数来为集合中的成员进行从小到大的排序。实现方式:Redis Sorted Set 的内部使用 HashMap 和跳跃表(skipList)来保证数据的存储和有序,HashMap 里放的是成员到 Score 的映射。
而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 Score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
数据类型应用场景总结:
接下来就是连环炮式提问,越问越深(⊙o⊙),不免紧张了起来。
Redis 缓存你是怎么使用的?实际项目中使用缓存会遇到哪些问题?Redis缓存血崩、缓存穿透、缓存击穿的区别?Redis多线程模型?Redis 和 Memcached 的区别?Redis 的持久化机制?Redis 持久化机制 AOF 和 RDB 有哪些不同之处?Redis主从复制原理?Redis主从复制如何保证数据一致性?Redis数据同步原理?Redis主从复制会存在哪些问题?解决方案是?缓存的更新策略有几种?分别有什么注意事项?请介绍几个可能导致 Redis 阻塞的原因Redis 集群架构模式有哪几种?Redis 集群最大节点个数是多少?Redis 集群的主从复制模型是怎样的?请介绍一下 Redis 集群实现方案Redis 集群会有写操作丢失吗?为什么?Redis 慢查询是什么?通过什么配置?最终全部回答完后,面试官看了我一眼,看来你对Redis了解的很透彻啊,那接下来我们再约一下时间谈谈JVM性能优化、高并发应用场景解决方案。
由于文章篇幅限制不能全部展示,这里只是展示的一部分Redis相关的面试题集,一部分解析,更多的Redis面试整理解析可以看整理的《大厂Redis高频面试75题解析文档》,有需要的朋友麻烦帮忙转发后私信回复我【面试】即可获取资料的免费领取方式!
Redis缓存
Redis实现分布式锁
JVM性能调优
Java内存区域垃圾回收器和内存分配策略JVM的执行子系统编写高效优雅Java程序深入了解性能优化MySQL性能优化
事务锁SQL优化原则JOIN的原理执行计划与执行明细执行流程表结构对性能的影响索引我的Spring学习笔记
Spring类Spring MVCSpring AOPSpring IOC事务管理俗话说的好,只要功夫深,铁杵磨成针,平时准备好,面试不用慌。
还有更多的面试刷题库:《1000道互联网高频面试解析》《489道资深工程师面试解答》《JAVA核心面试知识点整理》
转发分享关注 后私信【面试】获取领取方式
《1000道互联网高频面试解析》
本篇PDF文档包含各大互联网公司面试高频题,刷完基本面试没有问题,只是面试造飞机,工作拧螺丝就得看自己啦!
《489道资深工程师面试解答》
《JAVA核心面试知识点整理》
转发+转发+转发