当咱们使用Redis的时候,必需要知道什么?

当咱们在开发过程当中须要用到分布式缓存Redis的时候,咱们首先要明白缓存在系统中用来作什么?html

  1. 少许数据存储,高速读写访问。经过数据所有in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。
  2. 海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。Redis3.0之后开始支持集群,实现了半自动化的数据分片,不过须要smart-client的支持。

华为云分布式缓存Redis,目前已经进入Redis5.0公测阶段,公测阶段注册既能无偿使用,那么咱们在开发过程当中须要用到Redisde 时候,须要明白哪些问题呢?程序员

下面小编给你们一一道来。面试

1、为何使用 Redis?

我以为在项目中使用 Redis,主要是从两个角度去考虑:性能和并发redis

固然,Redis 还具有能够作分布式锁等其余功能,可是若是只是为了分布式锁这些其余功能,彻底还有其余中间件,如 ZooKpeer 等代替,并非非要使用 Redis。所以,这个问题主要从性能和并发两个角度去答。数据库

性能
以下图所示,咱们在碰到须要执行耗时特别久,且结果不频繁变更的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求可以迅速响应。缓存

题外话:突然想聊一下这个迅速响应的标准。根据交互效果的不一样,这个响应时间没有固定标准。
不过曾经有人这么告诉我:"在理想状态下,咱们的页面跳转须要在瞬间解决,对于页内操做则须要在刹那间解决。另外,超过一弹指的耗时操做要有进度提示,而且能够随时停止或取消,这样才能给用户最好的体验。"
那么瞬间、刹那、一弹指具体是多少时间呢?
根据《摩诃僧祗律》记载:
一刹那者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预为一须臾,一日一晚上有三十须臾。
那么,通过周密的计算,一瞬间为 0.36 秒、一刹那有 0.018 秒、一弹指长达 7.2 秒。

并发
以下图所示,在大并发的状况下,全部的请求直接访问数据库,数据库会出现链接异常。
架构

这个时候,就须要使用 Redis 作一个缓冲操做,让请求先访问到 Redis,而不是直接访问数据库。并发

2、使用 Redis 有什么缺点?

你们用 Redis 这么久,这个问题是必需要了解的,基本上使用 Redis 都会碰到一些问题,常见的也就几个。分布式

回答主要是四个问题函数

缓存和数据库双写一致性问题

缓存雪崩问题

缓存击穿问题

缓存的并发竞争问题

这四个问题,我我的以为在项目中是常碰见的。

3、单线程的 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 等多路复用函数库,你们能够自行去了解。

固然以上三点只是皮毛而已,但倒是最基本的,若是想了解更多详细的操做细则,能够去华为云官方论坛与各路大手子交流经验,大咖云集必能学到不少东西。


针对于上面所涉及到的知识点我总结出了有1到5年开发经验的程序员在面试中涉及到的绝大部分架构面试题及答案作成了文档和架构视频资料免费分享给你们(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),但愿能帮助到您面试前的复习且找到一个好的工做,也节省你们在网上搜索资料的时间来学习,也能够关注我一下之后会有更多干货分享。

资料获取方式: QQ群搜索“708-701-457” 便可免费领取

相关文章
相关标签/搜索