关于后端:电商类面试问题02针对商品排行榜你是怎么实现的

34次阅读

共计 1882 个字符,预计需要花费 5 分钟才能阅读完成。

02- 针对商品排行榜,你是怎么实现的

背景形容

过后产品提出了每日热销排行榜在零点进行变更的需要。在我接到这个需要后,我立刻想到了应用 Redis 的有序汇合(ZSET)来实现这个性能,并与咱们的技术负责人进行了沟通。

通过与技术负责人的探讨和确认,咱们统一认为应用有序汇合是一个可行的解决方案。因而,我进行了技术评审,并失去了批准开始施行该计划。

在实现过程中,我应用了 Redis 的有序汇合数据结构来存储和排序商品销量信息。具体而言,我将日期作为有序汇合的 key,商品 ID 作为成员(member),销售数量作为分值(score)。每当有订单数据更新时,我通过调用 ZINCRBY 命令来减少对应商品的销售数量。这样,在每天零点之前,所有的订单数据会被累积到有序汇合中。

至于定时更新排行榜数据的性能,我采纳了 Spring Boot 提供的定时工作注解(@Scheduled)来指定每天零点执行更新操作。在定时工作中,我首先删除前一天的排行榜数据,而后依据最新的订单数据从新生成排行榜。

代码实现

// 记录订单数据
public void recordOrderData(String date, String productId, int quantity) {
    // 更新有序汇合中对应商品的销售数量
    redisTemplate.opsForZSet().incrementScore("daily_ranking_" + date, productId, quantity);
}

// 查问每日商品销量排行榜
public List<String> getDailyRanking(String date, int topN) {
    // 获取分值最高的成员,即销量最高的商品 ID
    Set<String> members = redisTemplate.opsForZSet().reverseRange("daily_ranking_" + date, 0, topN - 1);
    return new ArrayList<>(members);
}

// 定时工作更新排行榜数据(程序员 fly)@Scheduled(cron = "0 0 0 * * ?") // 每天零点执行
public void updateDailyRanking() {String date = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyyMMdd")); // 昨天的日期
    String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); // 明天的日期

    // 革除前一天的排行榜数据
    redisTemplate.delete("daily_ranking_" + date);

    // 依据最新的订单数据从新生成排行榜(程序员 fly)// 假如从数据库或缓存中获取当日的订单数据,并依据订单数据更新有序汇合的分值
    List<Order> orders = orderService.getOrdersByDate(today);
    for (Order order : orders) {String productId = order.getProductId();
        int quantity = order.getQuantity();
        recordOrderData(today, productId, quantity);
    }
}

上述代码示例中,在实现每日热销排行榜的性能时,应用了 Redis 有序汇合来存储和排序商品销量信息。对应的办法包含:

  • recordOrderData:用于记录订单数据,并通过调用 incrementScore 命令更新对应日期的有序汇合中商品的销售数量。
  • getDailyRanking:查问每日商品销量排行榜,并通过调用 reverseRange 命令获取分值最高的成员(即销量最高的商品 ID)。
  • updateDailyRanking:定时工作,在每天零点执行。其中,革除前一天的排行榜数据后,依据最新的订单数据从新生成排行榜。

扩大点

  1. 分布式锁:在多个节点同时执行定时工作时,应用分布式锁来防止并发拜访的问题。能够应用 Redis 的分布式锁机制(如 RedLock),通过加锁和解锁操作来管制并发拜访,避免重复记录或更新排行榜。
  2. 性能优化:如果每天的订单数据量较大,能够思考对数据进行批量解决,缩小与 Redis 的交互次数。例如,能够在一次操作中记录多个订单数据,或者应用 Redis 的 pipeline 技术进行批量操作。另外,依据理论状况设置正当的分页查问或限度每次更新的数量,以均衡性能和及时性

正文完
 0