凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

凉凉!面试阿里我被Redis技术专题给弄死了~

📚我本以为我可以像是别的博主一样去阿里面试随随便便,因为Redis,我直接被阿里大佬淦翻在地上

在这里插入图片描述

好了不装了 没过没关系 我总结了一些这些最难的知识点!!!!然后自己总结归类再去百度查询了一些 最终得出这份Redis技术专题

题目开淦

Redis集群的主从复制模型是怎样的?

为了是在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群是用了主从复制模型,每个节点都会有N-1个复制品

Redis集群会有写操作丢失吗?为什么?

Redis并不能保证数据强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作

Redis集群之间是如何复制的

异步复制

Redis如何做内存优化

尽可能使用散列表(hashes),散列表(是说列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面,比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户所有信息存储到一张散列表中

Redis回收进程如何工作?

一个Client运行了新的命令,添加了新的数据,Redis会检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收

Redis支持哪几种常用数据类型?

  • String(字符串)
  • List(列表)
  • Set(集合)
  • Sorted Set(有序集合)
  • hash(哈希表)

Redis 与 memcached 相比有哪些优势?(主要是Redis的优势)

  • 1.memcached所有的值均是简单的字符串,redis支持更为丰富的数据类型。
  • 2.redis的速度比memcached快很多,redis的速度比memcached快很多(有争议,考虑到Memache多线程可以充分利用多核,在考虑6.0后的Redis支持多线程,所以存在版本的概念)。
  • 3.redis可以持久化其数据redis可以持久化其数据,数据的可靠性和一致性更高。
  • 4.redis单个key存储的value可以达到1G而Memcache只有1M存储大小。
  • 5.redis对集群情况下的高可用支持的方案很多,所以集群情况下高可用更好。
  • 6.针对于第一条的补充,包含功能场景的丰富化,比如,消息队列、原子操作处 理(Lua脚本以及自增自减的操作)、事务机制和延时队列机制等等功能。
  • 7.采用的网络模型非常好(epoll机制)摈弃给纯内存考虑,并且采用了内部共享内存池机制(可以复用内存,惰性分配),采用单线程机制减少用户态和内核态的切换以及线程之间上下文的切换。

Redis 集群方案应该怎么做?都有哪些方案?

  • codis目前用的最多的集群方案,属于一个基于服务端操作的负载均衡机制属于代理后端服务实例的机制,可以支持1024的集群节点,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash(CRC32算法)节点。//加入Java开发交流君样:756584822一起吹水聊天
  • twemproxy ,基本和codis一致的效果,但是对于节点变化的情况处理不是很好,所以性能方面来讲依赖于twemproxy的节点的吞吐能力。
  • redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性hash,而是 hash槽(slot)的概念,以及自身支持节点设置从节点,并且节点之间都有引用链接关系帮助定位hash槽的数据,支持节点达到16384个节点。

(Redis)什么是缓存击穿?如何避免?

高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。

📚如何避免?

  • 1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
  • 2:做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期,牺牲一致性,提高可用性
  • 3:设置热点数据永远不过期(不推荐哦)。

Redis如何实现高可用呢?

Redis实现高可用主要有三种方式:主从复制、哨兵模式,以及 Redis 集群。

📚主从复制

将从前的一台 Redis 服务器,同步数据到多台从 Redis 服务器上,即一主多从的模式,这个跟MySQL主从复制的原理一样。

📚主从复制哨兵模式
在这里插入图片描述
使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式(因为哨兵模式做到了可以监控主从服务器,并且提供自动容灾恢复的功能)。

📚Redis Cluster(集群)在这里插入图片描述
Redis Cluster 是一种分布式去中心化的运行模式,是在 Redis 3.0 版本中推出的 Redis 集群方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。

使用哨兵模式在数据上有副本数据做保证,在可用性上又有哨兵监控,一旦master宕机会选举slave节点为master节点,这种已经满足了我们的生产环境需要,那为什么还需要使用集群模式呢?

哨兵模式归根节点还是主从模式,在主从模式下我们可以通过增加slave节点来扩展读并发能力,但是没办法扩展写能力和存储能力,存储能力只能是master节点能够承载的上限。所以为了扩展写能力和存储能力,我们就需要引入集群模式。

在这里插入图片描述

Redis为何那么快???

Redis的快速很多人都知道是因为基于内存,但这只是一方面,其实redis在底层是一套很完善的多路复用事件处理机制来保证执行的高效的

线程模型
redis内部使用文件事件处理器file event handler,它包含如下几个部分

  • 多个socket
  • IO多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)

之所以说redis是单线程其实是指这个文件事件处理器是单线程的,它采用多路复用的方式监听系统上多个socket,将socket上产生的事件压入队列中,由文件事件分派器从队列中取出一个socket根据事件类型发给相应的事件处理器
整个处理过程如图:

处理过程可以分为以下几个步骤:

  • 客户端向redis发起一个socket请求,向redis的server socket请求连接,这里命名为socket01
  • server socket产生一个AE_READABLE事件,IO多路复用程序监听到事件后将这个socket01压入队列
  • 文件事件分派器从队列中取出socket01,交给连接应答处理器
  • 连接应答处理器会将socket01的AE_READABLE事件与命令请求处理器相关联
  • 假设客户端执行set操作,这时命令请求处理器会从socket01读取key value,在内存中完成key value的设置
  • 在内存中完成设置后,会将socket01的AE_WRITEABLE事件与命令回复处理器相关联,然后压入队列中
  • 事件分派器拿到socket01后,交给命令回复处理器,由命令回复处理器向socket01写入本次操作的结果,比如OK,之后解除关联

以上就是一个命令在redis中执行的过程

总结一下效率高的原因

  • 内存操作
  • IO多路复用机制,减少了阻塞
  • 单线程避免了线程切换的开销和竞争问题
  • 最最根本的redis是用C语言写的,本来就直接跟操作系统交互,命令执行快得飞起

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

与众不同 制作会唱歌的WinRAR - imsoft.cnblogs

为了使用方便,我们可能会把RAR压缩包制作成自解压文件。WinRAR自带的自解压模块虽然使用很方便,但千篇一律的外观看起来实在 乏味。其实,只要通过简单改造,你就可以制作出与众不同,声色俱佳的WinRAR自解压界面&#xf…

看到这一幕,我甚至都想戒烟了。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源网络,侵权删)

做个中国清官网,有人感兴趣吗

关于官员或者放宽到公务员群体的廉洁问题,从来都是公众关注的热点和焦点,如果能够运用网络的力量,荐贤戒腐,也是一个很有意义的事情。所以,有了这样一个想法,想做一个中国清官网(暂定名&#xf…

为什么 Linux 上的 Asp.NET 5 需要 Kestrel ?

咨询区 Freeman Helmuth:当我在 Linux 上部署 ASP.NET 5 时,我试着了解整个 Web应用程序框架,所有的文档我都看过,包括这篇 http://docs.asp.net/en/latest/conceptual-overview/aspnet.html#servers 都没有找到我想要的答案。为…

针对Spring的Spring Retry 我发现了这样一个大家都不知道的技巧!

外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测&…

c#3.0关于JSON简单操作的实用帮助类(泛型实现)

关于json的操作,网上一搜一大把。避免重复造轮子,整理发布一个笔者在项目开发中经常用到的一个json实用帮助类,泛型实现,非常方便。不废话了,贴代码:1、json操作的帮助类: Codeusing System;usi…

谁还没个黑历史了。。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源网络,侵权删)

ios开发-第二天

1.#import可保证无论头文件出现多少次,只包含一次,而#include相反。 2.如果用户不提供文件路径的话,那么argc的值为1,可以用来做是否错误的判断。 3.面向对象和面向过程的区别 面向过程是分析出解决问题的步骤&#xf…

ASP.NET创建文件并写入内容

本文从最基本的操作开始,解释在ASP.NET中文件处理的概念,包括如从一个文件中读取内容、如何向一个文件中写入内容和如何删除一个文件。   前面已经提到,要想在ASP.NET 页面中进行文件处理,必须要有"System.IO"名称空间…

C# 虚方法与抽象方法区别

虚方法是必须要实现的,只有接口或者抽象方法才没有实现体,什么是实现体,就是方法的那对大括号:下面举例:public abstract void Fn1();//定义一个抽象方法 public vitrual void Fn2(){ };//定义一个虚方法(那对大括号必…

京东面试官:呦,你对中间件 Mycat了解的还挺深~

1.数据切分概念 数据的切分[(Sharding)]根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机))之上,这种切可以称之为数据的垂直…

Redis与Memcached的区别

2019独角兽企业重金招聘Python工程师标准>>> 传统MySQL Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量…

“高仿版拼多多”宣告破产!曾一年收割1.3亿用户,如今自救失败负债16亿

全世界只有3.14 % 的人关注了青少年数学之旅又一家改变世界的互联网公司跑路了啊?挣扎数月的淘集集最终也回天乏术了。淘集集并购重组最终失败,供应商何时能拿到被拖欠的货款仍然遥遥无期。这家主打比“拼多多”更下沉市场的社交电商,平台上线…

处在哪个阶段?

在职业生涯中,可以划分出多个阶段,但是如下3个阶段也许是最粗糙和实在的: 1、入门级,在别人的领导下可以完成工作。 2、成熟级,可以独立完成工作。 3、精英级,可以领到别人完成工作。 你处在哪个阶段&#…

.net知识和学习方法系列(十四)TraceListener的应用

在前一往上一往篇文章中,我们用到一个TextWriterTraceListener,它是为监视跟踪和调试输出的侦听器,对于跟踪调试的监听器还有两个,分别是:DefaultTraceListener和EventLogTraceListener,这三个跟踪调试侦听…

在VS Code中直接调试Web程序,是怎样一种体验?

前言要在VS Code中启动Chrome或Microsoft Edge中调试任何Web程序,您只需按F5或选择菜单"运行"->"启动调试"来启动会话。你可以选择在Chrome、Edge或Node.js中进行调试。Edge DevTools如果选择了Edge进行调试,你会发现调试工具条上…

[转]Multiple outputs from T4 made easy

本文转自:http://damieng.com/blog/2009/01/22/multiple-outputs-from-t4-made-easy One of the things I wanted my LINQ to SQL T4 templates to do was be able to split the output into a file-per-entity. Existing solutions used either a separate set of …

二叉树的深度优先和广度优先遍历

http://steven-hong.javaeye.com/blog/493665图的深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再 从vi出发选择一个与vi相邻且未…

面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~

线程池大家都## 标题很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任务)队列,最大线程数&am…

《硝烟中的Scrum和XP》书摘(1)

Nokia的Scrum标准:迭代要有固定的时长(TimeBox),不能超过六个星期。每一次迭代的结尾,代码必须经过QA的测试。Scrum团队必须有产品负责人,而且团队都清楚这个人是谁。产品负责人必须有产品的Backlog&#x…