有序集合类型

上节我们一起学习了集合类型,感受到了redis的强大。现在我们接着学Redis的最后一个类型——有序集合类型。

有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序而已。Redis中的有序集合类型,实际上是在集合类型上,为每个元素都关联一个分数,有序实际上说的是分数有序,我们根据分数的范围获取集合及其他操作。集合的元素依然是不能够相同的,但是分数可以相同

下面列举有序集合和类型和列表类型的相似处:

①两者都是有序的(废话!)

②两者都可以获得某一范围的元素

下面列举区别:

①列表是链表实现的,靠近两边的数据读取极快,而元素过多后获取中间元素的速度则会很慢;有序集合类型使用的散列表和跳跃表(Skip list)实现的,所以读取哪部分的数据都差不多(时间复杂度是O(logN))。

②列表中不能简单的调整元素的位置,但是有序集合可以(通过改变分数)。

③有序集合比列表费内存(要存储分数、散列、跳跃表)

下面我们来一起学习命令(这里参数关键字都比较多,所以下面开始列举的命令,关键字都使用大写)。

1、增加元素

ZADD key score member [score member ...]

ZADD命令是向集合中增加元素的命令,往集合中增加分数为score的member,这里也是可以一次增加多个值,返回值是成功增加的元素的个数,如果member存在,则score会覆盖原有的分数。

127.0.0.1:6379> zadd scoreboard 89 tom
(integer) 1     //添加一个
127.0.0.1:6379> zadd scoreboard 70 peter 100 david
(integer) 2     //添加多个
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "peter"      //带分数输出
2) "70"
3) "tom"
4) "89"
5) "david"
6) "100"

我们发现Peter的分数录入错了,需要修改为76分,这时候我们接着执行下面的命令。

127.0.0.1:6379> zadd scoreboard 76 peter
(integer) 0         //member存在时,score不一致,会修改score
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "peter"
2) "76"             //70->76
3) "tom"
4) "89"
5) "david"
6) "100"

这里分数不仅仅支持整数,还支持浮点数

127.0.0.1:6379> zadd testscore 17e+307 A
(integer) 1
127.0.0.1:6379> zadd testscore 3.3 B
(integer) 1
127.0.0.1:6379> zadd testscore -inf D
(integer) 1
127.0.0.1:6379> zadd testscore +inf C
(integer) 1
127.0.0.1:6379> zrange testscore 0 -1 withscores
1) "D"
2) "-inf"
3) "B"
4) "3.2999999999999998"
5) "A"
6) "1.6999999999999999e+308"
7) "C"
8) "inf"

其中+inf和-inf是正负无穷的意思。

2、获得元素的分数

 ZSCORE key member
127.0.0.1:6379> zscore scoreboard peter
"76"

3、获得排名在某个范围的元素列表

ZRANGE key start stop [WITHSCORE]
ZREVRANGE key start stop [WITHSCORE]

ZRANGE命令会按照元素分数的从小到大顺序返回索引从start到stop之间所有的元素(包含两端)。ZRANGE与LRANGE命令相似,索引从0开始,负数一样代表从后向前查找(-1是最后一个)。WITHSCORE代表是否加上分数

127.0.0.1:6379> zrange scoreboard 0 2
1) "peter"
2) "tom"
3) "david"
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "peter"
2) "76"
3) "tom"
4) "89"
5) "david"
6) "100"
127.0.0.1:6379> zrevrange scoreboard 0 -1 withscores
1) "david"
2) "100"
3) "tom"
4) "89"
5) "peter"
6) "76"

ZRANGE命令的时间复杂度为O(longN+m),其中n为有序集合的基数,m为返回的元素个数。如果遇到分数相同的情况,Redis会按照字典顺序(即”0″<…<”9″<”A”<…<”Z”<”a”<…<”z”这样的顺序)进行排列。如果是中文,也会按照编码之后的字典顺序排序。

ZREVRANGE命令和ZRANGE命令唯一不同的是ZREVRANGE命令是按照分数从大到小给出顺序结果

4、获得指定分数范围的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

这个命令参数很多,但是都很好理解。这个命令用来获取指定分数范围的元素,min是最小值,max是最大值,WITHSCORE还是和上面介绍的一样,LIMIT是为了指定偏移量及数量的,和sql的有点像。offset是偏移量,count是数量。同时这些min和max都是包含的,如果要想不包含,需要使用“(”符号。

127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores
1) "tom"
2) "89"
3) "david"
4) "100"
127.0.0.1:6379> zrangebyscore scoreboard (80 100 withscores
1) "tom"
2) "89"
3) "david"
4) "100"
127.0.0.1:6379> zrangebyscore scoreboard 80 (100 withscores
1) "tom"
2) "89"
127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores limit 1 1
1) "david"
2) "100"
127.0.0.1:6379> zrangebyscore scoreboard 80 100 withscores limit 1 2
1) "david"
2) "100"
127.0.0.1:6379> zrangebyscore scoreboard 60 +inf withscores
1) "peter"
2) "76"
3) "tom"
4) "89"
5) "david"
6) "100" 

5、增加某个元素的分数

ZINCRBY key incremnet member
127.0.0.1:6379> ZINCRBY scoreboard 2 peter
"78"

127.0.0.1:6379> ZINCRBY scoreboard -5 peter
"73"

这个命令可以增加一个元素的分数,返回值是更改后的分数。这里就不再赘述用法了,和INCRBY命令类似。同样如果不存在会初始为0在增加,负数即是减小。

6、获得集合中元素的数量

ZCARD key

这个命令和SCARD类似,也就不多说了。

7、获得指定分数范围的元素个数

ZCOUNT key min max

这里就是获得min和max分数之间的元素数,当然这里也支持“(”符号。

8、删除一个或多个元素

ZREM key member [member ...]

返回值是成功删除的元素的个数。

127.0.0.1:6379> zrem scoreboard peter
(integer) 1
127.0.0.1:6379> zrange scoreboard 0 -1
1) "tom"
2) "david"

9、按照排名范围删除元素

ZREMRANGEBYRANK key start stop

这个命令按照元素分数从小到大顺序删除指定范围内所有的元素(其实就是先排序,然后按照排好的序列的索引删除),并返回删除的元素的数量。

10、按照分数范围删除元素

ZREMRANGEBYSCORE key min max

这里就是直接删除分数范围的元素了,这里分数同样支持“(”符号,返回删除数量。

11、获得元素的排名

ZRANK key member
ZREVRANK key member

ZRANK命令按照元素分数的从小到大的顺序获得制定元素的排名(第一个从0开始),ZREVRANK则相反。

127.0.0.1:6379> zrank scoreboard tom
(integer) 0
127.0.0.1:6379> zrank scoreboard david
(integer) 1

最后我们举个实际应用的例子。

我们把wordpress的文章按点击率排序,关系数据库我们是遍历所有的文章排序点击数,如果使用Redis,我们需要一个posts:page.view键的有序集合类型,然后每个member为文章ID,score为文章的点击量。这样我们就可以用ZREVRANGE命令获取点击量排行榜。

还有一个实际的例子,我们用有序集合类型保存文章的发布时间(时间用UNIX时间及时间的毫秒数)与文章ID,这样我们可以很方便的按时间来查看文章列表,我们的文章列表应该是用文章发布时间排序而不应该用文章ID排序的。

转载于:https://www.cnblogs.com/Joans/p/5807366.html

Redis常用命令入门5:有序集合类型相关推荐

  1. Redis常用命令入门4:集合类型

    集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...

  2. Redis 常用命令学四:集合类型命令

    1.增加和删除命令 127.0.0.1:6379> SADD st a (integer) 1 127.0.0.1:6379> SADD st r f g (integer) 3 127. ...

  3. Redis学习笔记之七:有序集合类型

    Redis最后一种类型是有序集合类型ZSet,即排序的Set,但又与Set不同的是,它比Set多一个字段分数(score)用于排序等操作,从这点来看,相当于Java中的TreeMap,但与Java的T ...

  4. redis数据库hset(有序集合)类型常用命令

    redis数据库hset类型常用命令 1 向有序集合添加一个或多个成员,或者更新已存在成员的分数 zadd key score1 member1 [score2 member2] 2 获取有序集合的成 ...

  5. 15天玩转redis —— 第六篇 有序集合类型

    今天我们说一下Redis中最后一个数据类型 "有序集合类型",回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这 些代码的好心人真的要一生平安哈,不管我们想没 ...

  6. python集合类型中的元素是有序的_数据类型;有序集合类型(sorted set)

    有序集合sortedset 一特点 1.有序.去重 2.元素是字符串类型 3.每个元素都关联着一个浮点数分值(score),并按照分支从小到大的顺序排列集合中的元素(分值可以相同) 4.最多包含2^3 ...

  7. redis的数据结构||1) 字符串类型2) 哈希类型3) 列表类型4) 集合类型 5) 有序集合类型详解

    2. 下载安装     1. 官网:https://redis.io     2. 中文网:http://www.redis.net.cn/     3. 解压直接可以使用:         * re ...

  8. Redis常用命令之操作Hash类型

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

  9. Redis基础常用命令入门

    目录 Redis基础命令 一.字符串类型 ▪️ 赋值 SET : ▪️ 获取 GET: ▪️ 递增(减) 1 INC.DECR: ▪️ 递增(减)指定整数 INCRBY .DECRBY: ▪️ 递增( ...

最新文章

  1. php拍照从手机相册中选择,微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例...
  2. java有main却说找不到_小说:女子雨夜找扳指,男子却说你找不到的:我没丢怎么也找到...
  3. oracle管理 题库,Oracle数据库管理与开发习题集
  4. [error] error while loading Consumer, class file '/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-5.b18.fc2
  5. xenserver 挂载磁盘 xe sr-create_视频号挂载小商店,仅需3步!
  6. PHP优于Node.js的五大理由
  7. stm32烧不进去程序_STM32的FLASH和SRAM的使用情况分析
  8. 恶意造谣水滴筹的违法分子已被警方依法处理
  9. Android中的NavigationView
  10. 【一分钟论文】轻松解读Semi-supervised Sequence Learning半监督序列学习
  11. 三层架构和mvc的区别_谈谈对于企业级系统架构的理解
  12. IDEA集成SVN代码管理常用功能
  13. mysql 定时任务 日志_mysql定时备份任务
  14. jQuery日常记录
  15. 葛冬冬斯坦福专业_比较预测模型的表现冬冬与有马
  16. Vue v-modle理解
  17. 奥迪坚技术革新带动信用卡呼叫中心管理升级
  18. 换手机 之导入通信录
  19. php微信手机端上传图片,手机Wap微信端上传单图和上传多图的DEMO
  20. 学数据结构,是不是一定要先学离散数学

热门文章

  1. Android 超高仿微信图片选择器 图片该这么加载
  2. Spring定时器配置
  3. 大山深处,有一所希望学校
  4. why carbon 13?
  5. mac book file management system
  6. C++模板特化的一个BUG?
  7. U3D中可以直接使用GL!!!
  8. map的用法-HD 1029Ignatius and the Princess IV
  9. Be Close To The Real World
  10. 浅谈iOS 开发中的界面通信