【第三章:服务端通用工具】第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%内容,订阅专栏后可继续查看/也可单篇购买

Java开发岗高频面试题全解析 文章被收录于专栏

<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论
关于分布式锁,为了使得加锁操作具有原子性,不可以使用多条命令来完成,我们可以使用带多个参数的set命令来完成,如下所示:jedis.set(String key, String value, String nxxx, String expx, int time) 第一个为key,我们使用key来当锁,因为key是唯一的。 第二个为value,我们传的是requestId,通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。 第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作; 第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定。 第五个为time,与第四个参数相呼应,代表key的过期时间。
6 回复 分享
发布于 2020-02-29 21:23
二刷打卡
1 回复 分享
发布于 2020-08-22 11:32
打卡
点赞 回复 分享
发布于 2023-09-08 20:45 河南
select函数的上限不是1024吧,是默认配置了1024
点赞 回复 分享
发布于 2021-08-03 23:23
双删延时的解决办法。可以先删除缓存数据,然后再更新数据库数据,最后再隔固定的时间再次删除缓存
点赞 回复 分享
发布于 2021-04-09 14:42
没有分布式系统的吗?
点赞 回复 分享
发布于 2020-09-19 20:50
打卡 一刷。
点赞 回复 分享
发布于 2020-09-11 11:12
老师,能不能推荐一本redis的书?不知道看哪本比较好
点赞 回复 分享
发布于 2020-04-19 14:37
请问有关于操作系统相关更新的打算吗?这方面比较欠缺,网上又太杂,特别是内核态和用户态如何转换,网上的感觉不太对,看书又看不太懂
点赞 回复 分享
发布于 2020-04-12 15:06
请问老师:redis数据丢失怎么办?
点赞 回复 分享
发布于 2020-03-12 15:07
为什么感觉好多知识点都没讲? 处理并发呢,分布式锁呢
点赞 回复 分享
发布于 2020-02-28 17:14
滴滴,打卡
点赞 回复 分享
发布于 2020-02-20 21:44
打卡
点赞 回复 分享
发布于 2020-02-13 18:22
看懂了吗
点赞 回复 分享
发布于 2020-01-15 17:43
打卡
点赞 回复 分享
发布于 2020-01-06 22:23

相关推荐

评论
5
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务