有序集合都不会用还能说懂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教程资料

相关文章
|
存储 NoSQL Java
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
面试官问:那有序集合为什么要同时使用字典和跳跃表来实现?我:这个设计主要是考虑了性能因素。1. 如果单纯使用字典,查询的效率很高是O(1),但执行类似ZRANGE、ZRNK时,排序性能低。每次排序需要在内存上对字典进行排序一次,同时消耗了额外的O(n)内存空间
146 2
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
|
存储 NoSQL API
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
125 0
|
存储 NoSQL 关系型数据库
Redis 有序集合(sorted set)
10月更文挑战第17天
278 4
|
存储 NoSQL API
7)深度解密 Redis 的有序集合(ZSet)
7)深度解密 Redis 的有序集合(ZSet)
199 0
|
存储 NoSQL Redis
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——集合操作与有序集合操作
【Redis】 Java操作客户端命令——集合操作与有序集合操作
|
NoSQL Redis
【Redis】 关于 Redis 有序集合类型
【Redis】 关于 Redis 有序集合类型
|
机器学习/深度学习 NoSQL Redis
Redis -- zset有序集合
Redis -- zset有序集合
365 0
|
存储 NoSQL 调度
Redis的有序集合(Sorted Set)详解
Redis的有序集合(Sorted Set)详解
490 0
|
存储 NoSQL Java
Redis-07Redis数据结构--有序集合ZSet
Redis-07Redis数据结构--有序集合ZSet
167 0