面试题答案
一键面试思路
- 选择合适的数据结构:对于点赞计数这种频繁读写场景,可使用Redis的
Hash
结构或Sorted Set
结构。- Hash结构:将每个被点赞对象作为Hash的key,点赞用户ID作为field,点赞时间或其他相关信息作为value。例如,对于一篇文章的点赞,文章ID为key,点赞用户ID为field,点赞时间为value。每次点赞时,使用
HSET
命令增加一个field,读取点赞数使用HLEN
命令获取field的数量。 - Sorted Set结构:将被点赞对象作为Sorted Set的key,点赞用户ID作为member,点赞时间戳作为score。每次点赞时,使用
ZADD
命令添加或更新member的score。读取点赞数使用ZCARD
命令获取member的数量。
- Hash结构:将每个被点赞对象作为Hash的key,点赞用户ID作为field,点赞时间或其他相关信息作为value。例如,对于一篇文章的点赞,文章ID为key,点赞用户ID为field,点赞时间为value。每次点赞时,使用
- 减少网络开销:尽量使用批量操作命令。例如在Hash结构中,若一次有多个点赞操作,可以使用
HMSET
来批量设置多个field - value对;在Sorted Set中,ZADD
本身就支持一次添加多个member - score对。 - 利用Redis集群特性:根据被点赞对象的ID进行合理的哈希分片,确保数据均匀分布在各个节点上,避免单个节点压力过大。同时,可利用Redis集群的读写分离机制,对于读操作(如获取点赞数)可从从节点读取,分担主节点压力。
理由
- Hash结构:
- 读写性能高:
HSET
和HLEN
命令时间复杂度分别为O(1),对于频繁的读写操作效率高。 - 内存占用合理:Hash结构在存储大量field - value对时内存利用率较高,适合点赞计数这种一个对象对应多个用户点赞的场景。
- 读写性能高:
- Sorted Set结构:
- 排序功能:如果需要按照点赞时间等维度进行排序展示,Sorted Set天然支持按照score排序,在需要获取热门点赞对象(按点赞时间先后等)时,可使用
ZRANGE
等命令轻松实现。 - 操作原子性:
ZADD
命令保证了添加和更新操作的原子性,适合并发点赞场景。
- 排序功能:如果需要按照点赞时间等维度进行排序展示,Sorted Set天然支持按照score排序,在需要获取热门点赞对象(按点赞时间先后等)时,可使用
- 批量操作:减少网络交互次数,从而提高整体性能。因为网络开销在分布式系统中是影响性能的重要因素,批量操作可显著减少客户端与服务端之间的通信次数。
- 集群特性利用:数据均匀分布可保证集群整体性能稳定,避免出现热点数据导致单个节点性能瓶颈。读写分离机制能有效提高读操作的并发处理能力,适合社交平台点赞计数这种读多写少的场景。