面试题答案
一键面试1. Redis Sorted Set 基础
Redis Sorted Set 是一种有序集合,每个成员都关联一个分数(score),通过分数来为集合中的成员进行从小到大排序。
2. 积分增加
- 操作命令:使用
ZINCRBY
命令,例如:ZINCRBY leaderboard 10 user1
,表示给user1
的积分增加 10 分。这里leaderboard
是 Sorted Set 的键名。 - 排序调整:如果希望按照积分从高到低(即 DESC 顺序)展示排行榜,无需额外操作,因为
ZINCRBY
命令会自动更新分数并重新排序。
3. 积分减少
- 操作命令:同样使用
ZINCRBY
命令,只不过增加的分数为负数,例如:ZINCRBY leaderboard -5 user1
,表示给user1
的积分减少 5 分。 - 排序调整:同样,如果是按 DESC 顺序展示排行榜,Redis 会自动处理分数变化并重新排序。
4. 高并发下的数据一致性
- 使用事务(MULTI - EXEC):可以将多个相关操作放到一个事务中,确保要么所有操作都执行,要么都不执行。例如:
MULTI
ZINCRBY leaderboard 10 user1
ZINCRBY leaderboard -5 user2
EXEC
- 乐观锁:可以使用
WATCH
命令来实现乐观锁机制。在执行事务前,先WATCH
相关的键。如果在WATCH
之后,被监控的键被其他客户端修改,那么当前事务会被取消。例如:
WATCH leaderboard
MULTI
ZINCRBY leaderboard 10 user1
ZINCRBY leaderboard -5 user2
EXEC
5. 高并发下的性能
- 批量操作:尽量减少客户端与 Redis 服务器之间的交互次数。可以将多个
ZINCRBY
操作合并成一次事务执行。 - 合理设置过期时间:如果排行榜数据有一定的时效性,可以为键设置过期时间,避免数据长期占用内存。使用
EXPIRE
命令,例如:EXPIRE leaderboard 3600
,表示leaderboard
这个键在 3600 秒后过期。
6. 可能遇到的问题及解决
- 分数精度问题:Redis 中 Sorted Set 的分数是 64 位浮点数,在一些对精度要求极高的场景下,可能会出现精度丢失。可以考虑将分数放大一定倍数(如乘以 10000)后存储,在展示时再进行还原。
- 内存占用:随着用户数量增多,Sorted Set 占用的内存也会增加。可以定期清理无效用户,或者采用分区的方式,将排行榜数据分散到多个 Sorted Set 中。