incr+zadd+小根堆,实现简易topK榜单

image.png

很容易想到使用redis的zset来做。为了能保证用户分数安全的并发累加,配合使用incr操作(每个贡献用户占一个key)。逻辑如下:


image.png

如果能保证参与的用户不会很多,zset不会过大就可以每次直接zadd。

如果参与的人很多,但业务只关心头部的少量用户,就可以在每台容器上,维护一个本地top3,能够进入的用户,才会执行zadd更新。逻辑如下:


image.png

同时进行很多个pk赛,要维护多个小根堆:


image.png

以上逻辑尽可能的不编辑lua脚本,redis操作时,少了原子性:

并发度特别高时,可能前incr操作后的分数,后计入zset了。(但用户后续更新时,能恢复。)

你可能感兴趣的:(incr+zadd+小根堆,实现简易topK榜单)