java分布式面试题_2021,Java最全的分布式面试题合集附答案,共2w字!

分布式分为分布式缓存(Redis)、分布式锁(Redis 或 Zookeeper)、分布式服务(Dubbo 或 SpringCloud)、分布式服务协调(Zookeeper)、分布式消息队列(Kafka 、RabbitMq)、分布式 Session 、分布式事务、分布式搜索(Elasticsearch)等。不可能所有分布式内容都熟悉,一定要在某个领域有所专长。

一、分布式理论

问:分布式有哪些理论?

CAP 、BASE。分布式 CAP 理论,任何一个分布式系统都无法同时满足 Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。而 Partition tolerance(分区容错性) 是必须的,因此一般是 CP ,或者 AP。

问:你怎么理解分布式一致性?

数据一致性通常指关联数据之间的逻辑关系是否正确和完整。在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。

一致性还分为强一致性,弱一致性,还有最终一致性。强一致性就是马上就保持一致。

最终一致性是指经过一段时间后,可以保持一致。

二、分布式事务

问:你怎么理解分布式事务?分布式事务的协议有哪些?

分布式事务是指会涉及到操作多个数据库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务类型:二阶段提交 2PC ,三阶段提交 3PC。

2PC :第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。

3PC :三个阶段:CanCommit 、PreCommit 、DoCommit。

问:分布式事务的解决方案有哪些?

分布式事务解决方案:补偿机制 TCC 、XA 、消息队列 MQ。

问:讲一下 TCC。

T(Try)锁资源:锁定某个资源,设置一个预备类的状态,冻结部分数据。

比如,订单的支付状态,先把状态修改为"支付中(PAYING)"。

比如,本来库存数量是 100 ,现在卖出了 2 个,不要直接扣减这个库存。在一个单独的冻结库存的字段,比如 prepare _ remove _ stock 字段,设置一个 2。也就是说,有 2 个库存是给冻结了。

积分服务的也是同理,别直接给用户增加会员积分。你可以先在积分表里的一个预增加积分字段加入积分。

比如:用户积分原本是 1190 ,现在要增加 10 个积分,别直接 1190 + 10 = 1200 个积分啊!你可以保持积分为 1190 不变,在一个预增加字段里,比如说 prepare _ add _ credit 字段,设置一个 10 ,表示有 10 个积分准备增加。

C(Confirm):在各个服务里引入了一个 TCC 分布式事务的框架,事务管理器可以感知到各个服务的 Try 操作是否都成功了。假如都成功了, TCC 分布式事务框架会控制进入 TCC 下一个阶段,第一个 C 阶段,也就是 Confirm 阶段。此时,需要把 Try 阶段锁住的资源进行处理。

比如,把订单的状态设置为“已支付(Payed)”。

比如,扣除掉相应的库存。

比如,增加用户积分。

C(Cancel):在 Try 阶段,假如某个服务执行出错,比如积分服务执行出错了,那么服务内的 TCC 事务框架是可以感知到的,然后它会决定对整个 TCC 分布式事务进行回滚。

TCC 分布式事务框架只要感知到了任何一个服务的 Try 逻辑失败了,就会跟各个服务内的 TCC 分布式事务框架进行通信,然后调用各个服务的 Cancel 逻辑。也就是说,会执行各个服务的第二个 C 阶段, Cancel 阶段。

比如,订单的支付状态,先把状态修改为" closed "状态。

比如,冻结库存的字段, prepare _ remove _ stock 字段,将冻结的库存 2 清零。

比如,预增加积分的字段, prepare _ add _ credit 字段,将准备增加的积分 10 清零。

问:事务管理器宕掉了,怎么办?

做冗余,设置多个事务管理器,一个宕掉了,其他的还可以用。

问:怎么保证分布式系统的幂等性?

状态机制。版本号机制。

三、Redis

问:Redis 有哪些优势?

速度快,因为数据存在内存中。

支持丰富数据类型,支持 string、list、set 、sorted set、hash。

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

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

单线程,单进程,采用 IO 多路复用技术。

问:Redis 的存储结构是怎样的?

key-value 键值对。

问:Redis 支持哪些数据结构?

string(字符串), hash(哈希), list(队列), set(集合)及 zset(sorted set 有序集合)。

问:Redis 的数据结构,有哪些应用场景?

string:简单地 get / set 缓存。

hash:可以缓存用户资料。比如命令:hmset user1 name "lin" sex "male" age "25" ,缓存用户 user1 的资料,姓名为 lin ,性别为男,年龄 25。

list:可以做队列。往 list 队列里面 push 数据,然后再 pop 出来。

zset:可以用来做排行榜。

问:Redis 的数据结构,底层分别是由什么实现的?

Redis 字符串,却不是 C 语言中的字符串(即以空字符 ’\0’ 结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string , SDS)的抽象类型,并将 SDS 作为 Redis 的默认字符串表示。

Redi List ,底层是 ZipList ,不满足 ZipList 就使用双向链表。ZipList 是为了节约内存而开发的。和各种语言的数组类似,它是由连续的内存块组成的,这样一来,由于内存是连续的,就减少了很多内存碎片和指针的内存占用,进而节约了内存。

问:Redis 怎么保证可靠性?Redis 的持久化方式有哪些?有哪些优缺点?

一个可靠安全的系统,肯定要考虑数据的可靠性,尤其对于内存为主的 Redis ,就要考虑一旦服务器挂掉,启动之后,如何恢复数据的问题,也就是说数据如何持久化的问题。

AOF 就是备份操作记录。AOF 由于是备份操作命令,备份快、恢复慢。

AOF 的优点:AOF 更好保证数据不会被丢失,最多只丢失一秒内的数据。另外重写操作保证了数据的有效性,即使日志文件过大也会进行重写。AOF 的日志文件的记录可读性非常的高。

AOF 的缺点:对于相同数量的数据集而言, AOF 文件通常要大于 RDB 文件。

RDB 就是备份所有数据,使用了快照。RDB 恢复数据比较快。

问:AOF 文件过大,怎么处理?

会进行 AOF 文件重写。

随着 AOF 文件越来越大,里面会有大部分是重复命令或者可以合并的命令。

重写的好处:减少 AOF 日志尺寸,减少内存占用,加快数据库恢复时间。

执行一个 AOF 文件重写操作,重写会创建一个当前 AOF 文件的体积优化版本。

问:讲一下 Redis 的事务。

先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令。如果想放弃这个事务,可以使用 DISCARD 命令。

问:Redis 事务无法回滚,那怎么处理?

问:怎么设置 Redis 的 key 过期时间?

key 的的过期时间通过 EXPIRE key seconds 命令来设置数据的过期时间。返回 1 表明设置成功,返回 0 表明 key 不存在或者不能成功设置过期时间。

问:Redis 的过期策略有哪些?

惰性删除:当读/写一个已经过期的 key 时,会触发惰性删除策略,直接删除掉这个过期 key ,并按照 key 不存在去处理。惰性删除,对内存不太好,已经过期的 key 会占用太多的内存。

定期删除:每隔一段时间,就会对 Redis 进行检查,主动删除一批已过期的 key。

问:为什么 Redis 不使用定时删除?

定时删除,就是在设置 key 的过期时间的同时,创建一个定时器,让定时器在过期时间来临时,立即执行对 key 的删除操作。

定时删会占用 CPU ,影响服务器的响应时间和性能。

问:Redis 的内存回收机制都有哪些?

当前已用内存超过 maxmemory 限定时,会触发主动清理策略,也就是 Redis 的内存回收策略。

LRU 、TTL。

noeviction :默认策略,不会删除任何数据,拒绝所有写入

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值