MST

星途 面试题库

面试题:Redis数据结构在高并发场景下的选型优化

在一个高并发的秒杀系统中,要记录参与秒杀的用户ID,防止重复参与,并且需要统计实时参与人数。从Redis数据结构角度出发,你会如何设计?如果同时要记录用户的参与时间,又该如何优化数据结构选型,以达到高效读写的目的?
13.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 仅记录用户ID并统计实时参与人数
    • 数据结构选型:使用Redis的Set数据结构。
    • 理由:Set数据结构具有自动去重的特性,非常适合用于记录唯一的用户ID,防止重复参与。同时,可以使用 SCARD 命令获取Set中元素的数量,即实时参与人数。例如,在Java中使用Jedis客户端:
Jedis jedis = new Jedis("localhost");
jedis.sadd("seckill_users", "user1_id");
jedis.sadd("seckill_users", "user2_id");
Long count = jedis.scard("seckill_users");
System.out.println("实时参与人数: " + count);
  1. 同时记录用户的参与时间
    • 数据结构选型:使用Redis的Sorted Set数据结构。
    • 理由:Sorted Set可以为每个成员(用户ID)关联一个分数(参与时间的时间戳)。这样既可以利用Set的去重特性防止重复参与,又能通过分数记录用户的参与时间。对于读取操作,可以根据分数范围获取在特定时间范围内参与的用户。写入时,使用 ZADD 命令将用户ID和当前时间戳(作为分数)添加到Sorted Set中。例如,在Python中使用redis - py客户端:
import redis
import time

r = redis.Redis(host='localhost', port=6379, db = 0)
user_id = 'user3_id'
timestamp = time.time()
r.zadd('seckill_users_with_time', {user_id: timestamp})
  • 读取操作示例:获取所有用户及其参与时间(按参与时间排序),在Python中:
users_with_time = r.zrange('seckill_users_with_time', 0, -1, withscores=True)
for user, timestamp in users_with_time:
    print(f"用户 {user.decode('utf - 8')} 参与时间: {timestamp}")