面试题答案
一键面试使用Redis实现基于价格乘以销量排序
- 准备数据:
假设Redis哈希表名为
product_info
,可以使用HSET
命令插入商品信息。例如:
HSET product_info product1 price 10 sales 5
HSET product_info product2 price 5 sales 10
- 使用
SORT
命令结合BY
选项: Redis的SORT
命令可以对列表、集合或有序集合进行排序。对于哈希表中的数据,我们可以借助外部键来实现排序。 首先,我们需要计算每个商品的price * sales
的值,并将其存储在一个新的键中。可以使用Lua脚本来实现这一操作,因为Lua脚本可以在Redis服务器端原子性地执行。 以下是一个简单的Lua脚本示例(假设使用Redis命令行工具的EVAL
命令来执行):
local product_key = KEYS[1]
local price_field = ARGV[1]
local sales_field = ARGV[2]
local result_key = ARGV[3]
local price = tonumber(redis.call('HGET', product_key, price_field))
local sales = tonumber(redis.call('HGET', product_key, sales_field))
local result = price * sales
redis.call('SET', result_key, result)
return result
然后在Redis命令行中执行这个Lua脚本:
EVAL "上述Lua脚本内容" 1 product_info price sales product1_result
对于所有商品都执行类似操作后,我们可以使用SORT
命令结合BY
选项进行排序。假设所有商品的结果键都有类似的命名规则(如productX_result
):
SORT product_info BY *_result DESC
BY *_result DESC
表示按照以_result
结尾的键的值进行降序排序。
处理数据更新后排序结果的动态维护
- 监听数据变化:
可以使用Redis的发布/订阅功能(
PUBLISH
和SUBSCRIBE
)来监听哈希表中价格或销量字段的更新。 当有更新发生时,发布一个消息,例如:
PUBLISH product_updates product1
- 更新排序依据:
在订阅端收到更新消息后,重新执行上述计算
price * sales
并更新结果键的Lua脚本,然后重新执行SORT
命令。这样就可以动态维护排序结果。例如,订阅端收到product1
更新消息后:
EVAL "上述Lua脚本内容" 1 product_info price sales product1_result
SORT product_info BY *_result DESC
通过这种方式,可以实现对哈希表中数据更新后排序结果的动态维护。