【162期】一些Redis面试题及分布式集群面试考点整理

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 【162期】一些Redis面试题及分布式集群面试考点整理

点击上方“Java面试题精选”,关注公众号

面试刷图,查缺补漏

号外:往期面试题,10篇为一个单位归置到本公众号菜单栏-面试题,有需要的欢迎翻阅

阶段汇总集合:

1. 使用Redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

3. MySQL里有1000w数据,redis中只存10w的数据,如何保证redis中的数据都是热点数据

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

  • voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据
  • 4. Memcache与Redis的区别都有哪些?

    1)、存储方式

    Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

    Redis有部份存在硬盘上,这样能保证数据的持久性。

    2)、数据支持类型

    Memcache对数据类型支持相对简单。

    Redis有复杂的数据类型。

    3)、使用底层模型不同

    它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

    Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

    4)、value大小

    redis最大可以达到1GB,而memcache只有1MB

    5. Redis的各项功能解决了哪些问题?

    参考:

    6. redis 两种持久化的优缺点

    7. redis 线上连接超时处理思路

    7. 如何对Redis内存进行优化

    高可用分布式集群

    一,什么是分布式

    要理解分布式系统,主要需要明白一下2个方面:

  • 分布式系统一定是由多个节点组成的系统。
  • 其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。

  • 这些连通的节点上部署了我们的节点,并且相互的操作会有协同。
  • 分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已。而实际上这些服务是通过背后的众多服务器组成的一个分布式系统。因此分布式系统看起来像是一个超级计算机一样。

    例如淘宝,平时大家都会使用,它本身就是一个分布式系统。我们通过浏览器访问淘宝网站时,这个请求的背后就是一个庞大的分布式系统在为我们提供服务,整个系统中有的负责请求处理,有的负责存储,有的负责计算,最终他们相互协调把最后的结果返回并呈现给用户。

    使用分布式系统主要有特点:

    1、增大系统容量。我们的业务量越来越大,而要能应对越来越大的业务量,一台机器的性能已经无法满足了,我们需要多台机器才能应对大规模的应用场景。所以,我们需要垂直或是水平拆分业务系统,让其变成一个分布式的架构。

    2、加强系统可用。我们的业务越来越关键,需要提高整个系统架构的可用性,这就意味着架构中不能存在单点故障。这样,整个系统不会因为一台机器出故障而导致整体不可用。所以,需要通过分布式架构来冗余系统以消除单点故障,从而提高系统的可用性。

    3、因为模块化,所以系统模块重用度更高。

    4、因为软件服务模块被拆分,开发和发布速度可以并行而变得更快。

    5、系统扩展性更高。

    6、团队协作流程也会得到改善。

    分布式系统的类型有三种:

    1、分布式处理,但只有一个总数据库,没有局部数据库。

    2、分层式处理,每一层都有自己的数据库。

    3、充分分散的分布式网络,没有中央控制部分,各节点之间的联系方式又可以有多种,如松散的联接,紧密的联接,动态的联接,广播通知式的联接等。

    二,高可用

    高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响。停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。

    (1)解决单点问题主要有2种方式:

    主备方式

    这种通常是一台主机、一台或多台备机,在正常情况下主机对外提供服务,并把数据同步到备机,当主机宕机后,备机立刻开始服务。

    Redis HA中使用比较多的是keepalived,它使主机备机对外提供同一个虚拟IP,客户端通过虚拟IP进行数据操作,正常期间主机一直对外提供服务,宕机后VIP自动漂移到备机上。

    优点是对客户端毫无影响,仍然通过VIP操作。

    缺点也很明显,在绝大多数时间内备机是一直没使用,被浪费着的。

    主从方式

    这种采取一主多从的办法,主从之间进行数据同步。当Master宕机后,通过选举算法(Paxos、Raft)从slave中选举出新Master继续对外提供服务,主机恢复后以slave的身份重新加入。

    主从另一个目的是进行读写分离,这是当单机读写压力过高的一种通用型解决方案。其主机的角色只提供写操作或少量的读,把多余读请求通过负载均衡算法分流到单个或多个slave服务器上。

    缺点是主机宕机后,Slave虽然被选举成新Master了,但对外提供的IP服务地址却发生变化了,意味着会影响到客户端。解决这种情况需要一些额外的工作,在当主机地址发生变化后及时通知到客户端,客户端收到新地址后,使用新地址继续发送新请求。

    (2)数据同步

    无论是主备还是主从都牵扯到数据同步的问题,这也分2种情况:

    同步方式: 当主机收到客户端写操作后,以同步方式把数据同步到从机上,当从机也成功写入后,主机才返回给客户端成功,也称数据强一致性。很显然这种方式性能会降低不少,当从机很多时,可以不用每台都同步,主机同步某一台从机后,从机再把数据分发同步到其他从机上,这样提高主机性能分担同步压力。在redis中是支持这杨配置的,一台master,一台slave,同时这台salve又作为其他slave的master。

    异步方式: 主机接收到写操作后,直接返回成功,然后在后台用异步方式把数据同步到从机上。这种同步性能比较好,但无法保证数据的完整性,比如在异步同步过程中主机突然宕机了,也称这种方式为数据弱一致性。

    Redis主从同步采用的是异步方式,因此会有少量丢数据的危险。还有种弱一致性的特例叫最终一致性,这块详细内容可参见CAP原理及一致性模型。

    (3)方案选择

    keepalived方案配置简单、人力成本小,在数据量少、压力小的情况下推荐使用。如果数据量比较大,不希望过多浪费机器,还希望在宕机后,做一些自定义的措施,比如报警、记日志、数据迁移等操作,推荐使用主从方式,因为和主从搭配的一般还有个管理监控中心。

    宕机通知这块,可以集成到客户端组件上,也可单独抽离出来。Redis官方Sentinel支持故障自动转移、通知等,详情见低成本高可用方案设计(四)。

    逻辑图:

    【162期】一些Redis面试题及分布式集群面试考点整理

    三,Redis分布式锁如何解决锁超时问题

    四,Redis实现分布式锁的几种常见方式

    与其在网上拼命找题?** 不如马上关注我们~**

    【162期】一些Redis面试题及分布式集群面试考点整理

    原文始发于微信公众号(Java面试题精选):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    转载声明:转载请注明出处,本技术博客是本人原创文章

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 【162期】一些Redis面试题及分布式集群面试考点整理


     上一篇
    【161期】面试不愁,给你一份SpringBoot常用注解 【161期】面试不愁,给你一份SpringBoot常用注解
    点击上方“Java面试题精选”,关注公众号 面试刷图,查缺补漏 号外:往期面试题,10篇为一个单位归置到本公众号菜单栏-面试题,有需要的欢迎翻阅 阶段汇总集合: 一、注解(annotations)列表@SpringBootApplicati
    2021-04-05
    下一篇 
    【163期】面试官——你能谈谈数据库实现缓存最终一致性的一些方法吗? 【163期】面试官——你能谈谈数据库实现缓存最终一致性的一些方法吗?
    点击上方“Java面试题精选”,关注公众号 面试刷图,查缺补漏 号外:往期面试题,10篇为一个单位归置到本公众号菜单栏-面试题,有需要的欢迎翻阅 阶段汇总集合: 背景缓存是软件开发中一个非常有用的概念,数据库缓存更是在项目中必然会遇到的场景
    2021-04-05