面试题答案
一键面试1. 在Redis中存储权限信息
可以采用哈希(Hash)数据结构来存储用户的权限信息。每个用户作为一个哈希表的key,哈希表的field为频道名称,value则用来表示用户对该频道的权限状态(例如1表示有权限,0表示无权限)。
示例:
HSET user:1 channel:1 1
HSET user:1 channel:2 0
这样,通过HGETALL user:1
就能获取用户1
对所有频道的权限信息。
2. 实现动态权限变更
- 权限变更操作:当用户权限发生变化时,在Redis中更新相应的哈希表。例如,如果用户
1
从不能订阅channel:2
变为可以订阅:
HSET user:1 channel:2 1
- 发布变更通知:为了确保订阅操作的一致性,在更新权限信息后,通过一个特定的Redis频道(例如
permission_change
)发布权限变更的通知。通知内容可以包含变更的用户ID和相关频道信息。
PUBLISH permission_change "user:1 channel:2 1"
3. 确保订阅操作的一致性和安全性
- 订阅端处理:所有订阅逻辑都监听
permission_change
频道。当接收到权限变更通知时,解析通知内容,检查涉及到自身的权限变更。如果是自己权限相关的变更,根据新的权限信息进行订阅或取消订阅操作。 - 事务处理:在更新权限信息和发布变更通知这两个操作之间,可以使用Redis的事务(MULTI - EXEC)来确保原子性,避免在更新权限后但还未发布通知时系统出现不一致状态。
MULTI
HSET user:1 channel:2 1
PUBLISH permission_change "user:1 channel:2 1"
EXEC
- 权限验证:在进行任何实际的消息订阅操作前,再次检查Redis中存储的用户权限信息,确保操作符合最新的权限设置,防止非法的订阅行为。