面试题答案
一键面试实现方式
- 定义用户角色:在系统中明确区分普通用户和管理员用户两种角色。
- 权限关联:将角色与频道订阅权限关联起来,普通用户关联公开频道,管理员用户关联所有频道。
Redis相关操作与数据结构
- 频道管理:
- 数据结构:可以使用Redis的集合(Set)来存储频道信息。例如,使用一个名为
all_channels
的Set存储所有频道名称。公开频道可以存储在一个名为public_channels
的Set中。 - 操作:
- 添加频道:使用
SADD all_channels <channel_name>
将新频道添加到所有频道集合,对于公开频道使用SADD public_channels <channel_name>
。
- 添加频道:使用
- 数据结构:可以使用Redis的集合(Set)来存储频道信息。例如,使用一个名为
- 用户角色与权限管理:
- 数据结构:使用哈希表(Hash)来存储用户角色信息。例如,
user_role:{user_id}
的Hash结构,其中role
字段的值为admin
或user
,分别表示管理员和普通用户。 - 操作:
- 设置用户角色:
HSET user_role:{user_id} role admin
设置用户为管理员角色,HSET user_role:{user_id} role user
设置为普通用户角色。
- 设置用户角色:
- 数据结构:使用哈希表(Hash)来存储用户角色信息。例如,
- 订阅控制:
- 数据结构:当用户订阅频道时,可以使用有序集合(Sorted Set)来记录订阅关系。例如,
subscriptions:{user_id}
的Sorted Set,成员为频道名称,分数可用于记录订阅时间等信息(如果有需要)。 - 操作:
- 普通用户订阅:
- 先通过
HGET user_role:{user_id} role
获取用户角色,确认是普通用户后,使用SMISMEMBER public_channels <channel_name>
检查频道是否为公开频道,若是则使用ZADD subscriptions:{user_id} <score> <channel_name>
进行订阅。
- 先通过
- 管理员用户订阅:
- 通过
HGET user_role:{user_id} role
确认是管理员角色后,直接使用ZADD subscriptions:{user_id} <score> <channel_name>
订阅任意频道,因为管理员可订阅所有频道。
- 通过
- 普通用户订阅:
- 数据结构:当用户订阅频道时,可以使用有序集合(Sorted Set)来记录订阅关系。例如,