MST

星途 面试题库

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

假设MySQL中有一张订单表,包含订单创建日期字段。请阐述如何利用Redis的有序集合来辅助快速查询某一时间段内的订单数据,简要说明设计思路及关键步骤。
29.9万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 订单数据处理:在MySQL订单表中,每当新增订单时,将订单相关信息(如订单ID)以及订单创建日期的时间戳作为有序集合的成员和分数,存入Redis的有序集合。这样,有序集合就按照订单创建日期的时间戳顺序排列。
  2. 查询实现:当需要查询某一时间段内的订单数据时,通过该时间段对应的时间戳作为范围,在Redis有序集合中快速获取符合条件的订单ID。然后,利用这些订单ID在MySQL订单表中查询完整的订单数据。

关键步骤

  1. 数据插入
    • 在MySQL订单表插入新订单后,获取订单ID和订单创建日期的时间戳。
    • 使用Redis的ZADD命令将订单ID作为成员,时间戳作为分数添加到有序集合中。例如,在Python中使用redis - py库:
    import redis
    r = redis.Redis(host='localhost', port=6379, db = 0)
    order_id = 123  # 假设的订单ID
    timestamp = 1680000000  # 假设的订单创建日期时间戳
    r.zadd('order_timestamp_set', {order_id: timestamp})
    
  2. 范围查询
    • 获取需要查询的时间段的起始时间戳和结束时间戳。
    • 使用Redis的ZRANGEBYSCORE命令获取该时间范围内的订单ID。例如,在Python中:
    start_timestamp = 1680000000
    end_timestamp = 1680000100
    order_ids = r.zrangebyscore('order_timestamp_set', start_timestamp, end_timestamp)
    
  3. MySQL查询
    • 将在Redis中获取的订单ID作为条件,在MySQL订单表中查询完整的订单数据。例如,在Python中使用pymysql库:
    import pymysql
    conn = pymysql.connect(host='localhost', user='root', password='password', database='test')
    cursor = conn.cursor()
    order_id_list = [int(id.decode('utf - 8')) for id in order_ids]
    placeholders = ', '.join(['%s'] * len(order_id_list))
    query = f"SELECT * FROM orders WHERE order_id IN ({placeholders})"
    cursor.execute(query, order_id_list)
    results = cursor.fetchall()
    conn.close()