面试题答案
一键面试设计思路
- 订单数据处理:在MySQL订单表中,每当新增订单时,将订单相关信息(如订单ID)以及订单创建日期的时间戳作为有序集合的成员和分数,存入Redis的有序集合。这样,有序集合就按照订单创建日期的时间戳顺序排列。
- 查询实现:当需要查询某一时间段内的订单数据时,通过该时间段对应的时间戳作为范围,在Redis有序集合中快速获取符合条件的订单ID。然后,利用这些订单ID在MySQL订单表中查询完整的订单数据。
关键步骤
- 数据插入:
- 在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})
- 范围查询:
- 获取需要查询的时间段的起始时间戳和结束时间戳。
- 使用Redis的
ZRANGEBYSCORE
命令获取该时间范围内的订单ID。例如,在Python中:
start_timestamp = 1680000000 end_timestamp = 1680000100 order_ids = r.zrangebyscore('order_timestamp_set', start_timestamp, end_timestamp)
- 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()
- 将在Redis中获取的订单ID作为条件,在MySQL订单表中查询完整的订单数据。例如,在Python中使用