很容易想到使用redis的zset来做。为了能保证用户分数安全的并发累加,配合使用incr操作(每个贡献用户占一个key)。逻辑如下:
image.png
如果能保证参与的用户不会很多,zset不会过大就可以每次直接zadd。
如果参与的人很多,但业务只关心头部的少量用户,就可以在每台容器上,维护一个本地top3,能够进入的用户,才会执行zadd更新。逻辑如下:
image.png
同时进行很多个pk赛,要维护多个小根堆:
image.png
以上逻辑尽可能的不编辑lua脚本,redis操作时,少了原子性:
并发度特别高时,可能前incr操作后的分数,后计入zset了。(但用户后续更新时,能恢复。)
网友评论