高级必会问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 面试过不下于百号人,总结一下自己常问的问题,及参考答案

1Mysql的存储引擎,以及他们之间的区别

1InnoDB支持事务,MyISAM不支持

2InnoDB 支持外键,而 MyISAM 不支持

     3InnoDB 支持表、行锁,而 MyISAM 支持表级锁

4InnoDB 必须有唯一索引(主键),如果没有指定的话 InnoDB 会自己生成一个隐藏列Row_id来充当默认主键,MyISAM 可以没有

5、等等包括不限于

 

2、一条 Sql 语句查询一直慢会是什么原因

1.没有用到索引

比如函数导致的索引失效,或者本身就没有加索引

2.表数据量太大

考虑分库分表吧

3.优化器选错了索引

考虑使用 force index 强制走索引

 

3、面对一个上百行,多张表关联,编写比较复杂,性能存在问题的sql优化,你的优化思路是什么?

1、先分析sql的执行情况,判断慢的原因,考虑建立合适的索引或是否建立索引

2、业务涉及到多表关联查询,还编写比较复杂,考虑表设计是否合理,是否有有改变表结构的可能,或者建立所需查询的大表,使用大表查询

3、简化sql,判断sql查询是否可以在业务代码中处理,没必要一条sql查出所需数据

4、综合判断所查询的数据更新是否频繁,查询的条件是否比较均一,使用缓存处理

5、引入搜索引擎,比如es,数据查询走搜索引擎能高效查询

6、。。。。。。

4、分布式事务怎么实现

1.本地消息表

2.消息事务

3.二阶段提交

4.三阶段提交

5.TCC

6.最大努力通知

7.LCN框架

8.Seata 框架

可以通过以下七种方案解决方案,根据回答继续问该方案实现的思路

 

5Redis 的持久化机制有哪些?优缺点说说

 

redis 两种持久化的方式,AOF RDB.

AOF:

redis 每次执行一个命令时,都会把这个「命令原本的语句记录到一个.aod的文件当中,然后通过fsync策略,将命令执行后的数据持久化到磁盘中」(不包括读命令)

image.png

 

RDB:

某个时间点 redis 内存中的数据以二进制的形式存储的一个.rdb为后缀的文件当中,也就是「周期性的备份redis中的整个数据,这是redis默认的持久化方式,也就是我们说的快照(snapshot),是采用 fork 子进程的方式来写时同步的。

 image.png

6Redis除了用在缓存方面,还有没有用在别的场景,可以说一下

        例如:分布式锁、消息队列、地图距离查找(GEO)、分布式限流等等

7、怎么实现分布式锁

实现方案例如:

基于Spring Integration实现分布式锁、基于redisson实现分布式锁

谈谈你是怎么通过redis实现分布式锁的

 

8、为什么需要限流

限流可以应对:热点业务带来的突发请求;调用方bug导致的突发请求;恶意攻击请求。

9、有没有使用过消息队列(RabbitMq等等)

 

优点比较核心的有 3 个:解耦、异步、削峰。
缺点有以下几个:

1.     系统可用性降低

系统引入的外部依赖越多,越容易挂掉。

2.     系统复杂度提高

硬生生加个 MQ 进来,如何保证消息的传递及消费成功

3.     一致性问题

A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,这数据就不一致了。

所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉。

如何保证消息的传递和成功消费?

 

需要考虑:

消息发送确认机制;消费确认机制;消息的重新投递;消费幂等性, 等等

10、什么是IOCAOP

 

IOC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Springbean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOCSpring针对解决程序耦合而存在的。在实际应用中,Spring通过配置文件(xml或者properties)指定需要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法(getBean())就可以获取到我们想要的根据指定配置进行初始化的实例对象。

AOP(Aspect-Oriented Programming),  面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角. OOP , 我们以类(class)作为我们的基本单元, AOP 中的基本单元是 Aspect(切面)

 

 

11、有没有使用过微服务

 

介绍一下常用的微服务组件,以及你自己的项目是怎么拆分服务的

 

参考图

image.png

12、其他问题

-      nacoseureka的区别,还有他们服务注册和发现的机制分别是什么

-      分布式配置中心的实现原理是什么

-      项目里面你是怎么实现鉴权的

-      远程调用时token怎么传递

-      项目的优化有没有做过什么全局处理

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
Java 数据处理 Android开发
深入解析移动应用开发:从基础到高级
【10月更文挑战第2天】本文将带你深入探索移动应用开发的世界,从基础知识到高级技术,我们将一一解析。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和知识。我们将从移动操作系统的选择开始,然后深入探讨移动应用开发的流程和技术,最后还将分享一些实用的代码示例。让我们一起开启这场移动应用开发的旅程吧!
|
2天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
5天前
|
敏捷开发 测试技术 持续交付
探索自动化测试:从基础到高级
【10月更文挑战第35天】在软件质量的保证过程中,自动化测试以其高效和可重复性成为不可或缺的一环。本文旨在通过简明的语言和实际案例引导读者了解自动化测试的核心概念、工具选择与应用,以及如何实现从入门到精通的过渡。我们将一起探讨如何将自动化测试策略融入日常开发流程中,提升测试效率,同时确保产品质量。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
13 3
|
8天前
|
机器学习/深度学习 人工智能 数据可视化
探索Python编程:从基础到高级
【10月更文挑战第33天】本文是一篇深入浅出的Python编程入门教程,适合初学者阅读。文章首先介绍了Python的基本概念和语法,然后通过实例讲解了如何使用Python进行数据处理和分析,最后介绍了一些高级特性和库,帮助读者更好地掌握Python编程。无论你是编程新手还是有一定经验的开发者,这篇文章都能给你带来新的启示和收获。
|
23天前
|
存储 NoSQL 关系型数据库
从基础到高级应用的全面解析
【10月更文挑战第17天】从基础到高级应用的全面解析
20 0
|
1月前
|
存储 测试技术 Android开发
探索安卓应用开发:从基础到高级
【9月更文挑战第31天】在这篇文章中,我们将一起踏上安卓应用开发的旅程。无论你是初学者还是有一定经验的开发者,本文都将为你提供有价值的信息和指导。我们将从安卓应用开发的基础知识开始,逐步深入到更高级的主题。通过阅读本文,你将了解到如何构建一个安卓应用,包括用户界面设计、数据存储和网络通信等方面。此外,我们还将探讨一些高级主题,如性能优化、安全性和测试。让我们一起开始吧!
|
2月前
|
Java Linux Android开发
深入理解Android开发:从基础到高级
【9月更文挑战第17天】本文将深入探讨Android开发的各个方面,包括应用开发、操作系统等。我们将通过代码示例来展示如何创建一个简单的Android应用,并解释其背后的原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
28天前
|
安全 Java 开发工具
掌握安卓应用开发:从基础到高级的全面指南
本文旨在为读者提供一个详尽的指南,帮助他们掌握安卓应用开发的基础知识及高级技巧。从环境搭建到项目实践,逐步深入讲解安卓开发的各个环节。无论是对于刚入门的初学者还是希望进一步提升的开发者,本文都将提供实用的建议和示例代码,帮助你快速上手并提升技能。
|
2月前
|
存储 开发者 索引
掌握Python编程:从基础到高级
【9月更文挑战第11天】本文将引导你进入Python编程的世界,无论你是初学者还是有经验的开发者。我们将从基础语法开始,逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。每个部分都将通过实际代码示例进行说明,帮助你更好地理解和应用所学知识。让我们一起探索Python的强大功能和灵活性,开启你的编程之旅!
|
3月前
|
自然语言处理 安全 测试技术
CodeGeeX高级功能
【8月更文挑战第30天】CodeGeeX高级功能
85 6