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个词