面试题3

一、redis的底层数据结构是什么?

  • 跳表

二、mysql底层数据结构是什么?

  • b+树

三、为什么redis底层数据结构用跳表,而mysql底层数据结构用的是b+树?

  • 跳表和b+树的查询复杂度都是O(logn),查询效率都差不多,核心问题是:redis的数据是存储在缓存中且数据量不是特别大,不用担心zset中跳表的行高,但是数据库不行,如果数据库中用跳表,如果说数据库数据量特别大的情况下,此时行高会特别高,这个时候的话,就是IO次数会急剧增加,相应查询相率也会出现啊急剧下降,这个问题的核心是我们在用跳表的情况下,存放的数据量大的话,它的行高会特别高,增加IO次数?

二、自述电商项目下单流程(业务)

  • 正向操作:它的流程有确认订单,下单支付,支付回调,订单发货,确认收货,评价等操作

  • 逆向操作:它的流程有退款退货,退款换货,取消订单(手动取消和自动取消)

  1. 订单是如何算钱的?
  • 单个商品下单是比较简单的
  • 多个商品放在购物车里并进行算优惠的时候会相当复杂的一个过程:会出现优惠卷的问题,比如a优惠卷(折扣卷),它支持商品1、商品2,然后b优惠卷是一张满减卷,它也支持商品1和商品3,这时候需要一张最优的优惠卷,然后怎么去选择优惠,然后使用完优惠卷后是否可以叠加使用积分呢? 还有这个商品参加了优惠活动这个又将去怎么办,比如存在区域价和满减活动,然后它是以优惠卷和积分满减后的金额去算活动门槛,还是以商品原价去算活动门槛,还有一个是折扣卷和满减活动它打折的情况下,如果说出现除不尽的情况,精度丢失,计算的时候会出现很多问题。
  1. 实验方案
  • 业务要求里面是有一个计算顺序的,先计算优惠卷,以优惠卷后的金额计算积分,在以优惠卷和积分后的有优惠金额去计算活动门槛。
  • 怎么去计算优惠卷的? 先计算满减卷里面的最优的优惠卷,然后在计算折扣卷里面的最优优惠卷,将这二个优惠卷进行对比,对比出来优惠力度最大的就是那个最优的优惠卷。
  • 满减的优惠卷是比较好算的,只需要将满足门槛的所有满减优惠卷都给筛查出来,通过倒排取,第一个优惠力度最大的钱就行了
  • 折扣要难算一些,具体优惠金额是依赖于商品原价的,这个时候就需要将所有满足门槛的折扣卷全部取出来,然后通过一个个的通过计算,算出所有的折扣卷给他优惠的金额,然后取出优惠力度最大的那个,这个时候和满减的那个优惠卷进行一次比较,这样就可以算出来需要选择哪一个了。
  • 然后在根据优惠户的金额再去算积分,然后再以优惠卷和积分的优惠后的金额去算活动门槛,还存在精确丢失的问题,当我们折扣后会有一个累计,每一个商品优惠多少钱,有个汇总,到最后一个商品的时候,我们会用汇总的优惠金额直接按比例分摊给最后一个商品,其中还会有一个问题,当我们最后的一个商品的价格特别小,比如是0.01,分给的金额可能是0.02,这是因为前面的商品精度丢失,这个时候的商品价格算出来可能就是一个负数,然后我们会对商品做出一个正排在去做计算,这样会避免这个精度丢失的问题。
posted @ 2024-04-21 15:44  牛奶配苦瓜  阅读(9)  评论(0)    收藏  举报