【第三章:服务端通用工具】第16节:缓存技术 - Redis解析
大家好,很高兴我们可以继续学习交流Java高频面试题。从本小节开始,我们进入了第三个章节,主要介绍服务端的通用工具,即redis和kafka相关知识点。在我们的日常开发中,经常会需要使用缓存和消息队列。缓存的使用可以减少网络请求或者查询数据库的次数,有效提高访问速度。消息队列的使用可以实现生产者和消费者的解耦,实现异步通信过载保护等功能。
在当今的招聘需求中,即使是校园招聘也对缓存和消息队列有一定的考察要求,不要求大家有多好多深的掌握,但是基本的概念与原理还是需要了解的。可以说,缓存和消息队列的了解与熟悉,对于我们的面试来说是一个极大的加分项。
本小节就业界使用比较广的redis缓存技术进行一个简单的交流与学习,主要是针对面试中常见的redis知识点来展开交流,旨在让大家对redis的基本概念与原理有一定的了解与掌握。
(1)redis有了解吗?
答:redis(Remote Dictionary Server远程字典服务),是一款高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库。因为数据都在内存中,所以运行速度快。redis支持丰富的数据类型并且支持事务,事务中的所有命令会被序列化、按顺序执行,在执行的过程中不会被其他客户端发送来的命令打断。
解析:
这是对redis考察的一个试探性提问,应聘者可以根据自己的理解与掌握,先从整体上对redis进行一个阐述。针对redis基础知识的考察,面试官还可以选择继续追问如下的常见知识点。
redis相比memcached有哪些优势?(掌握)
- memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型。
- redis的速度比memcached快很多,并且redis支持数据的持久化。
- redis支持数据的备份,即master-slave模式的数据备份。
- 使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。redis自己构建了VM 管理机制。
- value大小不同,redis最大可以达到512MB,而memcache只有1MB。
面试官:“redis都支持哪些数据类型?应用场景有哪些?”(掌握)
redis支持五种数据类型作为其Value,redis的Key都是字符串类型的。
- string:redis 中字符串 value 最大可为512M。可以用来做一些计数功能的缓存(也是实际工作中最常见的)。
- list:简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边),其底层实现是一个链表。可以实现一个简单消息队列功能,做基于redis的分页功能等。
- set:是一个字符串类型的无序集合。可以用来进行全局去重等。
- sorted set:是一个字符串类型的有序集合,给每一个元素一个固定的分数score来保持顺序。可以用来做排行榜应用或者进行范围查找等。
- hash:键值对集合,是一个字符串类型的 Key和 Value 的映射表,也就是说其存储的Value是一个键值对(Key- Value)。可以用来存放一些具有特定结构的信息。
其实redis还支持三种特殊的数据类型,分别为BitMap、Geo和HyperLogLog,感兴趣的同学可以自行学习。
一般情况下,可以认为redis的支持的数据类型有上述五种,其底层数据结构包括:简单动态字符串,链表,字典,跳表,整数集合以及压缩列表。
面试官:“redis的配置文件有了解吗?”
下载并且解压redis之后,在解压目录下有个配置文件 redis.windows.conf(大家可以自行查阅),在配置文件中对redis进行了分模块配置,常用的模块如下:
- NETWORK:该模块可以配置一些redis服务器地址,端口以及超时时间等
- GENERAL:该模块可以对日志文件的路径和日志级别等进行配置
- SNAPSHOTTING:redis持久化配置信息等
- REPLICATION:redis集群配置等信息
- MEMORY MANAGEMENT:内存管理,包括数据过期删除策略信息的设置
- APPEND ONLY MODE:日志持久化方式信息设置
(2)redis是单线程的吗?为什么执行速度这么快?(重点掌握)
答: redis是单线程的,redis的单线程是指网络请求模块使用了一个线程,所以不需考虑并发安全性。但是对于需要依赖多个操作的复合操作来说,还是需要锁的,而且有可能是分布式锁。
那么单线程的redis为什么执行速度如此之快?
- 基于内存实现,完全内存计算
- 单线程操作,避免了线程上下文切换操作
- 多路I/O复用的线程模型,实现了一个线程监控多个IO流,及时响应请求
- redis对外部的依赖比较少,属于轻量级内存数据库
解析:
redis的线程模型多路I/O复用机制是一个比较重要并且常见的考察点。目前支持I/O多路复用的系统调用有select,pselect,poll,epoll等函数。I/O多路复用就是通过一种机制一个进程可以监视多个描述符,一旦某个描述符读就绪或者写就绪,其能够通知应用程序进行相应的读写操作。
多路I/O复用机制与多进程和多线程技术相比系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
关于常见函数的特点如下所示:
- select函数:
- 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
- 有最大监听连接数1024个的限制
- 如果任何一个sock(I/O stream)出现了数据,select没有返回具体是哪个返回了数据,需要采用轮询的方式去遍历获取
- 线程不安全(当你在一个线程中已经监听该socket,另一个线程想要将该socket关闭,则结果会不可预知)
- “If a file descriptor being monitored by select() is closed in another thread, the result is unspecified”
- poll函数:
- 去掉了1024的限制(使用链表搞定)
- 不再修改传入的参数数组
- 依然是线程不安全的
- epoll函数:
- epoll 不仅返回socket组里面数据,还可以确定 具体哪个socket有数据
- 线程安全
题目总结:
限于篇幅,在这个题目中,我们仅仅是简单对线程模型多路I/O复用机制做了一个阐述与介绍,有能力的同学可以继续研究其具体实现机制,这个题目是面试中的一个很好的加分项(如果大家可以阐述清楚)
(3)使用redis可能出现的问题:
答: 在这里我们主要介绍Redis可能出现的四个问题,如下所示:
缓存雪崩:
举例:缓存同一时间大面积的失效,这个时候又来的一波请求都到数据库上,导致数据库连接异常。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>