自我介绍

面试官,上午好,我叫XX,毕业后一直从事软件研发工作,目前就职于南京爱福路汽车科技有限公司,负责的项目有客户车辆,saas端侧,短信,商机,提醒系统,主要是用的框架有 redis,对缓存雪崩,穿透有一定的了解,也有使用 rocketMq 消息中间件,去异步,削峰,解耦,以及最大努力通知的分布式事务。

Good afternoon interviewer, my name is xx, after graduation has been engaged in software development work, currently working in Nanjing Aiflu Automotive Technology Co.Engaged in back-end java research and development, the project in hand is responsible for customer vehicle system, saas end side, reminder list, SMS, etc.Use to spring boot, mysql, redis, mq, kafka, es, etc., to redis cache avalanche, cache penetration, mq distributed transactions, asynchronous peak shaving decoupling, mysql index structure and the flow of data process has a certain understanding, probably so

Java基础

Map

List

多线程

JVM

内存模型

加载过程

垃圾回收机制

Redis

https://www.yuque.com/jie-cn/zebhgb/fawp05

双写一致性

  • 首先只有两份数据源,就会天然的存在数据一致性的问题。
  • 其次我们添加缓存的目前就是提高响应速度,减少DB压力。如果业务场景能够接受缓存过期时间内的不一致,其实最好还是不好去为了保证双写一致性多做其他的工作,这会变相的增加业务的链路和成本。
  • 如果一定要保证双写的一致性的话,也是有方案的,首先数据不一致肯定是因为第一次更新数据库成功,后面更新缓存失败,应该不会有去做先更新缓存在去更新数据库的步骤
  • 更新缓存失败,一般会存在两种情况,第一种数据网络的异常或者服务宕机,导致更新失败,第二种高并发的情况下,导致更新错乱,这种情况下,我们可以将更新数据缓存变成删除缓存,这样基本上解决高并发场景下的更新异常
  • 第一种情况下的异常,最常见的解决方案就是重试,但是可能会存在服务没恢复,依然删除失败。这种场景下我们就需要去做异步通知的策略,通过mq更新,这样就可以解决第一种场景
  • 但是这样做的话明显增加了调用链路,可能本来就是为了快速响应,性能的,也会教之前变慢,所以我们需要在合适的场景下判断使用那种方式
  • 当然上面的方式还是会存在问题,如果一定要保证一致性,我们还可以将读写的请求串行化,类似数据库的客串行话,但是这样的话性能会变的相当差

    RocketMq

Dubbo

Elasticsearch

数据库

索引失效

Kafka

Zookeeper

zookeeper 的数据结构是一种树形结构,在一个节点上挂在对应的机器节点,
使用 zookeeper 是实现分布式锁,就是在树形结构的基础上,对并发的线程获取的时候,在自身内部判断,当前线程维护的一个key,判断是否是最小key,如果是获取到锁,一般用在 redis 并发竞争时,使用 zookeeper 管理对应数据

算法

选择算法