范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

我想进大厂之Redis夺命连环11问

  这是面试题系列第三篇--redis专题。 说说Redis基本数据类型有哪些吧字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息,而SDS则保存了长度信息,这样将获取字符串长度的时间由O(N)降低到了O(1),同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。链表linkedlist:redis链表是一个双向无环链表结构,很多发布订阅、慢查询、监视器功能都是使用到了链表来实现,每个链表的节点由一个listNode结构来表示,每个节点都有指向前置节点和后置节点的指针,同时表头节点的前置和后置节点都指向NULL。字典hashtable:用于保存键值对的抽象数据结构。redis使用hash表作为底层实现,每个字典带有两个hash表,供平时使用和rehash时使用,hash表使用链地址法来解决键冲突,被分配到同一个索引位置的多个键值对会形成一个单向链表,在对hash表进行扩容或者缩容的时候,为了服务的可用性,rehash的过程不是一次性完成的,而是渐进式的。跳跃表skiplist:跳跃表是有序集合的底层实现之一,redis中在实现有序集合键和集群节点的内部结构中都是用到了跳跃表。redis跳跃表由zskiplist和zskiplistNode组成,zskiplist用于保存跳跃表信息(表头、表尾节点、长度等),zskiplistNode用于表示表跳跃节点,每个跳跃表的层高都是1-32的随机数,在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的成员对象必须是唯一的,节点按照分值大小排序,如果分值相同,则按照成员对象的大小排序。整数集合intset:用于保存整数值的集合抽象数据结构,不会出现重复元素,底层实现为数组。压缩列表ziplist:压缩列表是为节约内存而开发的顺序性数据结构,他可以包含多个节点,每个节点可以保存一个字节数组或者整数值。
  基于这些基础的数据结构,redis封装了自己的对象系统,包含字符串对象string、列表对象list、哈希对象hash、集合对象set、有序集合对象zset,每种对象都用到了至少一种基础的数据结构。
  redis通过encoding属性设置对象的编码形式来提升灵活性和效率,基于不同的场景redis会自动做出优化。不同对象的编码如下: 字符串对象string:int整数、embstr编码的简单动态字符串、raw简单动态字符串列表对象list:ziplist、linkedlist哈希对象hash:ziplist、hashtable集合对象set:intset、hashtable有序集合对象zset:ziplist、skiplistRedis为什么快呢?
  redis的速度非常的快,单机的redis就可以支撑每秒10几万的并发,相对于mysql来说,性能是mysql的几十倍。速度快的原因主要有几点: 完全基于内存操作C语言实现,优化过的数据结构,基于几种基础的数据结构,redis做了大量的优化,性能极高使用单线程,无上下文的切换成本基于非阻塞的IO多路复用机制那为什么Redis6.0之后又改用多线程呢?
  redis使用多线程并非是完全摒弃单线程,redis还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程。
  这样做的目的是因为redis的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高redis的性能。 知道什么是热key吗?热key问题怎么解决?
  所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机引发雪崩。
  针对热key的解决方案: 提前把热key打散到不同的服务器,降低压力加入二级缓存,提前加载热key数据到内存中,如果redis宕机,走内存查询什么是缓存击穿、缓存穿透、缓存雪崩?缓存击穿
  缓存击穿的概念就是单个key并发访问过高,过期时导致所有请求直接打到db上,这个和热key的问题比较类似,只是说的点在于过期导致请求全部打到DB上而已。
  解决方案: 加锁更新,比如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户,这样后面的请求就可以从缓存中拿到数据了。将过期时间组合写在value中,通过异步的方式不断的刷新过期时间,防止此类现象。
  https://tva 缓存穿透
  缓存穿透是指查询不存在缓存中的数据,每次请求都会打到DB,就像缓存不存在一样。
  针对这个问题,加一层布隆过滤器。布隆过滤器的原理是在你存入数据的时候,会通过散列函数将它映射为一个位数组中的K个点,同时把他们置为1。
  这样当用户再次来查询A,而A在布隆过滤器值为0,直接返回,就不会产生击穿请求打到DB了。
  显然,使用布隆过滤器之后会有一个问题就是误判,因为它本身是一个数组,可能会有多个值落到同一个位置,那么理论上来说只要我们的数组长度够长,误判的概率就会越低,这种问题就根据实际情况来就好了。
  缓存雪崩
  当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上,这样可能导致整个系统的崩溃,称为雪崩。雪崩和击穿、热key的问题不太一样的是,他是指大规模的缓存都过期失效了。
  针对雪崩几个解决方案: 针对不同key设置不同的过期时间,避免同时过期限流,如果redis宕机,可以限流,避免同时刻大量请求打崩DB二级缓存,同热key的方案。Redis的过期策略有哪些?
  redis主要有2种过期删除策略 惰性删除
  惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有一个缺点就是如果这些过期的key没有被访问,那么他就一直无法被删除,而且一直占用内存。
  定期删除
  定期删除指的是redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所以redis会每次随机取一些key去做检查和删除。 那么定期+惰性都没有删除过期的key怎么办?
  假设redis每次定期随机查询key的时候没有删掉,这些key也没有做查询的话,就会导致这些key一直保存在redis里面无法被删除,这时候就会走到redis的内存淘汰机制。 volatile-lru:从已设置过期时间的key中,移出最近最少使用的key进行淘汰volatile-ttl:从已设置过期时间的key中,移出将要过期的keyvolatile-random:从已设置过期时间的key中随机选择key淘汰allkeys-lru:从key中选择最近最少使用的进行淘汰allkeys-random:从key中随机选择key进行淘汰noeviction:当内存达到阈值的时候,新写入操作报错持久化方式有哪些?有什么区别?
  redis持久化方案分为RDB和AOF两种。 RDB
  RDB持久化可以手动执行也可以根据配置定期执行,它的作用是将某个时间点上的数据库状态保存到RDB文件中,RDB文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于RDB文件是保存在硬盘上的,所以即使redis崩溃或者退出,只要RDB文件存在,就可以用它来恢复还原数据库的状态。
  可以通过SAVE或者BGSAVE来生成RDB文件。
  SAVE命令会阻塞redis进程,直到RDB文件生成完毕,在进程阻塞期间,redis不能处理任何命令请求,这显然是不合适的。
  BGSAVE则是会fork出一个子进程,然后由子进程去负责生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。 AOF
  AOF和RDB不同,AOF是通过保存redis服务器所执行的写命令来记录数据库状态的。
  AOF通过追加、写入、同步三个步骤来实现持久化机制。 当AOF持久化处于激活状态,服务器执行完写命令之后,写命令将会被追加append到aof_buf缓冲区的末尾在服务器每结束一个事件循环之前,将会调用flushAppendOnlyFile函数决定是否要将aof_buf的内容保存到AOF文件中,可以通过配置appendfsync来决定。always ##aof_buf内容写入并同步到AOF文件 everysec ##将aof_buf中内容写入到AOF文件,如果上次同步AOF文件时间距离现在超过1秒,则再次对AOF文件进行同步 no ##将aof_buf内容写入AOF文件,但是并不对AOF文件进行同步,同步时间由操作系统决定
  如果不设置,默认选项将会是everysec,因为always来说虽然最安全(只会丢失一次事件循环的写命令),但是性能较差,而everysec模式只不过会可能丢失1秒钟的数据,而no模式的效率和everysec相仿,但是会丢失上次同步AOF文件之后的所有写命令数据。 怎么实现Redis的高可用?
  要想实现高可用,一台机器肯定是不够的,而redis要保证高可用,有2个可选方案。 主从架构
  主从模式是最简单的实现高可用的方案,核心就是主从同步。主从同步的原理如下: slave发送sync命令到mastermaster收到sync之后,执行bgsave,生成RDB全量文件master把slave的写命令记录到缓存bgsave执行完毕之后,发送RDB文件到slave,slave执行master发送缓存中的写命令到slave,slave执行
  这里我写的这个命令是sync,但是在redis2.8版本之后已经使用psync来替代sync了,原因是sync命令非常消耗系统资源,而psync的效率更高。 哨兵
  基于主从方案的缺点还是很明显的,假设master宕机,那么就不能写入数据,那么slave也就失去了作用,整个架构就不可用了,除非你手动切换,主要原因就是因为没有自动故障转移机制。而哨兵(sentinel)的功能比单纯的主从架构全面的多了,它具备自动故障转移、集群监控、消息通知等功能。
  哨兵可以同时监视多个主从服务器,并且在被监视的master下线时,自动将某个slave提升为master,然后由新的master继续接收命令。整个过程如下: 初始化sentinel,将普通的redis代码替换成sentinel专用代码初始化masters字典和服务器信息,服务器信息主要保存ip:port,并记录实例的地址和ID创建和master的两个连接,命令连接和订阅连接,并且订阅sentinel:hello频道每隔10秒向master发送info命令,获取master和它下面所有slave的当前信息当发现master有新的slave之后,sentinel和新的slave同样建立两个连接,同时每个10秒发送info命令,更新master信息sentinel每隔1秒向所有服务器发送ping命令,如果某台服务器在配置的响应时间内连续返回无效回复,将会被标记为下线状态选举出领头sentinel,领头sentinel需要半数以上的sentinel同意领头sentinel从已下线的的master所有slave中挑选一个,将其转换为master让所有的slave改为从新的master复制数据将原来的master设置为新的master的从服务器,当原来master重新回复连接时,就变成了新master的从服务器
  sentinel会每隔1秒向所有实例(包括主从服务器和其他sentinel)发送ping命令,并且根据回复判断是否已经下线,这种方式叫做主观下线。当判断为主观下线时,就会向其他监视的sentinel询问,如果超过半数的投票认为已经是下线状态,则会标记为客观下线状态,同时触发故障转移。 能说说redis集群的原理吗?
  如果说依靠哨兵可以实现redis的高可用,如果还想在支持高并发同时容纳海量的数据,那就需要redis集群。redis集群是redis提供的分布式数据存储方案,集群通过数据分片sharding来进行数据的共享,同时提供复制和故障转移的功能。 节点
  一个redis集群由多个节点node组成,而多个node之间通过cluster meet命令来进行连接,节点的握手过程: 节点A收到客户端的cluster meet命令A根据收到的IP地址和端口号,向B发送一条meet消息节点B收到meet消息返回pongA知道B收到了meet消息,返回一条ping消息,握手成功最后,节点A将会通过gossip协议把节点B的信息传播给集群中的其他节点,其他节点也将和B进行握手
  槽slot
  redis通过集群分片的形式来保存数据,整个集群数据库被分为16384个slot,集群中的每个节点可以处理0-16384个slot,当数据库16384个slot都有节点在处理时,集群处于上线状态,反之只要有一个slot没有得到处理都会处理下线状态。通过cluster addslots命令可以将slot指派给对应节点处理。
  slot是一个位数组,数组的长度是16384/8=2048,而数组的每一位用1表示被节点处理,0表示不处理,如图所示的话表示A节点处理0-7的slot。
  当客户端向节点发送命令,如果刚好找到slot属于当前节点,那么节点就执行命令,反之,则会返回一个MOVED命令到客户端指引客户端转向正确的节点。(MOVED过程是自动的)
  如果增加或者移出节点,对于slot的重新分配也是非常方便的,redis提供了工具帮助实现slot的迁移,整个过程是完全在线的,不需要停止服务。 故障转移
  如果节点A向节点B发送ping消息,节点B没有在规定的时间内响应pong,那么节点A会标记节点B为pfail疑似下线状态,同时把B的状态通过消息的形式发送给其他节点,如果超过半数以上的节点都标记B为pfail状态,B就会被标记为fail下线状态,此时将会发生故障转移,优先从复制数据较多的从节点选择一个成为主节点,并且接管下线节点的slot,整个过程和哨兵非常类似,都是基于Raft协议做选举。 了解Redis事务机制吗?
  redis通过MULTI、EXEC、WATCH等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,并且在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。事务的执行过程如下: 服务端收到客户端请求,事务以MULTI开始如果客户端正处于事务状态,则会把事务放入队列同时返回给客户端QUEUED,反之则直接执行这个命令当收到客户端EXEC命令时,WATCH命令监视整个事务中的key是否有被修改,如果有则返回空回复到客户端表示失败,否则redis会遍历整个事务队列,执行队列中保存的所有命令,最后返回结果给客户端
  WATCH的机制本身是一个CAS的机制,被监视的key会被保存到一个链表中,如果某个key被修改,那么REDIS_DIRTY_CAS标志将会被打开,这时服务器会拒绝执行事务。
  - END -

肖战解锁全新身份?以星火传承人探访革命前辈,新歌曲备受关注今年是非常特殊的一年,不仅是建党百周年的生日,更是无数华夏儿女以青春护盛世之中华的体现。在这特殊的一年,也会有更多歌颂爱国题材的影视作品呈现给观众朋友,其中不乏一些军旅题材的作品,又一档综艺黑马来袭,零差评惹笑观众,却没有一位顶流加入提起辽宁民间艺术团相信大家都不会陌生,并且能立马想到宋小宝文松杨树林以及宋晓峰等多名喜剧人。在很多的公开舞台上,我们都看过上述几人的精彩表演,总能带来无限欢乐。近几日,由辽宁民间艺周杰伦音乐独家版权有望尽快解除,铁打的顶流,一代人的青春日前,腾讯控股有限公司被相关部门责令解除网络音乐独家版权,并给出了最新时限三十天,这也意味着,最快只需要一个月的时间就可以在更多的APP上听到周杰伦的歌曲。不得不说是,如果周杰伦音肖战确定加盟音乐类综艺?网传将与顶级天后合作,新组合亮相近段时间关于肖战的好消息接连不断,除了影视作品已经定档即将播出之外,2021年的首部古装剧玉骨遥也顺利杀青。但很遗憾的是,因为受到疫情的影响,话剧如梦之梦的演出不得不暂时搁置,那这肖战新节目惊喜上线,综艺状态满分最近几天时间来,与肖战合作的多个知名品牌再次开启了各种形式的梦幻联动,除了在线上推出非常精彩的大片之外,也在线下承包了多处地广,比如刚刚官宣的新代言梦洁家纺,可谓是给足了肖战排面,新仙剑奇侠传开拍,黄杨钿甜版赵灵儿,年纪符合造型却拉胯新仙剑奇侠传开拍,黄杨钿甜版赵灵儿,年纪符合造型却拉胯仙剑奇侠传可是仙侠剧的巅峰时刻,很多人都对这部片非常熟悉,因为太好看了,所以三刷,甚至很多人四刷,也就是看了一遍还想看,看完还僵尸先生成经典,物是人非,剧中主演再也聚不齐僵尸先生成经典,物是人非,剧中主演再也聚不齐大家还记得曾经的僵尸片吗,真的是经典,无论年纪多大,相信大家都对僵尸先生有所耳闻。林正英先生的离世,让大家感叹时光流逝,物是人非,但曾经星汉灿烂路透照曝光,赵思露造型惊喜,吴磊扮相帅气星汉灿烂路透照曝光,赵思露造型惊喜,吴磊扮相帅气最近这段时间好剧不断,让追究党们痛苦并欢乐着。不过除了已经开播的还有定档的剧之外,还有很多正在拍摄中的作品让大家比较关注,比如龚俊和港星李婉华近照,53岁美貌依旧,嫁给富商后安心当阔太港星李婉华近照,53岁美貌依旧,嫁给富商后安心当阔太说起上世纪90年代的TVB女星们,除了每位都各有特色之外,另一点被大家称道的就是演技和无美颜无滤镜了。在那个年代里走出来的每一位嘻哈圈又一歌手出轨,亲口承认欺骗女友,名气太低塌房都无人伤亡嘻哈圈又一歌手出轨,亲口承认欺骗女友,名气太低塌房都无人伤亡对于娱乐圈里艺人出轨这种事,很多人都见怪不怪,但是为了名气和形象也都会披上遮羞布装傻,吃瓜群众们也就看个热闹,事情过去了李莎旻子与隔壁老樊官宣恋情,本是好事,为何都说女方恋爱脑?李莎旻子与隔壁老樊官宣恋情,本是好事,为何都说女方恋爱脑?随着女儿们的恋爱开播,有好几对情侣官宣了,其中李莎旻子和隔壁老樊的恋情,得到了不少人的祝福。不过在一片祝福声中,也有许多不
鞠婧祎穿露肩上衣现身疑似回应垫肩质疑,大方露出直角肩好迷人哈喽,大家好呀!鞠婧祎自从出道以来一直备受热议,因为她从出道以来整个人的颜值变化很大,而且也因四千年美女遭到不少网友的吐槽与谩骂。鞠婧祎这几年的颜值确实变化很大,颜值从一个平平无奇鞠婧祎身着白色亮片礼服,搭配珍珠发饰现身红毯,仙气飘飘似公主哈喽,大家好!鞠婧祎每次一发美照,都有人对她的身材和样貌议论,有夸赞也有人质疑。特别是近两年,我们能感觉到她颜值提升得很快,现在看她的半身图,精致到几乎找不到毛病。她这样近乎完美的张子枫欧阳娜娜田园写真,同穿印花衬衫似姐妹,青春少女好养眼哈喽,大家好呀!看到青春年少朝气蓬勃的少年和少女,总是让人忍不住感叹呀!前不久张子枫和欧阳娜娜同框的田园写真真的太唯美和养眼了,两个高颜值各有才华的少女在一起,鲜花与少女的田园画面乔欣最新街拍曝光,职场穿搭优雅知性,见证职场关关的气质蜕变哈喽,大家好呀!职场穿搭一直都是广大女性关注的时尚话题之一,因为好看显气质的职场穿搭能让人看起来更优雅显气质。身在职场里的女生都渴望能够有一个优雅知性的形象,好的形象不仅能够提升气不一样的佟丽娅!舞者训练私服,简约搭配又美又认真的佟领队哈喽,大家好!说起娱乐圈中里有名的新疆美女,那么佟丽娅必须占一个位置。很多人都非常吃丫丫的颜,其实最近这些年,丫丫无论是电视剧里的造型,还是在各种活动晚会上的造型,大都是走成熟气质王鸥的现任男朋友是谁?和张戈为什么分手?内情王鸥新剧芝麻胡同被骂演技差,在此之前王鸥还怒怼网友劝其改名上了热搜,不明就里地王鸥和杨幂刘恺威三人之间的恩怨纠葛太精彩,好一出搭戏哟,但是你更想不到王鸥的前任男朋友竟然是演员张戈,网曝周星驰已结婚这是真的吗?他最爱的女人是谁?哈喽大家好,我是饿了饿了。之前有网友爆料周星驰已结婚,这是真的吗?当然不是真的,连周星驰自己都回应,这是子虚乌有的事情。虽然连周星驰自己的否认了这个传闻是假的,但还是有很多网友不停46岁南京不老仙妈宛如少女与16岁儿子王纪庭拍照像情侣46岁南京不老仙妈与16岁儿子王纪庭拍照像情侣,不过眼尖的网友们还是发现了这位不老仙妈的手指有些粗糙,眼睛周围还有些细小的眼袋,这些都是岁月这把杀猪刀留下的痕迹,是她真实年龄的反映张献忠为何疯狂屠杀四川人?天府之国四川是人类生养繁衍的天生福地,也是历代割据政权的安乐窝,入主中原的根据地。很不幸,当历史的车轮进入17世纪中叶的时候,她被一个乱世枭雄盯上了,这个人就是张献忠张献忠入四川,民国第一美女是谁?她的一生充满了悲剧阮玲玉是民国四大美女之一,蝴蝶是民国第一次选美大赛的冠军。两个女人都是大上海受人喜爱与追捧的女子。当时社会不免拿阮玲玉蝴蝶两个人做比较,这两人最直接的比拼就是在民国时期由陈蝶衣发起彦希现任女友是谁网传与黄婷婷关系匪浅揭两人真实关系彦希自从拍了一部电视剧播出之后,和黄婷婷两人就成为了大家关注的对象。剧中两人饰演的是情侣关系,但是有网友说他们在现实生活中也在一起。彦希之前很少有绯闻传出,和黄婷婷合作电视剧和综艺