职场面试题总结(15)---Redis的常见问题、spring循环依赖、服务器CPU高如何排查、rabbitmq、rabbitmq消息模型

260 阅读4分钟

1、Redis的常见问题:

(1)库存写入到Redis时间?

秒杀活动创建/维护时写入Redis。

(2)如何保证活动数据库和库存数据一致?

可以使用分布式事务或消息队列。 分布式事务:保证多个数据库的操作同时成功或者同时失败。对强一致性有要求的业务场景可以考虑使用分布式事务,比如银行转账。 消息队列:基于生产者/消费者模型的组件,一般实现异步任务(非实时处理)时会引入消息队列。消息队列的好处是任务可以慢慢处理,不必同步处理等着响应结果。目前主流的消息队列有RocketMQ、Kafka等。使用场景除了异步任务之外,一般还用于失败的情况下重试处理,重复消费直到消费成功。

(3)下单减库存/支付减库存?

下单锁定库存,支付减库存。

(4)如何防止商品被超卖?

把库存数据放入到缓存中,利用缓存的原子特性保证同时只有一个线程操作库存。

(5)库存写回数据库的时机?

采用定时任务同步Redis的数据写回数据库。

2、如何解决spring循环依赖?

三级缓存分别指:

(1) singletonFactories : 单例对象工厂的cache 。

(2)earlySingletonObjects :提前暴光的单例对象的Cache 。【用于检测循环引用,与singletonFactories互斥】 。

(3) singletonObjects:单例对象的cache。

3、服务器CPU高如何排查?

top                                                #定位异常的进程
top -H -p pid                                      #查看异常的线程
strace -T -r -c -p pid                             #查看系统调用和花费的时间
printf "%x/n"线程号                                 #将异常线程转化为16进制
jstack 进程号|grep 线程号(16进制异常线程号)-A90     #定位异常的代码

(1)使用【top】命令定位异常进程,可发现12836的CPU和内存占用率都非常高;

top 命令默认情况下,是每 3 秒刷新一次。也可以通过 top -d <刷新时间间隔> 来指定刷新频率,如top -d 0.1 或top -d 0.01 等。top 执行时,也可以按“s ”键,修改时间间隔。

(2)使用【top -H -p 进程号】查看异常线程。

(3)使用【printf "%x\n" 线程号】将异常线程号转化为16进制。

(4)使用【jstack 进程号|grep 16进制异常线程号 -A90】来定位异常代码的位置(最后的-A90是日志行数,也可以输出为文本文件或使用其他数字)。可以看到异常代码的位置。

4、分库ID,如何保持ID唯一?

(1)方案一:UUID

UUID:通过唯一识别码16个字节128位的长数字。

组成部分:当前日期和时间序列+全局的唯一性网卡mac地址。

优点:代码实现简单、不占用宽带、数据迁移不受影响。

缺点:无序、无法保证趋势递增,字符存储、传输、查询慢、不可读。

(2)方案二:Snowflake雪花算法

国外的twitter分布式下ID生成算法

1bit+41bit+10bit+10+bit=62bit

高位随机+毫秒数+机器码(数据中心+机器id)+10的流水好

国内:

保证数据的唯一性就行了IDC机房

优点:代码实现简单、不占用宽带、数据迁移不受影响、低位趋势递增

缺点:强以来时钟(多台服务器时间一定要一样)、无序无法保证趋势递增

5、rabbitmq发布订阅机制?

(1)一个生产者,多个消费者。

(2)每个消费者都有自己的队列。

(3)生产者没有把消息发送到队列,而是发送到了交换机。

(4)每个队列都要绑定到交换机上。

(5)生产者发送的消息,经过交换机,到达队列,实现一个消息被多个消费者获取的目的。

注释:生产者把消息发送到一个没有队列绑定的交换机,消息将丢失,因为交换机没用存储的能力。

6、rabbitmq消息模型?

RabbitMQ的五种消息模型 在这里插入图片描述

(1)简单工作模型

一个生产者,一个队列 ,一个消费者。

(2)工作模型

一个生产者 ==> 一个队列 ==> 多个消费者。

一个消息只能被消费一次。

(3)订阅模式-----Fanout(广播)

一个生产者 ==> 一个交换机 ==> 多个列队 ==> 多个消费者。

一个消息可以被多个消费者消费。 生产者发生消息只能发送到交换机。

(4)订阅模式 ---- Direct(路由)

一个生产者 ==> 一个交换机 ==> 多个队列 ==> 多个消费者。

routing Key ,一个消息发送给符合 routing Key 的队列。

(5)订阅模式 ---- topic(通配符)

Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符

Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割, 例如:item.insert

通配符规则: #:匹配一个或多个词 *:匹配不多不少恰好1个词