Java后端模拟面试 题集⑧

1.如何实现一个秒杀的业务

秒杀业务与一般的下单业务不同之处就在于,用户使用秒杀业务是一到某个(通常是)整点的时候,用户在短短2-3分钟内,乃至30秒、十几秒或几秒的时间内同时抢购下单,所以服务器要处理不同于普通下单的高并发业务,这样就对服务器处理的效率提出了很高的要求。

为了提高服务器处理的效率,我们使用Redis替代MySQL。

为什么会快一些呢?

首先,MySQL是对磁盘进行操作,磁盘中固态硬盘比机械硬盘大概快100倍;Redis是对内存进行读写的数据库,内存的处理速度又比磁盘快10倍。

其次,在处理的数据结构上,Redis是使用K-V值进行存储,时间复杂度是O(1),与此同时MySQL采用B+树,这种数据结构的时间复杂度是O(logn)。

最后,Redis采用多路复用IO处理读写请求,效率大大提高。

总之,这种优化思路可以总结成这样:

  1. 写入内存而不是写入磁盘;
  2. 用异步处理而不是同步处理;
  3. 多线程而不是单线程。

如果以后需要自己定制优化的方案,可以遵循这个思路。

2.支付模块是你实现的么

差不多。大概要创建两张表,临时订单表和支付成功结果表,还涉及用户表、课程表等。最基本的支付功能的实现包括临时订单的增、改、查,用户下单的时候增,同时查询好用户、课程信息等创建临时订单;查是查询订单的支付状态,方便后续对支付成功结果进行处理;改是修改订单的支付状态。而支付成功结果表则需要增和查,增不用说是添加用户下单对应课程的成功结果,查是方便日后进行操作。除此以外,还有微信、支付宝等支付接口的二维码生成、查询支付状态的接口需要完成。

3.MySQL怎么调优

分情况讨论:

1.单条SQL查询慢:

可能有两种原因,

        ①索引未正常建立或使用;

        ②数据量太大了

索引的情况这样排查:

首先,索引失效的情况有如下:

        ①使用了!=、<>这样的;

        ②使用了前导模糊查询;

        ③or引用的部分,没有同时联系索引一起建立查询;

        ④where、from中有子查询等。

要避免以上情况的查询出现。然后,提高查询效率的方法有:

        ①大语句拆成小语句查询;

        ②用exists代替in;

        ③尽量不加is null、is not null;

        ④尽量使用主键查询;

        ⑤尽量使用数值字段。

数据量大的情况,只好拆分数据了。

垂直分表:

        ①不常用字段另放一张表;

        ②text、blog等大字段放附表;

        ③经常组合查询的放一张表。

水平分表:

一个数据库超过200w条数据,一般就算数据量大的了,就可以水平分成多个表。

还有设计表的时候可以提高SQL查询效率的建议:

        ①使用占空间小的数据类型存储,比如尽量用tinyint、smallint等代替int;

        ②使用简单的数据类型存储,int就比vchar简单。

        ③尽量用not null标记字段,因为null会占4个字节;

        ④少用text类型,用的话考虑分表;

        ⑤尽量用timestamp,不用datetime;

        ⑥单表建议20个字段以内。

2.部分SQL运行慢:

开启慢查询,即开启slow_query_log,需要设置slow_query_log和slow_query_log_file。slow_query_log默认10秒钟,可以设为1s或3s,然后查看慢的SQL语句有什么问题。

3.整个SQL运行慢:

考虑读写分离。两种方案:

        ①应用层发力,Spring中用AOP或Annotation实现。

        ②使用中间件,比如MySQL Proxy、Atlas等。

各有优缺,耦合性、可控性、稳定性等。

4.Redis和MySQL有什么不同

首先,MySQL是对磁盘进行操作,磁盘中固态硬盘比机械硬盘大概快100倍;Redis是对内存进行读写的数据库,内存的处理速度又比磁盘快10倍。

其次,在处理的数据结构上,Redis是使用K-V值进行存储,时间复杂度是O(1),与此同时MySQL采用B+树,这种数据结构的时间复杂度是O(logn)。

最后,Redis采用多路复用IO处理读写请求,效率大大提高。

5.MySQL的老引擎MyISAM什么情况下还在用

1、不需要事务支持的业务(转账、充值、付款这种就不行)。

2、一般为读数据比较多的应用。读写都频繁的不适合,读多或写多都适合。

3、并发访问相对低的业务(纯读、纯写高并发也可以)。

4、数据修改相对较少的业务(阻塞问题)。

5、以读为主的业务,例如:www,blog,图片信息数据库,用户数据库,商品库等业务。

6、对数据一致性要求不是很高的业务。

7、硬件资源比较差的机器可以用MyISAM。

小结:单一对数据库的操作都可以使用MyISAM引擎。

(转自MyISAM引擎和InnoDB引擎介绍及应用场景_myisam和innodb的使用场景-CSDN博客

6.Redis的数据和Java的POJO都是存在内存中的吗,两者使用有什么不同

这个感觉问的很底层了……涉及Java处理POJO的原理、效率,即JVM原理等,然后还有Redis的原理、效率,感觉还涉及Java、Redis源码、架构、数据结构等,等我研究深入点再作回答~

7.你用过什么设计模式

  1. 策略模式
  2. 责任链模式
  3. 模板方法模式
  4. 观察者模式
  5. 工厂模式
  6. 单例模式

(参考工作中常见的 6 种设计模式,你用过几种?_工作中用过哪些设计模式-CSDN博客

8.为什么要有ActiveMQ这样的消息队列中间件,不能直接都使用远程调用呢

远程调用一般都是有返回值的,即有request也有response,可能是返回对应的、需要的结果,也可能是提示调用失败等。远程调用,Remote Procedure Call,RPC,更多的代表一种架构。发起远程调用的两端是消费者和服务提供者,消费者发起远程调用试图享受到服务提供者的服务,比如订单业务A、秒杀业务B都要调用查询用户信息的C服务。

而消息队列MQ除了能接收消息、发送消息,更多的是收到一方的消息,经过处理之后给另一方,它可以作为远程调用时双方通信的中转中间件,但它的功能远不止如此。它还可以用来做异步调用、消息缓存、流量削峰等。它并没有严格的消费者和服务提供者,因为有很多时候消息都是单向的通知类消息,甚至没有返回,比如发送提醒短信等。

9.消息队列使用代码来处理好还是用数据结构来处理好,数据结构,数据的处理中,用Redis好还是MySQL好

Redis的数据结构是KV键值对,复杂度是O(1),而MySQL采用的是B+树,复杂度是O(nlogn),所以Redis的数据结构更高效一点。

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值