Skip to content

面试速答(先看这里)

**一句话结论:**项目自己负责的购物车模块介绍一下?

60秒标准回答:

2年后端JAVA经验,代销平台,订单模块,购物车,详情页,分布式架构,简历上写了自己做过分布式系统、对于分布式事务、分布式锁等有了解、

项目自己负责的购物车模块介绍一下?未登录、redis存储,临时用户->登录用户的购物车合并,购物车限制

登录用户的购物车存储,在 redis 中 Key 和 value 都是什么?除了 SKUID 为什么还需要存商品的信息?价格、库存改的时候怎么办?为什么要保存而不是直接查一下?

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**2年后端JAVA经验,代销平台,订单模块,购物车,详情页,分布式架构,简历上写了自己做过分布式系统、对于分布式事务、分布式锁等有了解、
  • **要点2:**登录用户的购物车存储,在 redis 中 Key 和 value 都是什么?
  • **要点3:**如何实现登录用户可以存 1000 sku, 未登录用户只能存 200 sku ,如何实现?
  • **要点4:**商品详情页快照的设计可以介绍一下吗?
  • **要点5:**商品详情页快照的设计可以介绍一下吗?

**记忆锚点:**wwwyuquecom → https → laiyanhong-9tr5c → zwpzru → threadlocal → hashmap

关键取舍:

  • 未登录、redis存储,临时用户->登录用户的购物车合并,购物车限制, 登录用户的购物车存储,在 redis 中 Key 和 value 都是什么?
  • 登录用户和未登录用户,购物车限制有区别?
  • 有没有可能并发情况导致超过购物车限制?

易错提醒:

  • 订单创建成功,但是购物车删除商品失败了怎么办?
  • 通过交流,有经验的面试官很容易就能发现其实他现在的购物车的存储方式是存在很大的问题的,他把商品所有信息都保存在缓存中,而这其实是完全没有必要的。

加分表达:

  • 如果需要实现一个凑单的功能,你会考虑哪些功能?
  • 面试中,如果面试官发现候选人的项目中技术方案存在很大的问题的时候,就会开始怀疑项目的真实性以及面试者在项目中的参与度的问题。
  • Redis的持久化机制: 如果需要实现一个凑单的功能,你会考虑哪些功能?

追问准备:

  • 2年后端JAVA经验,代销平台,订单模块,购物车,详情页,分布式架构,简历上写了自己做过分布式系统、对于分布式事务、分布式锁等有了解、 项目自己负责的购物车模块介绍一下?
  • 未登录、redis存储,临时用户->登录用户的购物车合并,购物车限制, 登录用户的购物车存储,在 redis 中 Key 和 value 都是什么?
  • 除了 SKUID 为什么还需要存商品的信息?
  • 价格、库存改的时候怎么办?

面试者背景 ​

2年后端JAVA经验,代销平台,订单模块,购物车,详情页,分布式架构,简历上写了自己做过分布式系统、对于分布式事务、分布式锁等有了解、

面试过程 ​

> 项目自己负责的购物车模块介绍一下?未登录、redis存储,临时用户->登录用户的购物车合并,购物车限制, > > 登录用户的购物车存储,在redis中Key和value都是什么?除了SKUID为什么还需要存商品的信息?价格、库存改的时候怎么办?为什么要保存而不是直接查一下? > > 登录用户和未登录用户,购物车限制有区别?存储时间的区别, > > 如何实现登录用户可以存1000 sku,未登录用户只能存200 sku,如何实现? > > 有没有可能并发情况导致超过购物车限制? > > 购物车只存在Redis里面,数据会丢吗?AOF、 > > AOF能保证不丢吗?混合模式为什么数据就不丢? > > 如果需要实现一个凑单的功能,你会考虑哪些功能?或者系统上可能会做哪些改动?凑单凑满之后,优惠券失效了怎么办? > > 分布式系统之间的数据一致性的问题如何保证的?订单创建成功,但是购物车删除商品失败了怎么办? > > 分布式事务的方案都有哪些?SEATA、mq最终一致性、 > > MQ实现最终一致性,具体是怎么做的?补偿机制怎么做? > > Redis都在哪些场景中用?缓存、token, > > 商品详情页快照的设计可以介绍一下吗?每一个订单都对应一个详情页快照?有什么优化的方案吗? > > 分布式锁有用过吗?商品详情并发加锁?分布式锁能解决缓存穿透吗?? > > 介绍一下threadlocal?弱引用,threadlocal能解决并发的问题吗?threadlocal会有内存泄露的问题吗?threadlocalMap和普通的hashmap有什么区别? > > Hashmap在1.8中除了引入红黑树、还有其他改动吗?为什么头插法要改成尾插法?hashmap的方法的具体实现,比如put?hashcode是怎么取到的? > > 扩容是怎么实现的? > > 1.8里面concurrenthashmap有改动吗?

题目解析 ​

> 登录用户的购物车存储,在redis中Key和value都是什么?除了SKUID为什么还需要存商品的信息?价格、库存改的时候怎么办?为什么要保存而不是直接查一下?

> 登录用户和未登录用户,购物车限制有区别?存储时间的区别, > > 如何实现登录用户可以存1000 sku,未登录用户只能存200 sku,如何实现? > > 有没有可能并发情况导致超过购物车限制?

这里是对于面试者负责的业务的讨论,主要考察一下他对于自己负责的购物车业务是不是足够了解,并且探讨一下他们当前的实现方式是不是合理的。

通过交流,有经验的面试官很容易就能发现其实他现在的购物车的存储方式是存在很大的问题的,他把商品所有信息都保存在缓存中,而这其实是完全没有必要的。其实只需要保存商品的skuid+数量就行了。

而且,对于未登录的用户和已登录用户的存储,其实也完全可有采用不同的存储架构。所以整个项目看上去还有很大的优化空间。

面试中,如果面试官发现候选人的项目中技术方案存在很大的问题的时候,就会开始怀疑项目的真实性以及面试者在项目中的参与度的问题。所以这方面一定要注意。尤其是自己负责的项目的一些细节问题,比如存储方式、表结构设计、分层架构等等。

购物车系统设计:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/gno8ufqobagg9lm3

> 购物车只存在Redis里面,数据会丢吗?AOF、 > > AOF能保证不丢吗?混合模式为什么数据就不丢?

Redis的持久化机制:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/zee35df3pnmdvmgb

> 如果需要实现一个凑单的功能,你会考虑哪些功能?或者系统上可能会做哪些改动?凑单凑满之后,优惠券失效了怎么办?

这其实是一个场景题,主要考察一个面试者在实现一个新的功能的时候,考虑的是否全面。

可能的思路:

1、用用户的购物车商品的价格、或者已勾选的购物车商品的价格和用户已有的优惠券的门槛进行比较。

2、当触发一定的凑单阈值的时候,根据用户的购物车信息进行凑单推荐

3、凑单商品要经过算法选择,需要是价格不高、并且实用或者和已加购商品有关的

4、在选择优惠券的时候,因为要凑单,所以需要考虑优惠券的失效的问题,要么就选择距离失效时间还有几小时以上的优惠券,或者就先进行优惠券的预锁定。

5、对于因凑单加购并购买成功的商品,做打标,方便后面用户自查,以及数据分析,并且还可以智能的推荐给其他用户。

6、考虑一键凑单功能,让用户提前设置凑单喜好,在用户需要凑单的时候,一键凑单

7、增加凑单商品购物车,可以让用户在看到一些价格不高,也不急用的商品,先放到凑单购物车中,后面在日常下单的时候,优先从凑单购物车选择商品进行拼单凑单。

> 分布式系统之间的数据一致性的问题如何保证的?订单创建成功,但是购物车删除商品失败了怎么办? > > 分布式事务的方案都有哪些?SEATA、mq最终一致性、 > > MQ实现最终一致性,具体是怎么做的?补偿机制怎么做?

这里考察的其实是分布式系统的数据一致性问题,也就是分布式事务的问题。

分布式事务:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/bfwb9ednaugso6g1

事务消息:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/gnqz6bpr1u8v2x9e

> Redis都在哪些场景中用?缓存、token,

缓存、排行榜、计数器应用、共享Session、分布式锁、社交网络、消息队列、位操作

https://www.yuque.com/laiyanhong-9tr5c/zwpzru/rw5mtgaadsc9bu3m

> 商品详情页快照的设计可以介绍一下吗?每一个订单都对应一个详情页快照?有什么优化的方案吗?

> 分布式锁有用过吗?商品详情并发加锁?分布式锁能解决缓存穿透吗??

分布式锁的多种实现方式:https://www.yuque.com/hollis666/loucgb/vi2dze

缓存穿透问题:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/sheq5onhskxoggai

> 介绍一下threadlocal?弱引用,threadlocal能解决并发的问题吗?threadlocal会有内存泄露的问题吗?threadlocalMap和普通的hashmap有什么区别?

threadlocal:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/vk6va98ggmtsei0x

> Hashmap在1.8中除了引入红黑树、还有其他改动吗?为什么头插法要改成尾插法?hashmap的方法的具体实现,比如put?hashcode是怎么取到的? > > 扩容是怎么实现的? > > 1.8里面concurrenthashmap有改动吗?

头插法&尾插法:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/snupouc4p8z46dm7

hashmap的扩容:https://www.yuque.com/laiyanhong-9tr5c/zwpzru/zg0i7dlkm2qzxhgt