面试题答案
一键面试大致思路
- 将商品信息的JSON字符串作为有序集合的成员,为每个成员设置一个合适的分数。这个分数需要能够综合体现价格和销量的排序需求。可以通过某种计算方式,例如将价格乘以一个较大的系数(保证价格的主导地位),再加上销量来生成分数。
- 使用Redis的
ZRANGEBYSCORE
命令,并结合BY
选项,通过自定义的分数计算方式来获取排序结果。由于Redis原生的BY
选项不能直接处理JSON格式数据,我们需要在客户端计算好分数后再插入到有序集合。
关键代码片段(伪代码)
假设我们使用Python和Redis-py库:
import redis
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 插入商品信息到有序集合
def insert_product(product_json):
import json
data = json.loads(product_json)
price = data['price']
sales = data['sales']
# 计算分数,这里假设价格乘以1000再加上销量
score = price * 1000 + sales
r.zadd('products', {product_json: score})
# 获取排名前20的商品信息
def get_top_20_products():
# 获取有序集合中分数最高的20个成员
top_20 = r.zrevrange('products', 0, 19)
return top_20
在上述代码中:
insert_product
函数将商品的JSON字符串插入到有序集合products
中,计算并设置合适的分数。get_top_20_products
函数通过zrevrange
命令从有序集合中获取分数最高的前20个商品信息(JSON字符串)。