去三亚旅游要多少钱,分布式Redis面试常见问题及知识点概括,咏柳

频道:国际新闻 日期: 浏览:288

1、为什么运用redis

剖析:在项目中运用redis,主要是从两个视点去考虑:功用和并发,这是当时互联网开展过程中首要考虑的两个重难题。当然除掉这两个关键之外,re丧尸小说dis还具有能够做分布式锁等其他功用,可是假如只去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳是为了分布式锁这些其他功用,彻底还有其他中间件(如zookpeer等)替代,并不是非要运用redis。Redis还易于扩展、支撑丰厚的数据类型存储。

(一)功用

如下图所示,咱们在碰到需求履行耗时特别久,且成果不频频改变的SQL,就特别合适将运转成果放入缓存。这样,后边的恳求就去缓存中读取,由于Redis是依据内存等级的缓存,这样使得恳求能够敏捷从缓存中得到呼应。比较传统恳求数据库,刀鱼呼应速度大幅度进步。

题外话:遽然想聊一下这个敏捷呼应的规范。其实依据交互作用的不同,这个呼应时刻没sihu有固定规范。不过从前有人这么告诉我:"在抱负状况下,咱们的页面跳转需求在瞬间处理,关于页内操作则需求在霎时刻处理。别的,超越一弹指的耗时操作要有进展提示,而且能够随时刻断或撤销,这样才能给用户最好的领会。"那么瞬间、片刻、一弹指详细是多少时刻呢?

依据《摩诃僧祗律》记载

一片刻者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预为一顷刻,一日一夜有三十须上海吴丽君事情臾。

那么,经过缜密的核算,一会儿为0.36 秒,一片刻有 0.018 秒.一弹指长达 7.2 秒。

(二)并发

如下图深一点所示,在大并发的状况下,一切的恳求直接拜访数据库,数据库会呈现衔接反常。这个时分,就需求运用redis做一个缓冲操作,而且Redis支撑高功用的主从复制的集群战略,这去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳样大大进步满意高并发拜访及快速呼应。恳求优先拜访到redis恳求数据,然后防止高并发状况下直接拜访数据库。

(三)redis支撑存储数据类型丰厚,以及每种数据类型去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳的运用场景

剖析:是不是觉得这个问题很根底,其实我也这么觉得。可是依据面试经历发现,至少百分八十的人答不上这个问题。主张,在项目中用到后,再类比回忆,领会更深,不要硬记。根本上,一个合格的程序员,五种类型都会用到。

String

这个其实没啥好说的,最惯例的set/get操作,value能够尽是String也能够是数字。一般做一些杂乱的计数功用的缓存。

hash

这儿value寄存的是结构化的目标,比较便利的便是操作其间的某个字段。博主在做单点登录的时分,便是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时刻,能很好的模拟出相似session的作用。

list

运用List的数据结构,能够做简略的音讯行列的功用,例如限时抢购、秒杀等记载产品数量改变。别的还有一个便是,能够运用lrange指令,做依据redis的分页功用,功用极佳,用户领会好。

set

由于set堆积的是一堆不重复值的调集。所以能够做大局去重的功用。为什么不必JVM自带的Set进行去重?因验孕为咱们的体系一般都是集群布置,运用JVM自带的Set,比较费事,莫非为了一个做一个大局去重,复兴一个公共服务,太费事了。

别的,便是运用交集、并集、差集等操作,能够核算一起喜爱,悉数的喜爱,自己独有的喜爱等功用。

sorted set

sorted set多了一个权重参数score,调集中的元素能够按score进行摆放。能够做排行榜运用,取TOP N操作。别的sorted set能够用来做延时使命、规模查找。

2、运用redis有什么缺陷

剖析:咱们用redis这么久,这个问题是有必要要了解的,根本上运用redis都会碰到一些问题,常见的面试也会问这几个。

(一)缓存和数据库双写共同性问题

剖析:共同性问题是分布式常见问题,还能够再分为终究共同性和强共同性。数据库和缓存双写,就必然会存在不共同的问题。答这个问题,先理解一个条件。便是假如对数据有强共同性要求,不虾米音乐网能放缓存。咱们所做的一切,只能确保终究共同性。别的,咱们所做的计划其实从根本上来说,只能说下降不共同发作的概率,无法彻底防止。因而,有强共同性要求的数据,不能放缓存。

首要,采纳正确更新战略,先更新数据库,再删缓存。其次辛辣填sei,由于或许存在删去缓存失利的问题,供给一个补偿办法即可,例如运用音讯行列。

(二)缓存雪崩问题

一般中小型传统软件企业,很难碰到这个问题。假如有大并发的项目,流量有几百万左右。这两个问题一定要深入考虑。

缓存雪崩,即缓存同一时刻大面积的失效,这个时分又来了一波恳求,成果恳求都怼到数据库上,然后导致数据库衔接反常。

处理计划:

① 给缓存的失效时刻,加上一个随机值,防止团体失效去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳。

② 运用互斥锁,可是该计划吞吐量显着下降了。简脂大师

③ 双缓存delete。咱们有两个缓存,缓存A和缓存B。缓存A的失效时刻为20分钟,缓存B不设失效时刻。自己做缓存预热操作。然后细分以下几个小点

  • I 从缓存A读数据库,有则直接回来
  • II A没有数据,直接从B读数据,直接回来,而且异步发动一个更新线程。
  • III 更流离南笙新线程一起更新缓存A和缓存B。

(三)缓存击穿问题

一般中小型传统软件企业,很难碰到这个问题。假如有大并发的项目,流量有几百万左右。这两个问题一定要深入考虑。

缓存穿透,即黑客成心去恳求缓存中不存在的数据,导致一切的恳求都怼到数据库上,然后数据库衔接反常。

处理计划:

① 运用互斥锁私家定制,缓存失效的时分,先去取得锁,得到锁了,再去恳求数据库。没得到锁,则休眠一段时刻重试

② 选用异步更新战略,不管key是否取到值,都直接回来。value值中保护一个缓存失效时刻,缓存假如过期,异步起一个线程去读数据库,更新缓存。需求做缓存预热(项目发动前,先加载缓存)操作。

③ 供给一个能敏捷判别恳求是否有用的阻拦机制,比方,运用布隆过滤器,内部保护一系列合法有用的key。敏捷判别出,恳求所带着的Key是否合法有用。假如不合法,则直接回来。

(四)缓存的并发竞赛问题

剖析:这个问题大致便是,一起有多个子体系去set一个key。这个时分要注意什么呢?咱们思考过么。需求阐明一下,博主提早百度了一下,发现答案根本都是引荐用redis业务机制。博主不引荐运用redis的业务机制。由于咱们的出产环境,根本都是redis集群环境,做了数据分片操作。你一个业务中有涉及到多个key操作的时分,这多个key纷歧定都存储在同一个redis-server上。因而,redis的业务机制,非常鸡肋。

① 假如对这个key操作,不要求次序

这种状况下,预备一个分布式锁,咱们去抢锁,抢到锁就做set操作即可,比较简略。去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳

② 假如对这个key操作,要求次序

假定有一个key1,体系A需求将key1设置为valueA,体系B需求将key1设置为valueB,体系C需求将key1设置为valueC.

期望依照key1的value值依照 valueA-->valueB-->valueC的次序改变。这种时分咱们在数据写入数据库的时分,需求保存一个时刻戳。假守时刻戳如下

  1. 体系A key 1 {valueA 3:00}
  2. 体系B key 1 {valueB 3:05}
  3. 体系C key 1 {valueC 3:10}

那么,假定这会体系B先抢到锁,将key1设置为{valueB 3:05}。接下来体系A抢到锁,发现自己的valueA的时刻戳早于缓存中的时刻戳,那就不做set操作了。以此类推。

其他办法,比方运用行列,将set办法变成串行拜访也能够。总归,灵敏变通。

3、单线程的redis为什么这么快

剖析:这个问题其实是对redis内部机制的一个调查。其实依据博主的面试经历,许多人其实都不知道redis是单线程作业模型。所以,这个问题仍是应该要温习一下的。

(一)纯恒企教育内存操作

(二)单线程操作,防止了频频的上下文切换

(三)选用了非堵塞I/O多路复用机制

题外话:咱们现在要细心的说一说I/O多路复用机制,由于这个说法实在是太浅显了,浅显到一般人都不明白是什么意思。博主打一个比方:小曲在S城开了一家快递店,担任同城快送服务。小曲由于资金约束,雇佣了一批快递员,然后小曲发现资金不够了,只够买一辆车送快递。

经营方式一

客户每送来一份快递,小曲就让一个快递员盯着,然后快递员开车去送快递。渐渐的小曲就发现了这种经营方式存在下述问题

  • 几十个快递员根本上时刻都花在了抢车上了,大部分快递员都处在搁置内濑户实在状况,谁抢到了车,谁就能去送快递
  • 跟着快递的增多,快递员也越来越多,小曲发现快递店里越来越挤,没办法头痛怎样办雇佣新的快递员了
  • 快递员之间的和谐很花时刻

归纳上述缺陷,小曲痛定思痛,提出了下面的经营方式

经营方式二

小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地址标示好,然后顺次放在一个当地。最终,那个快递员顺次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

比照

上述两种经营方式比照,是不是显着觉得第二种,功率更高,更好呢。在上述比方中:

  • 每个快递员------------------>每个线程
  • 每个快递-------------------->每个socket(I/O流)
  • 快递的送达地址-------------->socket的不同状况
  • 客户送快递恳求-------------->来自客户端的恳求
  • 小曲的经营方式-------------->服务端运转的代码
  • 一辆车---------------------->CPU的核数

所以咱们有如下结论

1、经营方式一便是传统的并发模型,每个I/O流(快递)都有一个新的线程(快递员)办理。

2、经营方式二便是I/O多路复用。只要单个线程(一个快递员),经过盯梢每个I/O流的状况(每个快递的送达地址),来办理多个I/O流。

下面类比到实在的redis线程模型,如图所示

参照上图,简略来说,便是。咱们的redis-client在操作的时分,会发生具有不同事情类型的socket。在服务端,有一段I/0多路复用程序,将其置入行列之中。然后,文件事情分配器,顺次去行列中取,转发到不同的事情处理器中。

需求阐明的是,这个I/O多路复用机制,redis还供给了select、epoll、evport、kqueue等多路复用函数库,咱们能够自行去了解。

5、redis的过期战略以及内存筛选机制

剖析:这个问题其实适当重要,究竟redis有没用到家,这个问题就能够看出来。比方你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎样删的,这个问题思考过么?还有,你的数据现已设置去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳了过期时刻,可是时刻到了,内存占用率仍是比较高,有思考过原因么?

redis选用的是守时删去+慵懒删去战略。

为什么不必守时删去战略?

守时删去,用一个守时器来担任监督key,过期则主动删去。尽管内存及时开释,可是非常耗费CPU资源。在大并发恳求下,CPU要将时刻运用在处理恳求,而不是删去key,因而没有选用这一战略.

守时删去+慵懒删去是怎么作业的呢?

守时删去,redis默许每个100ms查看,是否有过期的key,有过期key则删去。需求阐明的是,redis不是每个100ms将一切的key查看一次,而是随机抽取进行查看(假如每隔100ms,悉数key进行查看,redis岂不是卡死)。因而,假如只选用守时删去战略,会导致许多key到时刻没有删去。

所以,慵懒删去派上用场。也便是说在你获取某个key的时分,redis会查看一下,这个key假如设置了过期时刻那么是否过期了?假如过期了此刻就会删去。

选用守时删去+慵懒删去就没其他问题了么?

不是的,假如守时删去没删去key。然后你也没即时去恳求key,也便是说慵懒删去也没收效。这样,redis的内存会越来越高。天天啪啪那么就应该选用内存筛选机制。

在redis.conf中有一行装备

# maxmemory-policy volatile-lru

该装备便是配内存筛选战略的(什么,你没配过?好好检讨一下自己)

1)noeviction:当内存不足以包容新写入数据时,新写入操作会报错。应该没人用吧。

2)allk夜夜纠缠eys-lru:当内存不足以包容新写入数据时,在键空间中,移除最近最少运用的key。引荐运用,现在项目在用这种。

3)allkeys-random:当内存不足以包容新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少运用Key,去随机删。

4)volatile-lru:当内存不足以包容新写入数据时,在设置了过期时刻的键空间中,移除最近最少运用的key。这种状况一般是把redis既当缓存,又做耐久化存储的时分才用。不引荐

5)volatile-random:当内存不足以包容新写入数据时,在设置了过期时刻的键空间中,随机移除道德电影在线某个key。仍然不引荐

6)volatile-ttl:当内存不足以包容新去三亚旅游要多少钱,分布式Redis面试常见问题及知识点归纳,咏柳写入数据时,在设置了过期时刻的键空间中,有更早过期时刻的key优先移除。不引荐

ps:假如没有设置 expire 的key, 不满意先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 战略的行为, 和 noeviction(不删去) 根本上共同。

总结

本文对redis的常见问题做了一个总结。大部分是博主自己在作业中遇到,以及曾经面试他人的时分,爱问的一些问题。别的,不引荐咱们临时抱佛脚,真实碰到一些有经历的工程师,其实几下就能把你问懵。最终,期望咱们有所收成吧。

作者:myworldworld

如有侵权请联络自己删去

热门
最新
推荐
标签