我的编程空间,编程开发者的网络收藏夹
学习永远不晚

redis如何实现排行榜

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

redis如何实现排行榜

这篇文章将为大家详细讲解有关redis如何实现排行榜,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1 前言

实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了。但是这样真的优雅吗?

数据库是系统的瓶颈,这是众所周知的。如果给你一张百万的表,让你排序做排行榜,花费的时间是十分可怕的。

不如缓存吧,order by的时候强制使用索引。但是这样真的优雅吗?

2 Redis的排行榜

我们分析一下排行榜,一个用户一个排名,意味着要去重,这时我们会想到Java的一种数据结构Set。不过Set又是无序的。有没有一种结构是可以保住元素唯一以及有序的呢。

幸运的是,还真的有。Redis的ZSet的就是这样的一种数据结构。Zset里面的元素是唯一的,有序的,按分数从小到大排序。作为一名优秀的crud程序员,我们从这几个方方面入手了解zset结构。

2.1 ZADD 增加与修改

其时间复杂度为 O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量。如果key不存在就插入,存在就更新。

使用如下:

redis> ZADD page_rank 10 google.com
(integer) 1

说明:

page_rankde 是key,10是分数,google.com是value

2.2 ZRANK 查询

时间复杂度: O(log(N))

使用如下:

redis> ZRANGE salary 0 -1    # 显示所有成员
1) "peter"
2) "tom"
3) "jack"


redis> ZRANK salary tom    # 显示 tom 的薪水排名,第二
(integer) 1

说明:

salary的key,tom是value,只要输入特定的key与value就能查询到对应的排名。

2. del 删除

直接使用redis的del命令

3 分数设计

回到排行榜的实现,要利用zset结构来实现的话,重要的是如何设计分数。分析一下排行榜单的设计。如果排行榜的设计按一个维度比如金币数量,那只需把其数量取反作为分数score即可。取反是因为zset默认从小到大排序。

实现如下:

public Double getScore( Long oneDayGoldBean) {
  String score = String.valueOf(oneDayGoldBean);
  return -Double.valueOf(score);
}

如果排行榜的设计按两个维度比如金币数量和用时。由于score是一个可以double类型的参数,设计的时候可以把用时作为小数,用一天的总毫秒数减去花费毫秒数作为小数部分,然后当做字符串拼接起来,然后取反作为score.

实现如下:

public Double getScore( Long oneDayGoldBean, Long useTime) {
  String value1 = String.valueOf(oneDayGoldBean/1.0);
  long todayEndSS = getTodayEndSS(useTime);
  String value2 = String.valueOf(todayEndSS);
  String score =value1+value2;
  return -Double.valueOf(score);
}

private long getTodayEndSS(long current){
  //今天零点零分零秒的毫秒数
  long zero = 0L;
  //今天23点59分59秒的毫秒数
  long twelve = zero + 24 * 60 * 60 * 1000;
  return (twelve - current) / 1000;
}

4 代码实现

@Override
public boolean insertLeaderboard() {
  Double score = getScore(100l, 1000l);
  return redisTemplate.opsForZSet().add("leaderboard", "1", score);
}

@Override
public Set checkLeaderboard() {
  // 0 -1 表示返回所有的value的set值
  return redisTemplate.opsForZSet().range("leaderboard", 0, -1);
}

关于“redis如何实现排行榜”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

redis如何实现排行榜

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中redis怎么实现排行榜

Redis排行榜实现排行榜是实时展示排名信息的常用数据结构。Redis提供了SortedSet和Stream两种方法实现排行榜。SortedSet使用SortedSet按分数排序元素,分数表示排名。通过ZINCRBY增加排名,ZREVRANGE按降序获取排名。Stream使用Stream记录排名变化。通过XADD编写排名记录,XREVRANGE按降序获取排名。优势高性能数据结构丰富实时性扩展性持久化局限性竞争条件数据一致性资源消耗最佳实践使用合理的排名分数使用Lua脚本进行原子更新实施缓存机制监控性能遵循
java中redis怎么实现排行榜
2024-04-02

【Redis面试题】如何使用Redis实现微信步数排行榜?

1. 前言之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这5种数据结构各自的使用场景,不过一直也没来得及写。碰巧,在3月份找工作面试时,有个面试官先问了我Redis有哪几种数据结构,在我讲完后,面试官又问了我以下问
【Redis面试题】如何使用Redis实现微信步数排行榜?
2018-04-12

unity如何实现动态排行榜

这篇文章给大家分享的是有关unity如何实现动态排行榜的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在做2048游戏的时候要实现排行榜的功能:1.超出显示范围可以通过滑动滚动条来上下查看2.动态插入行3.每次插入
2023-06-20

Redis笔记点赞排行榜的实现示例

目录一、发布探店笔记二、实现查看笔记接口三、点赞功能四、点赞排行榜 1、修改点赞逻辑2、点赞排行榜功能一、发布探店笔记探店笔记类似点评网站的评价,往往是图文结合。对应的表有两个探店笔记表(主键、商户id、用户id、标题、文字、图片、探店
2023-01-29

使用redis怎么实现一个排行榜功能

使用redis怎么实现一个排行榜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。加入排行榜获取redis实例import redismain_rds = re
2023-06-15

使用Redis实现用户积分排行榜的教程

排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。 一般排行榜都是有实效性的,比如“用户积分榜”。如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对于新用户来说,那真是太令人沮丧了。 首先
2022-06-04

手把手教你使用redis实现排行榜功能

目录一、需求背景二、实现思路 1、利用数据库2、利用Redis总结一、需求背景最近项目需要做排行榜功能,实现员工邀请用户注册排行榜,要求是实时更新,查询要快。员工所属支行、二级行、省行,界面要根据条件显示排名数据。效果如下图所示:原型图
2023-04-14

编程热搜

目录