面试题答案
一键面试设计思路
- 用户活跃度统计:使用Redis的SETBIT命令记录用户每天的活跃情况,将用户ID作为key,日期作为偏移量,活跃则设置为1,不活跃设置为0。这样可以高效地利用空间,并且方便进行按天、按月等时间维度的统计。
- 关联额外用户信息:选择Hash数据结构来存储每个用户的额外信息,以用户ID作为key,Hash的field - value对存储具体的用户信息,如用户名、邮箱等。
数据结构选择原因
- SETBIT:
- 空间效率高:对于每个用户每天的活跃状态,只需1 bit来表示,在处理大量用户和长时间跨度的数据时,空间占用极小。
- 时间复杂度低:SETBIT和GETBIT操作的时间复杂度均为O(1),能快速记录和查询用户的活跃状态。
- Hash:
- 灵活性:可以方便地对用户的不同属性进行增删改查操作,每个用户的信息以key - field - value的形式存储,易于管理。
- 数据结构紧凑:相比其他结构,Hash在存储多个相关属性时,结构更为紧凑,减少了内存开销。
具体操作逻辑
- 记录用户活跃状态:
- 每天用户活跃时,使用SETBIT命令,例如:
SETBIT user:active:{user_id} {offset} 1
,其中{user_id}
是具体的用户ID,{offset}
可以通过将日期转换为对应的偏移量(例如从某个起始日期开始计算天数作为偏移量)。
- 每天用户活跃时,使用SETBIT命令,例如:
- 存储和查询用户额外信息:
- 存储:使用HSET命令,如
HSET user:info:{user_id} username {username} email {email}
,将用户的用户名和邮箱等信息存储到Hash结构中。 - 查询:使用HGETALL命令获取用户的所有额外信息,如
HGETALL user:info:{user_id}
,返回该用户的所有field - value对。
- 存储:使用HSET命令,如
- 活跃度统计:
- 按天统计活跃用户数:遍历所有用户的SETBIT数据,使用GETBIT获取每个用户当天的活跃状态,统计值为1的数量。
- 按月统计活跃天数:根据日期对应的偏移量范围,例如一个月的天数对应的偏移量范围,对每个用户的SETBIT数据进行GETBIT操作并统计值为1的数量。