使用排序命令详解
本文介绍了使用排序命令redis支持列表,排序,排序集合元素
排序排序命令格式:
排序关键字{模式} {开始} {得到限制计数模式} { } {α} | ASC DESC {店
1)排序键(列表)
这是最简单的情况,没有任何选项来对集合自己的元素进行排序并返回排序结果,默认值是升序。
实例:
复制代码代码如下所示:
127.0.0.1:6379 > lpush mimvp 12
(整数)1
127.0.0.1:6379 > lpush mimvp 11
(整数)2
127.0.0.1:6379 > lpush mimvp 13
(整数)3
127.0.0.1:6379 > lpush mimvp 10
(整数)4
127.0.0.1:6379 > lrange mimvp 0-1
1)10
2)13
3)11
4)12
127.0.0.1:6379 >排序mimvp
1)10
2)11
3)12
4)13
127.0.0.1:6379 > mimvp降序排序
1)13
2)12
3)11
4)10
2){ } {α} ASC | desc(名单)
排序默认排序(ASC)是从小到大,当然,也可以按照逆序或按字符。
相反的顺序可以被添加到属性选项,按字母顺序排列的字母选项,α可用于描述
按分数排序(值),使用默认排序排序的字母表将是错误的!
实例:
复制代码代码如下所示:
127.0.0.1:6379 > lpush mylist Forum
(整数)1
127.0.0.1:6379 > lpush mylist代理
(整数)2
127.0.0.1:6379 > lpush mylist博客
(整数)3
127.0.0.1:6379 > lpush mylist apptop
(整数)4
127.0.0.1:6379 >排序mylist
(错误)错误一个或多个分数不能转换成双
127.0.0.1:6379 >排序mylistα
1)apptop
2)博客
3)论坛
4)代理
127.0.0.1:6379 >排序mylistαdesc
1)代理
2)论坛
3)博客
4)apptop
127.0.0.1:6379 >排序mylist DESCα
1)代理
2)论坛
3)博客
4)apptop
3){按模式}(set)
除了对集合元素本身(数字、字母)进行排序之外,还可以根据给定的模式将集合元素的内容组合到新的键中,并根据新键中相应的内容对它们进行排序。
实例:
复制代码代码如下所示:
127.0.0.1:6379 >设置mimvp_12 mimvp_12
好啊
127.0.0.1:6379 >设置mimvp_11 mimvp_11
好啊
127.0.0.1:6379 >设置mimvp_13 mimvp_13
好啊
127.0.0.1:6379 >设置mimvp_10 mimvp_10
好啊
127.0.0.1:6379 >排序mimvp mimvp_ / / *的mimvp_ *是一个字符串,那么你需要α
(错误)错误一个或多个分数不能转换成双
127.0.0.1:6379 >排序mimvp通过mimvp_×α
1)10
2)11
3)12
4)13
127.0.0.1:6379 >排序mimvp通过mimvp_ *αdesc
1)13
2)12
3)11
4)10
*在以上例子1)mimvp代表了元素的值,所以这种与mimvp_12,mimvp_11,mimvp_13一致,关键的四对应的值排序mimvp_10,但返回后仍在mimvp排序集合中的元素,即数13, 11, 12,10,取而代之的是mimvp_ *字符串元素。
4){获取模式}
上面的例子是在mimvp所有数字元素的集合,返回。我们还可以指定模式对应的新键的字符串值(mimvp_ *)通过获得选项。
实例:
复制代码代码如下所示:
127.0.0.1:6379 >排序mimvp通过mimvp_ * mimvp_×α
1)mimvp_10
2)mimvp_11
3)mimvp_12
4)mimvp_13
127.0.0.1:6379 >排序mimvp通过mimvp_ * mimvp_ *αdesc
1)mimvp_13
2)mimvp_12
3)mimvp_11
4)mimvp_10
这还不mimvp元素,但价值对应mimvp_12,mimvp_11,mimvp_13和mimvp_10。当然,排序是根据mimvp_12,mimvp_11,mimvp_13排列,mimvp_10价值和字母顺序排列。
此外,得到的选择可以有多个#,特殊符号指原始采集mimvp(类似排序集初中)
实例:
复制代码代码如下所示:
127.0.0.1:6379 >排序mimvp通过mimvp_ * mimvp_ *α#
1)mimvp_10
2)10
3)mimvp_11
4)11
5)mimvp_12
6)12
7)mimvp_13
8) 13
127.0.0.1:6379 >排序mimvp通过mimvp_ * mimvp_ *αDESC #
1)mimvp_13
2)13
3)mimvp_12
4)12
5)mimvp_11
6)11
7)mimvp_10
8)10
最后是对特殊字符>散列类型字段(散列)的引用。
实例:
复制代码代码如下所示:
127.0.0.1:6379 > HSET user_12名称两江
(整数)1
127.0.0.1:6379 > HSET user_11名称Yangjie
(整数)1
127.0.0.1:6379 > HSET user_13名称Yangliang
(整数)1
127.0.0.1:6379 > HSET user_10名扬创
(整数)1
127.0.0.1:6379 >排序mimvp得到user_ * ->名称
1)扬创
2)黄洋界
3)两江
4)杨亮
127.0.0.1:6379 >排序mimvp得到user_ * ->名称描述
1)杨亮
2)两江
3)黄洋界
4)扬创
这是很容易理解的,如果mimvp时不存在相应的值不存在,那么相应的回报为零
5){限制开始计数}(限制)
上面的示例返回所有元素,限制选项可以限制返回的数量。
实例:
复制代码代码如下所示:
127.0.0.1:6379 >排序mimvp得到mimvp_ *限制12
1)mimvp_11
2)mimvp_12
127.0.0.1:6379 >排序mimvp得到mimvp_ *限制03
1)mimvp_10
2)mimvp_11
3)mimvp_12
起始下标从0开始,这里的限制选项(限制12)意味着从第二个元素中获取2。
6)dstkey } {店(店)
如果在固定模式下定期对集合进行排序,那么排序结果的缓存将减少许多CPU成本。使用存储选项可以将排序内容保存到指定的键,并且保存类型是列表。
复制代码代码如下所示:
127.0.0.1:6379 >排序mimvp得到mimvp_ *限03店mimvp_store
(整数)3
127.0.0.1:6379 >型mimvp_store
列表
127.0.0.1:6379 > lrange mimvp_store 0-1
1)mimvp_10
2)mimvp_11
3)mimvp_12
这个例子将排序结果mimvp_store,这是直接从mimvp_store提取。
总结
在介绍了功能之后,讨论了关于排序的一些问题。
如果有一个以上的redis服务器,不同的键可以在不同的服务器存在。例如,mimvp_12,mimvp_11,mimvp_13和mimvp_10有可能被存储在四个不同的服务器,这将会对分类性能影响很大。
通过在自己的博客中使用作者解决这个问题的办法是把需要整理在同一服务器的关键标签的关键。由于特定的决策的关键存在于哪个服务器通常是在客户端的哈希,我们只能使用密钥的哈希部分。
例如 uff1a
如果我们找到关键客户如果只包含关键{ },{ }包含哈希表的内容,我们将有四名关键,{姓名} {姓名} 13 { 12 } {姓名} 10 11名被如此命名,所以客户会把他们都放在同一服务器(不知道jredis实现无)。
还有一个更严重的问题。
如果排序的集合是非常大的花很长时间,因为长时间使用单线程,排序操作阻止其他客户端的请求。解决的办法是将数据复制到多个从通过主从复制机制。然后我们只做排序操作的奴隶和缓存排序结果尽可能此外,一种解决方案是使用分类设置指标,需要在一定的顺序访问集合。
实例:
复制代码代码如下所示:
127.0.0.1:6379 > Sadd tom:朋友:表123 #汤姆好友列表是用户的一个好朋友
(整数)1
127.0.0.1:6379 > Sadd tom:朋友:表456
(整数)1
127.0.0.1:6379 > Sadd tom:朋友:表789
(整数)1
127.0.0.1:6379 > Sadd tom:朋友:表101
(整数)1
127.0.0.1:6379 >设定uid:排序:123 1000 UID #相应结果
好啊
127.0.0.1:6379 >设定uid:排序:456 6000
好啊
127.0.0.1:6379 >设定uid:排序:789 100
好啊
127.0.0.1:6379 >设定uid:排序:101 5999
好啊
127.0.0.1:6379> set uid:123 {uid': 123,'name':'lucy'} UID # increase corresponding friend information
好啊
127.0.0.1:6379 >设置UID: 456 { 'uid:456,'name':杰克}
好啊
127.0.0.1:6379 >设置UID: 789 { 'uid:789,'name':'marry}
好啊
127.0.0.1:6379 >设置UID: 101 { 'uid:101,'name':'icej}
好啊
127.0.0.1:6379 >排序汤姆:朋友:名单由UID:排序:* UID:* ID和UID:排序#场匹配排序后从好友列表,并根据排序顺序,在UID表关键信息的获得
1){ 'uid:789,'name':'marry}
2){ 'uid:123,'name':'lucy}
3){ 'uid:101,'name':'icej}
4){ 'uid:456,'name':杰克}
127.0.0.1:6379 >排序汤姆:朋友:名单由UID:排序:*:*:UID UID排序:*
1){ 'uid:789,'name':'marry}
2)100
3){ 'uid:123,'name':'lucy}
4)1000
5){ 'uid:101,'name':'icej}
6)5999
7){ 'uid:456,'name':杰克}
8)6000
存在的问题及原因分析
为什么是mimvp_ * mimvp得到1。排序mimvp_ *α#将按照10 - 13级下,这类名称和名称*α简单的结果是不一样的
从这样的逻辑分析这个问题
一)列表插入后,默认的是按时间倒序排列(高级Filo),lrange毫升0-1,其结果是:12131110,这是因为最新的项目列表插入到链头。
B mimvp)排序的mimvp_ *确定它将根据mimvp_ *值排序。但当相应的mimvp_ *值不是民型和无α的设置,排序得分是一样的,因为程序会变换的mimvp_ *相应价值的α型。
C)这使得类的mimvp mimvp_ *被安排在毫升的自然秩序
复制代码代码如下所示:
如果(alpha){
如果(sortBy){
向量{ J }。u.cmpobj = getdecodedobject(ByVal);
}
}
{其他
如果(ByVal ->编码= = redis_encoding_raw){
向量{ J }。u.score = strtod(ByVal -> PTR,null);
}
如果(ByVal ->编码= = redis_encoding_int){
不需要解码对象如果它是
*整数编码(唯一支持的编码)
*远。我们可以投它
* /
向量{ J }。u.score =(长)ByVal -> PTR;
}
{其他
RedisAssert(1!= 1);
}
}