redis实现排行榜

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: redis实现排行榜

因为项目需要开发,topN的功能,采用redis。参考如下文章开发

排行榜功能是一个很普遍的需求。

设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前20名的排行榜,你会怎么做呢?

你不可能 order by + limit 去实现

select * from game_socre order by score desc limit 0,20  

使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。

首先介绍下,会用到的几个命令及其它们的作用:

详情看官网(redis中文)

zrange  查看排行榜 (升序)

zrevrange 查看排行榜 (降序)

zadd 添加一个数据

zrem 删除一个数据

zrank 获取排名(升序)

zrevrank 获取排名 (降序)

 

了解命令之后,我们就可以试着玩一下了

127.0.0.1:6379> zrange rank_name 0 -1 withscores

(empty list or set)

查一下rank_name的排名表是空的,因为我们还没对rank_name这个有序集合进行添加,0,-1表示查找所有,withscores 表示带数值。

我们使用zadd添加一些数据

127.0.0.1:6379> zadd rank_name 10 zhangsan

(integer) 1

127.0.0.1:6379> zadd rank_name 5 lisi

(integer) 1

127.0.0.1:6379> zadd rank_name 100 wangwu

(integer) 1

再次查看

127.0.0.1:6379> zrange rank_name 0 -1 withscores

1) "lisi"

2) "5"

3) "zhangsan"

4) "10"

5) "wangwu"

6) "100"

127.0.0.1:6379> zrevrange rank_name 0 -1 withscores

1) "wangwu"

2) "100"

3) "zhangsan"

4) "10"

5) "lisi"

6) "5"

现在我想单独查看,zhangsan和lisi的排名

127.0.0.1:6379> zrank rank_name zhangsan

(integer) 1

127.0.0.1:6379> zrank rank_name lisi

(integer) 0

这里要注意,redis的排名是从0开始的,所以一般会加1,比较没有人说第0名。

更新的操作也是比较简单的,可以使用zadd直接进行覆盖。高并发情况下不推荐使用。例如投票这样的排名表,一般使用原子自增操作,确保数据准确性

127.0.0.1:6379> zincrby rank_name 1 wangwu

"101"

127.0.0.1:6379> zrevrange rank_name 0 -1 withscores

1) "wangwu"

2) "101"

3) "zhangsan"

4) "10"

5) "lisi"

6) "5"

日排行榜,周排行榜,月排行榜基本你可以设置key+时间,如rank_name_20181230。

 

总结:

redis的有序集合是一个非常高效的数据结构,可以替代数据库里一些很难实现的操作。它的一个典型应用场景就是排行榜,通过ZRANK可以快速得到用户的排名,通过ZRANGE可以快速得到TOP N的用户列表,它们的复杂度都是O(log(N)),用来替代数据库查询可以大大提升性能。

文章参考:https://blog.csdn.net/u011510825/article/details/85394592


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
缓存 NoSQL Java
redis在排行榜中的使用总结
# 前言 >[redis官网](https://redis.io) > >Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(se
12778 0
|
6月前
|
JSON NoSQL Redis
|
7月前
|
存储 NoSQL Java
redis zset详解:排行榜绝佳选择
新发布的App中,搜索功能使用Redis的有序集合(ZSET)来显示四个热门搜索词。由于应用初期,热门搜索显示的是测试词汇,为提升专业形象,计划删除这些测试词。文章介绍了ZSET的特性,如有序性、唯一性和快速查找,并讲解了如何在命令行中操作ZSET。此外,还分享了利用ZSET实现热搜功能的思路,每次搜索时增加对应词的分数以实现排序。最后,提供了Java代码示例展示了如何在Redisson中操作ZSET数据,以及如何实现热搜词汇功能。
389 1
|
7月前
|
存储 NoSQL 关系型数据库
Redis入门到通关之Redis介绍
Redis入门到通关之Redis介绍
41 0
|
7月前
|
存储 消息中间件 缓存
百度搜索:蓝易云【什么是 Redis?它的特点是什么?Redis的数据类型有哪些?Redis的主要应用场景有哪些?】
总之,Redis是一款功能强大的高性能键值存储数据库,它的特点包括高性能、多种数据结构支持、数据持久化、高并发访问和分布式能力。其主要应用场景涵盖缓存、会话存储、消息队列、实时排行榜和发布/订阅系统等领域。
99 0
|
7月前
|
存储 NoSQL Linux
【Redis入门】 —— 关于Redis的一点儿知识
【Redis入门】 —— 关于Redis的一点儿知识
|
NoSQL Java Redis
Redis 从入门到精通之Redis数据排序
Redis支持对List、Set和Sorted Set元素进行排序,排序命令是`SORT`。`SORT`命令可以根据指定的排序规则对列表、集合或有序集合的元素进行排序,并返回排序后的元素列表或子集。使用Jedis和RedisTemplate分别实现Redis列表、集合和有序集合排序操作的示例代码
882 16
|
机器学习/深度学习 NoSQL 关系型数据库
Redis系列七 - 实现排行榜功能
Redis系列七 - 实现排行榜功能
361 0
|
存储 NoSQL Java
你知道怎么基于 redis 实现排行榜吗
你知道怎么基于 redis 实现排行榜吗
183 0
|
NoSQL Java 数据库连接
redis排行榜学习
redis排行榜学习
81 0