面试题答案
一键面试一、数据结构设计
- Redis Sorted Set:
- 每个排行榜使用一个Redis Sorted Set数据结构。例如,用户活跃度排行榜可以命名为
user_activity_rank
,内容热度排行榜命名为content_popularity_rank
。 - 在Sorted Set中,成员(member)为用户ID或内容ID,分值(score)则根据具体的业务规则来设定,比如用户活跃度排行榜的分值可以是用户在一定时间内的操作次数,内容热度排行榜的分值可以是内容的点赞数、评论数等加权计算的值。
- 每个排行榜使用一个Redis Sorted Set数据结构。例如,用户活跃度排行榜可以命名为
- 分布式缓存一致性哈希:
- 为了支持分布式环境,采用一致性哈希算法来分配Redis节点。例如使用Consul等工具来管理服务发现和配置,每个Redis节点负责哈希环上的一部分数据。这样当节点数量变化时,只有部分数据需要迁移,减少数据迁移量,保证系统的高可用性和高性能。
二、操作流程
- 数据更新:
- 当用户进行操作(如发布内容、点赞、评论等)时,根据操作类型和相关业务规则,更新对应的排行榜数据。例如,用户发布一篇内容,除了更新内容相关的存储外,还要更新内容热度排行榜的分值。
- 对于用户活跃度排行榜,每次用户操作都要在Redis中使用
ZINCRBY
命令增加对应的用户ID的分值。例如:ZINCRBY user_activity_rank 1 <user_id>
,这里的1
表示每次操作活跃度增加1分。 - 对于内容热度排行榜,假设点赞加10分,评论加5分,当有新点赞时执行
ZINCRBY content_popularity_rank 10 <content_id>
,有新评论时执行ZINCRBY content_popularity_rank 5 <content_id>
。
- 排行榜获取:
- 根据业务需求,使用
ZRANGE
(ASC排序)或ZREVRANGE
(DESC排序)命令获取排行榜。例如,获取用户活跃度排行榜前100名(降序),执行ZREVRANGE user_activity_rank 0 99 WITHSCORES
,获取内容热度排行榜前50名(升序),执行ZRANGE content_popularity_rank 0 49 WITHSCORES
。 - 在分布式环境下,通过一致性哈希算法定位到存储排行榜数据的Redis节点,然后执行相应的命令获取数据。
- 根据业务需求,使用
三、故障处理机制
- 节点故障检测:
- 使用监控工具(如Prometheus + Grafana)实时监控Redis节点的健康状态,包括CPU使用率、内存使用率、网络连接等指标。如果某个节点的指标超出正常范围或者无法连接,标记该节点为故障节点。
- 结合服务发现工具(如Consul),当检测到节点故障时,Consul可以自动将该节点从服务列表中移除,通知其他节点进行相应调整。
- 数据恢复与迁移:
- 对于故障节点上的数据,采用主从复制机制。如果主节点故障,从节点可以晋升为主节点继续提供服务。当故障节点恢复后,可以作为新的从节点加入集群,同步数据。
- 在数据迁移方面,由于采用一致性哈希,当节点故障导致数据迁移时,新节点从原节点复制数据。可以使用Redis的
SYNC
命令(旧版)或PSYNC
命令(新版)进行全量或部分数据同步,减少数据迁移对系统性能的影响。
四、运用ASC和DESC选项满足动态调整需求
- 动态排序需求处理:
- 不同的业务场景可能需要不同的排序方式。例如,在一些活动期间,可能希望展示活跃度增长最快的用户(此时可以根据活跃度增长速度计算分值并使用ASC排序),而在平时则展示总活跃度最高的用户(使用DESC排序)。
- 系统可以根据业务规则的变化,动态选择使用
ZRANGE
(ASC)或ZREVRANGE
(DESC)命令来获取排行榜。例如,在系统配置表中设置一个标志位,用于表示当前排行榜的排序方式。当业务规则变化时,修改这个标志位,获取排行榜的代码根据标志位选择相应的命令。
- 复杂业务规则结合排序:
- 对于复杂的业务规则,比如在内容热度排行榜中,可能需要考虑不同时间段的热度加权。可以根据时间计算出不同的热度权重,然后更新Sorted Set的分值。在获取排行榜时,根据当前业务需求选择ASC或DESC排序。例如,近一周内新发布内容希望按热度升序展示(方便发现潜力内容),使用
ZRANGE
;而长期热门内容则按热度降序展示,使用ZREVRANGE
。通过这种方式,结合动态分值更新和灵活的排序命令选择,满足各种复杂的动态调整需求。
- 对于复杂的业务规则,比如在内容热度排行榜中,可能需要考虑不同时间段的热度加权。可以根据时间计算出不同的热度权重,然后更新Sorted Set的分值。在获取排行榜时,根据当前业务需求选择ASC或DESC排序。例如,近一周内新发布内容希望按热度升序展示(方便发现潜力内容),使用