幸运蛋蛋pc开奖
这篇文章主要给大家介绍了关于如何利用redis实现排行榜的小秘诀,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

排行榜作为互联网应用中几乎必不可少的一个元素,其能够勾起人类自身对比的,从而来增加商品的销量。

对于排行榜的需求,redis有一个数据结构非常适合做这件事,那就是?#34892;?#38598;合(sorted set)。

在日常一些简单的活动开发中,我经常会碰到需要对用户的分值等进行排行,此时一般会选择redis的?#34892;?#38598;合对用户的分数进行存储,但是不同的排行榜的方式也略有不同,以下根据自己日常的开发进行了一下归纳总结

Redis ?#34892;?#38598;合(sorted set)

首先简单介绍下什么是?#34892;?#38598;合。

Redis 的Sorted Set 是 String 类型的?#34892;?#38598;合。集合成员是唯一的,这就意味着集?#29616;?#19981;能出现重复的数据。

每个元素都会关联一个double类型的分数。redis正是通过分数来为集?#29616;?#30340;成员进行从小到大的排序。

?#34892;?#38598;合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集?#29616;?#26368;大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

应用

一:用户得分越高,排行越前面

这是一种最简单基本的应用,使用的命令和基本操作如下:

ZADD:添加or更新成员分数

命令参数:ZADD key score member [[score member] [score member] ...]

将一个或多个 member 元素及其 score 值加入?#25509;行?#38598; key 当?#23567;?/p>

如果某个 member 已经是?#34892;?#38598;的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

score 值可以是整数值或双精度浮点数。

如果 key 不存在,则创建一个空的?#34892;?#38598;并执行 ZADD 操作。

当 key 存在但不是?#34892;?#38598;类型时,返回一个错误。

示例:

// 假设用户A(user1)当前游戏的分数为50,则
ZADD user_rank 50 user1 
// 添加用户B(user2)当前游戏的分数为60、用户C(user3)当前游戏的分数为70,则可批量操作
ZADD user_rank 60 user2 70 user3 // 同时添加user2、user3 两个用户的分数,分别为 2、3

ZREVRANK:获取成员当前的排名

命令参数:ZREVRANK key member

返回?#34892;?#38598; key 中成员 member 的排名。其中?#34892;?#38598;成员按 score 值递减(从大到小)排序。

排名以 0 为底,也就是说, score 值最大的成员排名为 0 。

示例:

// 获取用户A当前的排名
ZREVRANK user_rank user1 // user1 当前排名为第三,则输出 2

ZSCORE:获取用户排名

命令参数:ZSCORE key member

返回?#34892;?#38598; key 中,成员 member 的 score 值。

如果 member 元素不是?#34892;?#38598; key 的成员,或 key 不存在,返回 nil 。

示例:

// 获取用户A当前的排名
ZSCORE user_rank user1 // user1 当前分数为50,则输出 "50" #注意返回值是字符串

二:用户游戏中花费的时间最短,排行越前面

这也算一种最简单基本的应用,使用的命令和基本操作和一差不多,除了获取排名的命令不一样之外:

ZRANK:获取成员当前的排名

命令参数:ZRANK key member

返回?#34892;?#38598; key 中成员 member 的排名。其中?#34892;?#38598;成员按 score 值递增(从小到大)顺序排?#23567;?/p>

排名以 0 为底,也就是说, score 值最小的成员排名为 0 。

如何处理以上两个中用户分数相同的情况

如果两个用户score相同,redis如何排序呢

在score相同的情况下,redis使用?#20540;?#25490;序

那什么是?#20540;?#25490;序呢?相信下图就可以解答到这个疑问

在score相同的情况下,redis使用?#20540;?#25490;序,而所谓的?#20540;?#25490;序其实就是“ABCDEFG”、"123456..."这样的排序,在首字母相同的情况下,redis会再比较后面的字母,还?#21069;?#29031;?#20540;?#25490;序

一:用户得分越高,排行越前面,如果分数相同情况下,先达成该分数的用户排前面

下,我们需要更改用户的分数构成,具体思路如下:

    分数相同,用户完成游戏的时间戳也加入到score值的构成中 先达成该分数的用户排前面,?#20174;?#25103;所得分数相同的情况下,时间戳越小,越排前 如果我们简单地把score结构由:分数+''+时间戳 ?#21019;眨?#22240;为分数越大越靠前,而时间戳越小则越靠前,这样两部分的判断规则是相反的,无法简单把两者合成一起成为用户的score 但是我们可以逆向思维,可以用同一个足够大的数MAX减去时间戳,时间戳越小,则得到的差值越大,这样我们就可以把score的结构改为:分数+''+(MAX-时间戳),这样就能我们的需求了 如果使用整数作为score,有一点需要注意的是,js中最大的整数为:

Math.pow(2, 53) - 1 // 9007199254740991 ,16位数

时间戳已经占用了13位数了,因此留给我们保存用户的真正分数的只剩下3位数了

所以最好使用双精度浮点数类型作为score

因此,最好的score结构为:分数+'.'+时间戳,变为浮点数

二:用户完成游戏时间最短,排行越前面,如果完成游戏时间相同情况下,先达到该记录的用户排前面

下,我们也需要更改用户的score构成,具体思路如下:

    完成游戏时间相同,用户完成游戏的时间戳也加入到score值的构成中 游戏时间相同,先达到该记录用户排前面,?#20174;?#25103;所得分数相同的情况下,时间戳越小,越排前 游戏时间越小越靠前,而时间戳越小也越靠前,这样两部分的判断规则是一致的,我们可以把两者合一起?#21019;?#25104;score:分数+'.'+时间戳 即可 则用户score越小,用户排名越前

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对爱安网的支持。

    无相关信息
最新资讯
他一生与声音打交道 63岁还想成就中国版的索尼传奇

他一生与声音打交道 6

“我是当兵出身,战士死在战场最光荣。对我来说做好产品
QuestMobile:6月游戏收入达770.7亿元 同比增长21.5%

QuestMobile:6月游戏

QuestMobile发布2019手机游戏行业半年报告。报告显示,
?#33322;?#31456;:日(J)本(P)的人口现状不能成为中国的未来

?#33322;?#31456;:日(J)本(P)的人口现状

他表示,在日(J)本(P)从年轻人充足到老龄化的同一时期,日(J)本(P)对创
密集布局AI领域!华为再出手

密集布局AI领域!华为再

华为创始人任正非在采访中提到,9月18日,华为将发布昇腾A
金沙江创投:与湖北金沙江资本不存在任何合作关系

金沙江创投:与湖北金沙

金沙江创业投资基金今日发布声明表示,自身与湖北金沙江
周杰伦新歌上线2小时收入破千万 数字音乐爆发在即?

周杰伦新歌上线2小时

9月16日23时,周杰伦发布最新数?#20540;?#26354;《说好不哭》,售价3
最新文章
安装redis(windows和Ubuntu)详解

安装redis(windows和Ub

这篇文章主要介绍了Redis在Ubuntu和Windows下的安装,文
Redis字符串对象实用笔记

Redis字符串对象实用

这篇文章主要给大家介绍了关于Redis字符串对象的相关
Redis精确去重计数方法(咆哮位图)

Redis精确去重计数方

这篇文章主要给大家介绍了关于Redis精确去重计数方法(
在Redis集群中使用pipeline批量插入的实现方法

在Redis集群中使用pip

这篇文章主要介绍了在Redis集群中使用pipeline批量插
Redis实战记录之限制操作频率

Redis实战记录之限制

这篇文章主要给大家介绍了关于Redis实战记录之限制操
redis中热key问题该如何解决

redis中热key问题该如

这篇文章主要给大家介绍了关于redis中热key问题该如何
幸运蛋蛋pc开奖 快乐十分前三直走势 fc二人麻将下载 时时qq群 pk10开奖记录结果 云南快乐十分5月6 安徽麻将大全集 香港挂牌彩图资料大全 足球专家预测 河北11选5预测任三 大乐透手机摇号