有序集合都不会用还能说懂Redis吗

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 谈起redis相信很多人都会说,这个我懂,不就是缓存嘛。然而,要是问题redis有哪些数据类型,瞬间就懵了。难道不是key-value存储吗?这是很多初学者的理解。Redis作为当今主流的NOSQL数据库之一,其用处可谓神通广大,数据类型也是比同类作为缓存的memcache丰富多了,再说其队列数据类型和消息队列的实现,以及集群,哨兵机制,真是个知识万花筒。先不说什么Redis的基础概念和高级缓存应用了,有兴趣的可以去看官方文档啦。今天来总结下社交或者排行榜场景经常用到的有序集合数据类型,也为小马即将要搞的一个功能打一下前阵。

排行榜的场景

首先我们来看一个场景,现在我需要实现一个游戏分数排行榜。那么分析一下,首先要支持排序吧,然后要支持每个人的实时分数变更,再后来我可能随时要知道某个用户所处的排名位置。有的同学说了,这很简单啊,我用MYSQL就搞定了。排序用order by,变更的话就是update,位置排名的话就是order by 按访问取出来然后count一下条数就知道处在第几条了。嗯,这看起来没毛病。但是一旦数据一多,比如达到了万级别或者十万级别以上,比如一个用户处在第5万名,那么一通查询和统计后,性能估计就达到瓶颈了。

于是我们想到了redis的有序集合数据类型,啊,似乎就像专门为排行榜量身定做的数据类型一样。我们来看官方的解释:

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

是不是很激动了。OK,现在开始来一起动动手动动脚看看吧。

redis有序集合实现排行榜实战

首先,我们安装完redis, 然后进入安装目录启动一下服务。
image.png

启动redis

接下来我们打开一个客户端进行连接。

image.png

连接redis

然后我们使用命令,创建一个排行榜集合list,并对这个排行榜加入4个成员member和分数。

image.png
按索引区间0-100输出成员列表和分数,按分数从小到大排序。
image.png

输出某成员的索引值,其实就是排名了。(不过要注意这里是从小到大的排名位置值,那其实我们通常要的是从大到小的排名位置值,别急,往下看)
image.png

返回某个指定成员的分数。
image.png

好了,我们要个真正的排行榜,按分数从大到小排序的。

那如果我只想要分数是3-1之间的成员排名呢?
image.png

好了,这个时候各个成员的分数发生了改变,怎么更新呢?更新完会自动输出新的排名吗?答案是肯定的。更改memberc的值,输出排序并查看索引。

image.png

我们再来看看怎么得到排名榜名次。其实索引值就是排名,要特别注意不管是升序还是倒序都是0开始。图中上面的命令排序是从小到大,下面是从大到小。下面的2就代表从大到小索引为1,也就是从大到小排序第3名即排行榜第三。

以上就是redis实现排行榜的例子了,是不是很水到渠成呢?

redis教程资料

相关实践学习
基于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
相关文章
|
2月前
|
存储 NoSQL Java
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
面试官问:那有序集合为什么要同时使用字典和跳跃表来实现?我:这个设计主要是考虑了性能因素。1. 如果单纯使用字典,查询的效率很高是O(1),但执行类似ZRANGE、ZRNK时,排序性能低。每次排序需要在内存上对字典进行排序一次,同时消耗了额外的O(n)内存空间
34 2
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
|
6月前
|
存储 NoSQL API
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
|
9月前
|
消息中间件 存储 NoSQL
有序集合的选择:深入了解 Redis 的 List 数据类型
在现代的应用程序中,数据的有序性和灵活性对于处理实时事件、任务队列等场景至关重要。Redis,作为一款高性能的内存数据库,提供了多种数据类型来满足不同的需求。在本文中,我们将重点介绍 Redis 的 List 数据类型,探讨其特性、用法以及在实际应用中的优势。
97 0
|
12月前
|
存储 NoSQL Java
Redis-07Redis数据结构--有序集合ZSet
Redis-07Redis数据结构--有序集合ZSet
71 0
|
12月前
|
存储 NoSQL 算法
【Redis基础】redis基础知识总结——数据类型(字符串,列表,集合,哈希,有序集合)
【Redis基础】redis基础知识总结——数据类型(字符串,列表,集合,哈希,有序集合)
|
存储 NoSQL Redis
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
|
存储 NoSQL Redis
Redis 有序集合(Zsets) 复习
sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收
120 0
|
NoSQL Java Redis
the-way-to-go - 6. Redis 数据类型 ZSet 有序集合
the-way-to-go - 6. Redis 数据类型 ZSet 有序集合
100 0
|
缓存 分布式计算 NoSQL
Redis_集合_有序集合操作_3|学习笔记
快速学习 Redis_集合_有序集合操作_3
104 0
|
存储 缓存 NoSQL
Redis 数据类型之集合、有序集合与 hash(三)|学习笔记
快速学习 Redis 数据类型之集合、有序集合与 hash(三)
96 0
Redis 数据类型之集合、有序集合与 hash(三)|学习笔记