如何高效查询Redis中指定后缀键并统计所有用户钱包总余额
匹配后缀键统计余额的实现方式
你可以通过Redis的模式匹配能力查询所有以-current-balance结尾的键,实现方式和注意事项如下:
- 测试/小数据量场景:可以直接使用
KEYS *-current-balance命令一次性获取所有符合规则的键,再逐个调用GET命令获取数值累加即可。注意:该命令会遍历Redis全量键空间,执行期间会阻塞Redis主线程,生产环境绝对禁止使用。 - 生产环境场景:使用
SCAN命令增量迭代匹配键,示例命令为SCAN 0 MATCH *-current-balance COUNT 100,循环调用该命令直到返回的游标为0,即可拿到所有符合规则的键,再批量获取对应值累加。这种方式不会长时间阻塞Redis,但是如果用户量级较大,统计耗时会比较长,且多次和Redis交互也会产生额外开销。
更优的实现方案
针对全量余额总和统计的场景,有几种性能和实用性更强的实现方案:
原子总计数器方案
新增一个专门的Redis键total-user-balance存储全量用户余额总和,每次用户余额发生变更(充值、消费、退款等)时,在更新对应用户的{user_id}-current-balance的同时,使用INCRBY/DECRBY命令原子更新总计数器的数值。需要获取总和时直接GET total-user-balance即可,时间复杂度为O(1),是性能最优的方案。
可以定期(比如每日低峰期)执行全量余额扫描校验,修正总计数器因极端异常(比如用户余额更新成功但总计数器更新失败)产生的偏差即可。哈希表集中存储方案
将所有用户的余额统一存入一个Redis哈希结构中,哈希键设为user-balance-collection,哈希的field为用户ID,value为对应用户的余额。单用户余额查询时使用HGET user-balance-collection {user_id},性能和原独立键方案基本持平;统计总和时可以用HVALS user-balance-collection一次性拿到所有用户余额再累加,比扫描大量独立键的效率高很多。预计算定时落地方案
如果业务对余额总和的实时性要求不高,可以部署定时任务(比如每10分钟执行一次),在低峰期用SCAN扫描全量余额键计算总和,将结果存入专门的统计键中,业务侧直接读取预计算的结果即可,避免每次查询都扫描全量数据。
内容的提问来源于stack exchange,提问作者Emekarr
相关产品推荐
相关产品推荐

