Redis常用命令入门5:有序集合类型
有序集合类型
上节我们一起学习了集合类型,感受到了redis的强大。现在我们接着学Redis的最后一个类型——有序集合类型。
有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序而已。Redis中的有序集合类型,实际上是在集合类型上,为每个元素都关联一个分数,有序实际上说的是分数有序,我们根据分数的范围获取集合及其他操作。集合的元素依然是不能够相同的,但是分数可以相同。
下面列举有序集合和类型和列表类型的相似处:
①两者都是有序的(废话!)
②两者都可以获得某一范围的元素
下面列举区别:
①列表是链表实现的,靠近两边的数据读取极快,而元素过多后获取中间元素的速度则会很慢;有序集合类型使用的散列表和跳跃表(Skip list)实现的,所以读取哪部分的数据都差不多(时间复杂度是O(logN))。
②列表中不能简单的调整元素的位置,但是有序集合可以(通过改变分数)。
③有序集合比列表费内存(要存储分数、散列、跳跃表)。
下面我们来一起学习命令(这里参数关键字都比较多,所以下面开始列举的命令,关键字都使用大写)。
1、增加元素
ZADD key score member [score member ...]
ZADD命令是向集合中增加元素的命令,往集合中增加分数为score的member,这里也是可以一次增加多个值,返回值是成功增加的元素的个数,如果member存在,则score会覆盖原有的分数。
127.0.0.1:> zadd scoreboard tom
(integer) 1 //添加一个
127.0.0.1:> zadd scoreboard peter david
(integer) 2 //添加多个
127.0.0.1:> zrange scoreboard - withscores
) "peter" //带分数输出
) ""
) "tom"
) ""
) "david"
) ""
我们发现Peter的分数录入错了,需要修改为76分,这时候我们接着执行下面的命令。
127.0.0.1:> zadd scoreboard peter
(integer) 0 //member存在时,score不一致,会修改score
127.0.0.1:> zrange scoreboard - withscores
) "peter"
) "" //70->76
) "tom"
) ""
) "david"
) ""
这里分数不仅仅支持整数,还支持浮点数。
127.0.0.1:> zadd testscore 17e+ A
(integer)
127.0.0.1:> zadd testscore 3.3 B
(integer)
127.0.0.1:> zadd testscore -inf D
(integer)
127.0.0.1:> zadd testscore +inf C
(integer)
127.0.0.1:> zrange testscore - withscores
) "D"
) "-inf"
) "B"
) "3.2999999999999998"
) "A"
) "1.6999999999999999e+308"
) "C"
) "inf"
其中+inf和-inf是正负无穷的意思。
2、获得元素的分数
127.0.0.1:> zscore scoreboard peter
""
3、获得排名在某个范围的元素列表
ZRANGE命令会按照元素分数的从小到大顺序返回索引从start到stop之间所有的元素(包含两端)。ZRANGE与LRANGE命令相似,索引从0开始,负数一样代表从后向前查找(-1是最后一个)。WITHSCORE代表是否加上分数。
127.0.0.1:> zrange scoreboard
) "peter"
) "tom"
) "david"
127.0.0.1:> zrange scoreboard - withscores
) "peter"
) ""
) "tom"
) ""
) "david"
) ""
127.0.0.1:> zrevrange scoreboard - withscores
) "david"
) ""
) "tom"
) ""
) "peter"
) ""
ZRANGE命令的时间复杂度为O(longN+m),其中n为有序集合的基数,m为返回的元素个数。如果遇到分数相同的情况,Redis会按照字典顺序(即”0″<…<”9″<”A”<…<”Z”<”a”<…<”z”这样的顺序)进行排列。如果是中文,也会按照编码之后的字典顺序排序。
ZREVRANGE命令和ZRANGE命令唯一不同的是ZREVRANGE命令是按照分数从大到小给出顺序结果。
4、获得指定分数范围的元素
这个命令参数很多,但是都很好理解。这个命令用来获取指定分数范围的元素,min是最小值,max是最大值,WITHSCORE还是和上面介绍的一样,LIMIT是为了指定偏移量及数量的,和sql的有点像。offset是偏移量,count是数量。同时这些min和max都是包含的,如果要想不包含,需要使用“(”符号。
127.0.0.1:> zrangebyscore scoreboard withscores
) "tom"
) ""
) "david"
) ""
127.0.0.1:> zrangebyscore scoreboard ( withscores
) "tom"
) ""
) "david"
) ""
127.0.0.1:> zrangebyscore scoreboard ( withscores
) "tom"
) ""
127.0.0.1:> zrangebyscore scoreboard withscores limit
) "david"
) ""
127.0.0.1:> zrangebyscore scoreboard withscores limit
) "david"
) ""
127.0.0.1:> zrangebyscore scoreboard +inf withscores
) "peter"
) ""
) "tom"
) ""
) "david"
) ""
5、增加某个元素的分数
127.0.0.1:> ZINCRBY scoreboard peter
""
127.0.0.1:> ZINCRBY scoreboard - peter
""
这个命令可以增加一个元素的分数,返回值是更改后的分数。这里就不再赘述用法了,和INCRBY命令类似。同样如果不存在会初始为0在增加,负数即是减小。
6、获得集合中元素的数量
这个命令和SCARD类似,也就不多说了。
7、获得指定分数范围的元素个数
这里就是获得min和max分数之间的元素数,当然这里也支持“(”符号。
8、删除一个或多个元素
返回值是成功删除的元素的个数。
127.0.0.1:> zrem scoreboard peter
(integer)
127.0.0.1:> zrange scoreboard -
) "tom"
) "david"
9、按照排名范围删除元素
这个命令按照元素分数从小到大顺序删除指定范围内所有的元素(其实就是先排序,然后按照排好的序列的索引删除),并返回删除的元素的数量。
10、按照分数范围删除元素
这里就是直接删除分数范围的元素了,这里分数同样支持“(”符号,返回删除数量。
11、获得元素的排名
ZRANK命令按照元素分数的从小到大的顺序获得制定元素的排名(第一个从0开始),ZREVRANK则相反。
127.0.0.1:> zrank scoreboard tom
(integer)
127.0.0.1:> zrank scoreboard david
(integer)
最后我们举个实际应用的例子。
我们把wordpress的文章按点击率排序,关系数据库我们是遍历所有的文章排序点击数,如果使用Redis,我们需要一个posts:page.view键的有序集合类型,然后每个member为文章ID,score为文章的点击量。这样我们就可以用ZREVRANGE命令获取点击量排行榜。
还有一个实际的例子,我们用有序集合类型保存文章的发布时间(时间用UNIX时间及时间的毫秒数)与文章ID,这样我们可以很方便的按时间来查看文章列表,我们的文章列表应该是用文章发布时间排序而不应该用文章ID排序的。
Redis常用命令入门5:有序集合类型的更多相关文章
- Redis常用命令入门4:集合类型
集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...
- Redis常用命令入门1:字符串类型命令
Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...
- Redis常用命令入门3:列表类型
列表类型 列表类型也是一个我们很长要用到的一个类型.比如我们发博客,要用到博客列表.如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键, ...
- 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. ...
- Redis常用命令入门2:散列类型
散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...
- Redis常用命令入门——列表类型(一级二级缓存技术)
获取列表片段 redis > LRANGE KEY_NAME START END lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始. (1) ...
- Redis常用操作--------SortedSet(有序集合)
1.ZADD key score member [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中. ...
- Redis 常用命令学习二:字符串类型命令
1.赋值与取值命令 127.0.0.1:6379> set foo helloredis OK 127.0.0.1:6379> get foo "helloredis" ...
- Redis 常用命令学四:列表类型命令
1.在列表两端增加值的命令 127.0.0.1:6379> lpush 1 (error) ERR wrong number of arguments for 'lpush' command 1 ...
随机推荐
- Prince2七大主题之风险
Prince2七大主题之风险 我们前几个节学习了PRINCE2七大主题的商业论证.组织.质量和计划,今天我们开展对于风险模块的讲解. 风险:目的是识别.评估和控制不确定性,从而提高项目的成功率.P ...
- vs快捷键大全
前言 作为一个.net开发员,你还在用鼠标去点击相应的操作么?如果你回答是,那么你太low了! 一个很厉害的程序员不会是那种这鼠标到处狂点的人,他们肯定会很多快捷键,所以为了离他们更近一步,我们必须学 ...
- JAVA继承时构造函数的问题
今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...
- python之RabbitMQ
一.安装RabbitMQ 1. 安装erlang 1 2 3 4 tar xf otp_src_18.3.tar.gz cd otp_src_18.3 ./configure --prefix=/ma ...
- win7和u盘redhat7.1双系统安装总结
最近win7系统越用越卡,又没钱买mac只能想办法装以下linux系统,听说redhat服务器用的比较多,就想尝试一下装一个redhat.当然,和所有人一样,搜索了很多资料.我选择装双系统,因为要抛弃 ...
- 1.Dotnet Core安装
DtnetCore1.0.1的安装包我以上传至百度网盘,里面有安装教程. http://pan.baidu.com/s/1c2iLNNE 如果安装不上,请留言,我会在第一时间回复你. 不需要挂VPN.
- DOM树操作
DOM 操作 访问与树关系(节点) 绘制 DOM 树: childNodes, attributes 从一个中心元素访问其所有的直系亲属元素 访问父节点: parentNode 访问上一个兄弟节点: ...
- Jquery实现图片轮换效果
最近在看jquery书时,看到一个比较有趣的东西:图片轮换.这里和大家分享下我看完后写的一个demo.实现图片轮换要完成三部分模块:html部分.css部分.jqury部分.下面分步详细说明.1.ht ...
- Cocos2d-x 核心概念 - 层(Layer)
层(Layer) 一个简单的主界面是由是三个层叠加实现的,从上到下依次为,菜单层,精灵层,背景层 这个次序适用与事件的响应机制,菜单层最先接受到系统事件,然后精灵层,最后背景层 在事件传递的过程中,如 ...
- 月薪3万的程序员告诉你:这样工作才能拿高薪(转 IT之家)
习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月 ...