还在郁郁寡欢?啃完 666 页 Java 面试高频宝典,十月保你定级腾讯 T3-2
八月份,我不自量力的面试了某大厂的 Java 开发岗位,迎面走来一位风尘仆仆的中年男子,手里拿着屏幕还亮着的 Mac。他冲着我礼貌的笑了笑,然后说了句“不好意思,让你久等了”,然后示意我坐下,说:“我们开始吧,看了你的简历,觉得你对 Redis 应该掌握的不错,我们今天就来讨论下 Redis……”。我想:“来就来,兵来将挡水来土掩”。
Redis 是什么
面试官:你先来说下 Redis 是什么吧!
我:(这不就是总结下 Redis 的定义和特点嘛)Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。
我顿了一下,接着说,Redis 作为一个内存数据库:
性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。
单进程单线程,是线程安全的,采用 IO 多路复用机制。
丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
支持数据持久化。
可以将内存中数据保存在磁盘中,重启时加载。
主从复制,哨兵,高可用。
可以用作分布式锁。
可以作为消息中间件使用,支持发布订阅。
五种数据类型
面试官:总结的不错,看来是早有准备啊。刚来听你提到 Redis 支持五种数据类型,那你能简单说下这五种数据类型吗?
我:当然可以,但是在说之前,我觉得有必要先来了解下 Redis 内部内存管理是如何描述这 5 种数据类型的。
说着,我拿着笔给面试官画了一张图:
我:首先 Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。
redisObject 最主要的信息如上图所示:type 表示一个 value 对象具体是何种数据类型,encoding 是不同数据类型在 Redis 内部的存储方式。
比如:type=string 表示 value 存储的是一个普通字符串,那么 encoding 可以是 raw 或者 int。
我顿了一下,接着说,下面我简单说下 5 种数据类型:
①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,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
数据类型应用场景总结:
接下来就是连环炮式提问,越问越深(⊙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 题解析文档》,有需要的小伙伴仅需添加小助理 vx:XIaonan00000621 即可获取免费下载方式!
Redis 缓存
Redis 实现分布式锁
JVM 性能调优
Java 内存区域
垃圾回收器和内存分配策略
JVM 的执行子系统
编写高效优雅 Java 程序
深入了解性能优化
MySQL 性能优化
事务
锁
SQL 优化原则
JOIN 的原理
执行计划与执行明细
执行流程
表结构对性能的影响
索引
我的 Spring 学习笔记
Spring 类
Spring MVC
Spring AOP
Spring IOC
事务管理
Spring IOC
Spring AOP
Spring 学习笔记思维脑图
上述所有的笔记都可以分享给大家,只需要帮忙转发分享关注 @JavaSpring 高级进阶 边上有私信入口,私信【脑图】可获取领取地址。
俗话说的好,只要功夫深,铁杵磨成针,平时准备好,面试不用慌。
还有更多的面试刷题库:《1000 道互联网高频面试解析》《489 道资深工程师面试解答》《JAVA 核心面试知识点整理》
有需要的小伙伴仅需添加小助理 vx:XIaonan00000621 即可获取免费下载方式!
《1000 道互联网高频面试解析》
本篇 PDF 文档包含各大互联网公司面试高频题,刷完基本面试没有问题,只是面试造飞机,工作拧螺丝就得看自己啦!
《489 道资深工程师面试解答》
《JAVA 核心面试知识点整理》
有需要的小伙伴仅需添加小助理 vx:XIaonan00000621 即可获取免费下载方式!
评论