首页 > 其他分享 >电商类面试问题--02针对商品排行榜,你是怎么实现的

电商类面试问题--02针对商品排行榜,你是怎么实现的

时间:2023-09-04 21:32:04浏览次数:28  
标签:02 String 排行榜 -- Redis 订单 date 电商 数据

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技术进行批量操作。另外,根据实际情况设置合理的分页查询或限制每次更新的数量,以平衡性能和及时性

喜欢关注一下呀

标签:02,String,排行榜,--,Redis,订单,date,电商,数据
From: https://blog.51cto.com/u_15403127/7360993

相关文章

  • 203. 移除链表元素
    前些日子在翻译论文,检查语法润色啥的。然后跟导师一起修改,前几天终于投了出去,现在可以回到正常的节奏上来了。先看看题吧给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回新的头节点 。示例1:输入:head=[1,2,6,3,4,5,6],va......
  • drf之请求,drf 之响应,drf之响应格式,两个视图基类,基于GenericAPIView,5个视图扩展类
    drf之请求1.1之请求Request类#data#query_params#用起来跟之前一样了解: request._request视图类的方法中:self是咱们写的视图类的对象,self.request是新的request,self.request是一个HttpRequest对象,它提供了许多属性和方法来访问和处理请求的信息.1.2......
  • DOS命令(了解)
    常用的dos命令查看当前目录内容dir切换到其他盘下cd例:切换到c盘cd/Dc:切换到当前盘其他目录下:cdd:\abc2\test200“..”表示上一级目录切换到上一级和切换到根目录均使用cd查看所有子目录tree清屏cls退出DOSexit ......
  • 省选 2023 D1T2 城市建造
    显然地,这\(t\)座城市一定由每个连通块出一座得来,换言之,新修建道路的两城市原来一定不连通。进一步可以想到,若选择了\(u,v\)两座城市且它们连通,则\(u\rightsquigarrowv\)上的所有城市都应被选择。更进一步地可以推出,若选择的城市同属一个点双,则该点双内的所有城市都应被......
  • ES集群搜索稳定性保障
    如果将Elasticsearch(ES)作为线上C端服务的查询引擎,那么searchquery的响应时间则至关重要。因为毕竟面向C端用户,如果一个搜索请求1秒内还未返回,那么用户将不可接受。因此,C端服务对ES的性能稳定性做了许多工程上的优化,比如:强制将索引的段文件设置为1,也即索引中只有一个段文......
  • CMC备赛
    第一部分:知识查漏补缺+经典例题回顾【函数、微分、积分、微分方程、级数、空间解析几何】回忆:证单调有界是证存在极限的常用方法。虽然是按等价无穷小的方法写的但是明显用泰勒展开去想就行了。简单但很好的考察了连续性。简单但容易晕,看清谁是谁的函数。难点。记住第......
  • 小程序可以跨端,那么能实现跨桌面应用小程序吗?
    QtGroup在提及2023年有桌面端应用程序开发热门趋势时,曾经提及三点:关注用户体验:无论您是为桌面端、移动端,还是为两者一起开发应用程序,有一点是可以确定的:随着市场竞争日益激烈,对产品的期望值不断升高,终端用户的标准也在不断提高。简而言之,现在我们需要修缮那些华而不实的东西......
  • 习题纠错06
    表达式"X=A+B(C-D)/E"的后缀表示形式可以是()//答案是CAXAB+CDE/-=BXA+BC-DE/=CXABCD-E/+=DXABCDE+/=//从左到右边遍历这个中缀表达式//X添加到后缀表达式,=入栈,A添加到后缀表达式中//+进入栈,B进入后缀表达式,和(入栈,C进入后缀表达式中//-进入栈,D进入后缀表达式,遇到),-和(出栈......
  • 212 模拟科三
    下午去,晚上七点多回来模拟紧张,发挥不好,一次OK,一次不行(无缘无故变更车道没打转向灯),要记得灯光复位,不要发懵。记得考试流程,这个项目是什么,下个项目又是什么。不要紧张,明天考试好好发挥,一次过!......
  • ELK-windows搭建笔记
    一、        介绍Elasticsearch:开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。Logstash:对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。Kibana:以为Logstash和ElasticSearch提供......