面试题答案
一键面试- 数据存储:
- 使用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)。
- 使用Redis的集合(Set)数据结构来存储每个用户浏览过的商品。例如,对于用户群体A中的用户
- 计算交集:
- 为了优化计算交集时的性能,可以先计算每个群体中所有用户浏览商品集合的并集。对于群体A,先将所有用户的商品集合合并为一个临时集合,例如
tempA
,使用SUNIONSTORE tempA userA1:products userA2:products...
(假设有多个用户)。同样,对于群体B,生成临时集合tempB
。 - 然后计算
tempA
和tempB
的交集,得到共同浏览过的商品集合,例如common_products
,使用SINTERSTORE common_products tempA tempB
。最后,删除临时集合tempA
和tempB
,可以使用DEL tempA tempB
。
- 为了优化计算交集时的性能,可以先计算每个群体中所有用户浏览商品集合的并集。对于群体A,先将所有用户的商品集合合并为一个临时集合,例如
- 按热度排序展示:
- 从
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
获取按热度排序的商品及其热度分数列表。
- 从