Skip to content

面试速答(先看这里)

**一句话结论:**购物车系统的主要功能,是在用户选购商品之后,下单之前,先把用户的意向商品、数量等信息保存下来,方便用户进行统一的支付。

60秒标准回答:

购物车系统的主要功能,是在用户选购商品之后,下单之前,先把用户的意向商品、数量等信息保存下来,方便用户进行统一的支付

对于购物车的操作主要就是加入购物车、查看购物车以及通过购物车下单等

一般,我们在存储的时候,并不需要把商品的所有信息都保存下来,只需要保存一个SKUID就行了,然后再加上数量、时间等字段即可

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

回答主线:

  • **未登录用户购物车:**对于电商平台来说,用户一般有登录和未登录两种状态,一般购物车功能需要同时支持已登录用户的加购和未登录用户的加购。
  • **已登录用户的购物车:**对于已经登录的用户的购物车,我们就不能存储在客户端了,因为客户端的数据可能会超时、一旦换了设备也就没有了。

**记忆锚点:**Redis → MySQL → user_id → LocalStorage → 要在客户端做临时缓存 → time_stamp

关键取舍:

  • 如果使用Redis来保存的话,其实也简单,只需要在上面的未登录用户的购物车的基础上增加一个user_id作为key就行了: 使用Redis和数据库存储各有好处: Redis 性能要比 MySQL 高, 响应时间更短,可以支撑更多的并发请求 MySQL 的数据可靠性是要好于 Redis 的 ,因为 Redis 是异步刷盘,如果出现服务器掉电等异常情况,Redi…

易错提醒:

  • 在存储时,只需要设计一个JSON格式就可以了,因为用户没登录,所以也就不需要标识数据属于谁,那么只需要如下存储即可: 已登录用户的购物车 对于已经登录的用户的购物车,我们就不能存储在客户端了,因为客户端的数据可能会超时、一旦换了设备也就没有了。

加分表达:

  • 如果是使用数据库,那么就直接建表存储就行了,表中主要需要包含user_id、sku_id、count、time_stamp等几个业务字段就可以了。

追问准备:

  • 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「MySQL」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「user_id」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

购物车系统的主要功能,是在用户选购商品之后,下单之前,先把用户的意向商品、数量等信息保存下来,方便用户进行统一的支付。

对于购物车的操作主要就是加入购物车、查看购物车以及通过购物车下单等 。

一般,我们在存储的时候,并不需要把商品的所有信息都保存下来,只需要保存一个SKUID就行了,然后再加上数量、时间等字段即可。

至于商品的库存、价格、介绍等信息,只需要在渲染购物车的时候实时反查和计算就行了。

未登录用户购物车 ​

对于电商平台来说,用户一般有登录和未登录两种状态,一般购物车功能需要同时支持已登录用户的加购和未登录用户的加购。

而已登录和未登录的用户的购物车数据的存储其实是不同的。

对于未登录的用户,其实他的购物车的信息没必要存储在后端,只需要在客户端做临时缓存就行了。客户端存储可以选择Cookie 和 LocalStorage等技术。

在存储时,只需要设计一个JSON格式就可以了,因为用户没登录,所以也就不需要标识数据属于谁,那么只需要如下存储即可:

plain
{
    "cart": [
        {
            "SKUID": 10086,
            "timestamp": 1666513990,
            "count": 2
        },
        {
            "SKUID": 10010,
            "timestamp": 1666513990,
            "count": 10
        }
    ]
}

已登录用户的购物车 ​

对于已经登录的用户的购物车,我们就不能存储在客户端了,因为客户端的数据可能会超时、一旦换了设备也就没有了。我们需要用持久化存储,那么就可以使用数据库和Redis缓存。

如果是使用数据库,那么就直接建表存储就行了,表中主要需要包含user_id、sku_id、count、time_stamp等几个业务字段就可以了。这样每一个加过购物车的用户都有一条记录。

如果使用Redis来保存的话,其实也简单,只需要在上面的未登录用户的购物车的基础上增加一个user_id作为key就行了:

plain
{
    "KEY": 12343123,
    "VALUE": [
         {
            "SKUID": 10086,
            "timestamp": 1666513990,
            "count": 2
        },
        {
            "SKUID": 10010,
            "timestamp": 1666513990,
            "count": 10
        }
    ]
}

使用Redis和数据库存储各有好处:

  1. Redis 性能要比 MySQL 高,响应时间更短,可以支撑更多的并发请求​
  2. MySQL 的数据可靠性是要好于 Redis 的 ,因为 Redis 是异步刷盘,如果出现服务器掉电等异常情况,Redis 是有可能会丢数据的。
  3. MySQL 的另一个优势是,它支持丰富的查询方式和事务机制