MST

星途 面试题库

面试题:Redis集合交集计算在复杂业务场景中的优化

在电商推荐系统中,有两个用户群体A和B,每个群体都有大量用户,并且每个用户都关联了一个商品集合,表示他们浏览过的商品。现在要找出这两个用户群体共同浏览过的商品,并对这些商品按热度进行排序展示。请设计一个基于Redis集合命令的解决方案,同时考虑如何优化计算交集时的性能,以及如何高效地获取商品热度数据。
50.4万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 数据存储
    • 使用Redis的集合(Set)数据结构来存储每个用户浏览过的商品。例如,对于用户群体A中的用户userA1,将其浏览过的商品集合存储为userA1:products,使用SADD userA1:products product1 product2 product3这样的命令。同样,对于用户群体B中的用户userB1,存储为userB1:products
    • 为了获取商品热度数据,可以使用Redis的有序集合(Sorted Set)。假设商品热度通过浏览次数衡量,将商品及其浏览次数存储在一个有序集合中,例如product:popularity,使用ZADD product:popularity 10 product1(表示product1的热度为10)。
  2. 计算交集
    • 为了优化计算交集时的性能,可以先计算每个群体中所有用户浏览商品集合的并集。对于群体A,先将所有用户的商品集合合并为一个临时集合,例如tempA,使用SUNIONSTORE tempA userA1:products userA2:products...(假设有多个用户)。同样,对于群体B,生成临时集合tempB
    • 然后计算tempAtempB的交集,得到共同浏览过的商品集合,例如common_products,使用SINTERSTORE common_products tempA tempB。最后,删除临时集合tempAtempB,可以使用DEL tempA tempB
  3. 按热度排序展示
    • common_products集合中获取共同浏览过的商品列表,使用SMEMBERS common_products
    • 对于每个商品,从product:popularity有序集合中获取其热度分数,使用ZSCORE product:popularity product_name
    • 在客户端代码中,根据获取到的热度分数对商品进行排序展示。例如,在Python中可以使用sorted函数,假设有一个商品及其热度分数的字典product_popularity_dict
    sorted_products = sorted(product_popularity_dict.items(), key=lambda item: item[1], reverse=True)
    for product, popularity in sorted_products:
        print(f"商品: {product}, 热度: {popularity}")
    
    • 另一种优化方式是,如果数据量较大,可以在Redis中进行排序。先将common_products中的商品及其热度分数重新插入到一个新的有序集合common_products_sorted中,使用循环遍历common_products中的商品,对于每个商品product,执行ZADD common_products_sorted [ZSCORE product:popularity product] product。然后使用ZRANGE common_products_sorted 0 -1 WITHSCORES获取按热度排序的商品及其热度分数列表。