2020年7月1日
redis排行版
之前就看过相关文章了,好像没记录下来,再复习一遍
利用redis的sorted set
相比set,多了一个score,用来排序。
加数据 :
zadd salary 1000 a;
zadd salary 2000 b;
zadd salary 2000 c;
zadd salary 3000 d;
ZREVRANGE 降序 ZRANGE 升序
ZREVRANGE salary 0 -1 全部
ZREVRANGE salary 0 2 前三
ZREVRANGE salary 0 -1 withscores 全部,带分数
ZREVRANK 降序第几 zrank 升序第几
ZREVRANK salary a; ==> 3
ZREVRANK salary d; ==> 0
ZINCRBY salary 5 a; 加5
根据以上的可以设计排行榜
相同的等级,先完成的排行高。要设计一个分数 = fun(等级, 时间)
1.等级+''+(MAX-时间戳)
long 整数长度总共有 19位,923XXX.......,时间戳 毫秒精度 是 13位,所以只需 14 ~ 19 位存 等级,其他13位存时间。接下来看怎么存。
等级偏移: Math.power(10, 14) = 10000000000000000(14位)
这里有一个最大时间 MAX_TIME = 9999999999999 (13位)
A 玩家,(10 * 等级偏移) + MAX_TIME - 11111111111111( 时间戳),最终分数 10888888888888888
B 玩家,(10 * 等级偏移) + MAX_TIME - 22222222222222( 时间戳),最终分数 10777777777777777
最终排序,A 玩家依然是第一。通过分数可以解析出真实 【等级 = 分数 / 等级偏移,取整】
有人说19位实际只有16位可以用,所以等级最多只是999,可以把时间戳改到秒级别,那会多出来三位,但是有的场景还是不够用。
2.等级+小数点+(MAX-时间戳)
和上面的类似,但是有丢失精度的问题
可以大概看下https://segmentfault.com/a/1190000019139010
以上都只支持两个纬度,时间和等级。并且都有弊端,不知道有没有更合适的方案。