高级必会问题

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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数据库实现在线游戏中的游戏玩家积分排行榜功能。
目录
相关文章
|
JavaScript 前端开发 算法
【利用AI让知识体系化】V8引擎相关知识(一)
【利用AI让知识体系化】V8引擎相关知识
|
传感器 运维 监控
如何 3 行代码使用 arduino 接入阿里云物联网平台
阿里云物联网平台提供接入物联网场景的一整套基础设施,强大的在线配置能力,基本可以实现无代码开发接入各类应用,实现大规模的物联网应用场景。
14778 1
如何 3 行代码使用 arduino 接入阿里云物联网平台
|
存储 运维 安全
|
C语言
指针(4)---转移表
指针(4)---转移表
55 0
|
12月前
|
域名解析 网络协议 安全
DNS查询工具简介
DNS查询工具简介
737 4
|
应用服务中间件 Apache nginx
【独家揭秘】502 Bad Gateway不再神秘!五大绝招教你快速定位并解决,从此告别网络烦恼!
【8月更文挑战第19天】遇到502 "Bad Gateway"错误让不少开发者头疼。此错误指示Web服务器作为代理收到无效响应。本文将分步骤指导如何排查与解决502问题:首先检查服务器日志文件寻找线索;接着验证后端服务器状态及连通性;然后审查Web服务器配置确保代理设置无误;再检测后端服务器响应时间避免超时;最后利用抓包工具深入分析网络通信。遵循这些步骤,可助你高效定位并解决502错误。
3223 0
|
存储 设计模式 uml
C++备忘录模式实践:轻松实现撤销与恢复功能
C++备忘录模式实践:轻松实现撤销与恢复功能
262 0
|
缓存 Linux Perl
CentOS7换yum源
CentOS是Linux系统里最常用的一种,CentOS7的yum源默认是国外的源,相较于国内源,网络连接不够稳定,下载速度较慢,因此我们常常把下载好的CentOS7换源为国内的yum源,本篇文章将介绍如何更换CentOS7的yum源为国内yum源,以阿里云的源为例。
5664 1
|
存储 缓存 分布式计算
Redis的高级特性与应用场景(一)
Redis的高级特性与应用场景(一)
114 0
|
机器学习/深度学习 算法 安全
基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)
基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)
723 0