MST

星途 面试题库

面试题:Redis有序集合如何辅助MySQL进行范围查询

请阐述在《Redis有序集合加速MySQL范围查询操作》场景下,Redis有序集合的数据结构特点以及如何利用这些特点帮助MySQL更高效地执行范围查询,举例说明常用的映射关系建立方式。
47.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis有序集合的数据结构特点

  1. 有序性:Redis有序集合中的每个元素都关联一个分数(score),集合会根据这个分数对元素进行从小到大排序。例如,在存储学生成绩的有序集合中,每个学生(元素)对应一个成绩(score),这样就可以按成绩对学生进行排序。
  2. 唯一性:集合中的每个元素都是唯一的,不会出现重复元素。以用户ID存储在有序集合为例,每个用户ID只会出现一次。
  3. 可重复性分数:不同的元素可以拥有相同的分数。比如在一场比赛中,可能有多个选手获得相同的积分(score)。

如何利用这些特点帮助MySQL更高效地执行范围查询

  1. 缓存热点数据:将MySQL中经常查询的范围数据提前加载到Redis有序集合中。例如,电商网站中经常查询某个价格区间内的商品,将商品ID及其价格(作为score)存储到Redis有序集合。当有查询请求时,先从Redis中查找,若存在则直接返回,减少对MySQL的压力。
  2. 快速定位范围:利用有序集合按分数排序的特点,通过ZRANGEBYSCORE等命令可以快速定位到指定分数范围内的元素。假设MySQL中有一个订单表,记录了订单金额,我们可以将订单ID和订单金额(score)存储在Redis有序集合。当需要查询某个金额区间的订单时,通过Redis的ZRANGEBYSCORE命令迅速获取符合条件的订单ID,再根据这些ID到MySQL中获取完整的订单信息,避免在MySQL中进行全表扫描。

常用的映射关系建立方式举例

  1. 直接映射:以MySQL表中的主键作为Redis有序集合的元素,以需要查询的字段值作为score。例如,在一个员工表中,以员工ID作为有序集合的元素,以员工工资作为score。这样就可以方便地通过工资范围查询员工ID。
import redis

r = redis.Redis(host='localhost', port=6379, db=0)
# 假设员工ID为1,工资为5000
r.zadd('employees:salary', {1: 5000})
  1. 复合映射:当查询条件涉及多个字段时,可以将多个字段组合成一个值作为score。例如,在一个商品表中,查询既要考虑价格又要考虑销量。可以将价格乘以一个较大的系数(保证价格的影响权重)再加上销量作为score,商品ID作为元素。
# 假设商品ID为100,价格为100,销量为50
price = 100
sales = 50
score = price * 1000 + sales
r.zadd('products:price_sales', {100: score})