MST

星途 面试题库

面试题:Redis中ASC和DESC选项在动态数据更新场景下的策略应用

在一个实时的排行榜应用中,使用Redis Sorted Set来维护用户的积分排名。积分会实时更新,要求你阐述如何根据积分的增减,合理运用ASC和DESC选项动态调整排行榜顺序,同时保证在高并发情况下数据的一致性和性能,需要结合具体的操作命令和可能遇到的问题进行说明。
23.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

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 中。