MST

星途 面试题库

面试题:Redis BY选项在复合条件排序中的应用

在Redis有序集合中,成员是商品信息的JSON字符串,包含价格(price)和销量(sales)两个字段。现在要求先按价格从高到低排序,如果价格相同,则按销量从高到低排序,获取排名前20的商品信息。请设计使用Redis BY选项实现该复杂排序规则的方法,说明大致思路并写出关键代码片段(可以用伪代码)。
15.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

大致思路

  1. 将商品信息的JSON字符串作为有序集合的成员,为每个成员设置一个合适的分数。这个分数需要能够综合体现价格和销量的排序需求。可以通过某种计算方式,例如将价格乘以一个较大的系数(保证价格的主导地位),再加上销量来生成分数。
  2. 使用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

在上述代码中:

  1. insert_product函数将商品的JSON字符串插入到有序集合products中,计算并设置合适的分数。
  2. get_top_20_products函数通过zrevrange命令从有序集合中获取分数最高的前20个商品信息(JSON字符串)。