如何用对Redis的SortedSet ?
Redis的SortedSet使用double类型的分数(score)来对集合中的元素进行排序。
func (s *Rank) Encode(score int64) float64 {
now := time.Now().Unix()
tmp := float64(100000000) / float64(now)
return float64(score) + tmp
}
float64(100000000) / float64(now)是不是分子分母写颠倒了?
在SortedSet的Encode函数中,time.Now().Unix()返回的是当前时间的Unix时间戳,它表示从格林威治时间1970年01月01日00时00分00秒到当前时间的总秒数。
一年有365个日子,每天有24 * 3600秒,100年是3153600000秒,31.536亿,3.1536E9
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准。 〔链接〕


比如用户得分是1亿分,即1E8。秒超不过1E10,所以score * 1E10 + second可行?
>>> 86548213*t+1767657600 8.654821317676576e+17 >>> 86548213*t+1767657601 8.654821317676576e+17 >>> 86548213*t+1767657602 8.654821317676576e+17
不行啊。
>>> 86548213*1e9+1767657602 8.65482147676576e+16 >> 86548213*1e8+1767657602 8654823067657602.0 >> 1e8/3600/24 1157.4074074074074 >> 1e8/3600/24/365 3.170979198376459 >>> 1767657600/3600/24/365 56.05205479452055
还可以把时间起始点设为游戏上线之日;或时间精度设成分钟(每分钟都创记录?)。
>>> 8e13+1767657602 80001767657602.0 >>> 8e12+1767657602 8001767657602.0 >>> 8e10+1767657602 81767657602.0 >>> 8.1234567e10+1767657602 83002224602.0
len(str(2**64)) = 20,即二进制的64位数是十进制的20位数。
len(str(2**52)) = 16
len(str(3153600000)) = 10

浙公网安备 33010602011771号