应用场景就是 游戏中玩家与玩家PK,排名低的人如果赢了,就直接插入到排名高的人前面。 相应受影响的人排名都后移。
https://github.com/yueyoum/redis-lua-scripts
在 github 中有详细说明。
也欢迎大家提供不同解决办法!
给每个人一个值,用来做排序用,PK 赢的人,将他的值改成被 PK 赢的人和他之前那个人的值平均,比如初始:
A B C D E F
0 10 20 30 40 50
然后 E 赢了 C,E 的值就变成了 (B+C)/2 = 15
A B C D E F
0 10 20 30 15 50
如果多次 PK 出现值平均重复的话,可以指定前后 N 个数据重分隔出固定的空间。
好处是,实现简单,对 PK 赢的人,只用改动一个值,用数据库排序就能解决,不需要 NoSQL。 考虑到大数据量,可以添加一个分组表,平均 N 个人分为一组。
没太理解,其实我的第一版和你这个比较像,但有下面的问题:
如果再来一轮,F 赢了 C,那么 此时就是
A B C D E F 0 10 20 30 15 15
那么此时 E 和 F 如何排序?
出现这种情况的概率非常高,不用多次,只要两次 就行。
#12 楼 @quakewang 恩,不错的思路。
我刚开始 也是每个人都附带一个积分,但发现每过一段时间 需要 重新把所有人的积分按照当时排名要 normalize 一遍,觉得麻烦,所以后来就想了其他办法。不用维护