-
单线程的 Redis 为什么这么快
-
Redis 的数据类型,以及每种数据类型的使用场景
-
Redis 的过期策略以及内存淘汰机制
-
Redis 和数据库双写一致性问题
-
如何应对缓存穿透和缓存雪崩问题
-
如何解决 Redis 的并发竞争 Key 问题
为什么使用 Redis
我觉得在项目中使用 Redis,主要是从两个角度去考虑:性能和并发。
当然,Redis 还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件,如 ZooKpeer 等代替,并不是非要使用 Redis。因此,这个问题主要从性能和并发两个角度去答。
性能
如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
题外话:忽然想聊一下这个迅速响应的标准。根据交互效果的不同,这个响应时间没有固定标准。
不过曾经有人这么告诉我:"在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。
另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这样才能给用户最好的体验。"
那么瞬间、刹那、一弹指具体是多少时间呢?
根据《摩诃僧祗律》记载:
一刹那者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预为一须臾,一日一夜有三十须臾。
那么,经过周密的计算,一瞬间为 0.36 秒、一刹那有 0.018 秒、一弹指长达 7.2 秒。
并发
如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。
这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。
使用 Redis 有什么缺点
大家用 Redis 这么久,这个问题是必须要了解的,基本上使用 Redis 都会碰到一些问题,常见的也就几个。
回答主要是四个问题:
-
缓存和数据库双写一致性问题
-
缓存雪崩问题
-
缓存击穿问题
-
缓存的并发竞争问题
这四个问题,我个人觉得在项目中是常遇见的,具体解决方案,后文给出。
单线程的 Redis 为什么这么快
这个问题是对 Redis 内部机制的一个考察。根据我的面试经验,很多人都不知道Redis 是单线程工作模型。所以,这个问题还是应该要复习一下的。
回答主要是以下三点:
-
纯内存操作
-
单线程操作,避免了频繁的上下文切换
-
采用了非阻塞 I/O 多路复用机制
题外话:我们现在要仔细的说一说 I/O 多路复用机制,因为这个说法实在是太通俗了,通俗到一般人都不懂是什么意思。
打一个比方:小曲在 S 城开了一家快递店,负责同城快送服务。小曲因为资金限制,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。
经营方式一
客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。
慢慢的小曲就发现了这种经营方式存在下述问题:
-
几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递。
-
随着快递的增多,快递员也越来越多,小曲发现快递店里越来越挤,没办法雇佣新的快递员了。
-
快递员之间的协调很花时间。
综合上述缺点,小曲痛定思痛,提出了下面的经营方式。
经营方式二
小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。
最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。
上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢?
在上述比喻中:
-
每个快递员→每个线程
-
每个快递→每个 Socket(I/O 流)
-
快递的送达地点→Socket 的不同状态
-
客户送快递请求→来自客户端的请求
-
小曲的经营方式→服务端运行的代码
-
一辆车→CPU 的核数
于是我们有如下结论:
-
经营方式一就是传统的并发模型,每个 I/O 流(快递)都有一个新的线程(快递员)管理。
-
经营方式二就是 I/O 多路复用。只有单个线程(一个快递员),通过跟踪每个 I/O 流的状态(每个快递的送达地点),来管理多个 I/O 流。
下面类比到真实的 Redis 线程模型,如图所示:
简单来说,就是我们的 redis-client 在操作的时候,会产生具有不同事件类型的 Socket。
在服务端,有一段 I/O 多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
需要说明的是,这个 I/O 多路复用机制,Redis 还提供了 select、epoll、evport、kqueue 等多路复用函数库,大家可以自行去了解。
Redis 的数据类型,以及每种数据类型的使用场景
是不是觉得这个问题很基础?我也这么觉得。然而根据面试经验发现,至少百分之八十的人答不上这个问题。
建议,在项目中用到后,再类比记忆,体会更深,不要硬记。基本上,一个合格的程序员,五种类型都会用到。
String
这个没啥好说的,最常规的 set/get 操作,Value 可以是 String 也可以是数字。一般做一些复杂的计数功能的缓存。
Hash
这里 Value 存放的是结构化的对象,比较方便的就是操作其中的某个字段。
我在做单点登录的时候,就是用这种数据结构存储用户信息,以 CookieId 作为 Key,设置 30 分钟为缓存过期时间,能很好的模拟出类似 Session 的效果。
List
使用 List 的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用 lrange 命令,做基于 Redis 的分页功能,性能极佳,用户体验好。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
Netty面试专题*
[外链图片转存中…(img-nWF1ZfCp-1711603262263)]
RabbitMQ面试专题
[外链图片转存中…(img-VuW0ctFx-1711603262264)]
Redis面试专题
[外链图片转存中…(img-5UveGIiO-1711603262264)]
Spring Cloud面试专题
[外链图片转存中…(img-M6VPKhIY-1711603262265)]
SpringBoot面试专题
[外链图片转存中…(img-6hFCF2bG-1711603262265)]
zookeeper面试专题
[外链图片转存中…(img-KcYycLjA-1711603262266)]
常见面试算法题汇总专题
[外链图片转存中…(img-14f4JBx3-1711603262266)]
计算机网络基础专题
[外链图片转存中…(img-55AhWiUE-1711603262267)]
设计模式专题
[外链图片转存中…(img-ZslJekzb-1711603262267)]