一、概述:
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。
二、相关命令列表:
T
命令原型 | 时间复杂度 | 命令描述 | 返回值 |
ZADD key score member [score] [member] | O(log(N)) | 时间复杂度中的N表示Sorted-Sets中成员的数量。添加参数中指定的所有成员及其分数到指定key的Sorted-Set中,在该命令中我们可以指定多组score/member作为参数。如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。如果键不存在,该命令将为该键创建一个新的Sorted-Sets Value,并将score/member对插入其中。如果该键已经存在,但是与其关联的Value不是Sorted-Sets类型,相关的错误信息将被返回。 | 本次操作实际插入的成员数量。 |
ZCARD key | O(1) | 获取与该Key相关联的Sorted-Sets中包含的成员数量。 | 返回Sorted-Sets中的成员数量,如果该Key不存在,返回0。 |
ZCOUNTkey min max | O(log(N)+M) | 时间复杂度中的N表示Sorted-Sets中成员的数量,M则表示min和max之间元素的数量。该命令用于获取分数(score)在min和max之间的成员数量。针对min和max参数需要额外说明的是,-inf和+inf分别表示Sorted-Sets中分数的最高值和最低值。缺省情况下,min和max表示的范围是闭区间范围,即min 101d5fb0aa02cf430e4bce657df200de stop,此时一个空集合将被返回。如果stop大于最大索引值,该命令将返回从start到集合的最后一个成员。如果命令中带有可选参数WITHSCORES选项,该命令在返回的结果中将包含每个成员的分数值,如value1,score1,value2,score2...。 | 返回索引在start和stop之间的成员列表。 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | O(log(N)+M) | 时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令将返回分数在min和max之间的所有成员,即满足表达式min <= score <= max的成员,其中返回的成员是按照其分数从低到高的顺序返回,如果成员具有相同的分数,则按成员的字典顺序返回。可选参数LIMIT用于限制返回成员的数量范围。可选参数offset表示从符合条件的第offset个成员开始返回,同时返回count个成员。可选参数WITHSCORES的含义参照ZRANGE中该选项的说明。最后需要说明的是参数中min和max的规则可参照命令ZCOUNT。 | 返回分数在指定范围内的成员列表。 |
ZRANK key member | O(log(N)) | 时间复杂度中的N表示Sorted-Set中成员的数量。Sorted-Set中的成员都是按照分数从低到高的顺序存储,该命令将返回参数中指定成员的位置值,其中0表示第一个成员,它是Sorted-Set中分数最低的成员。 | 如果该成员存在,则返回它的位置索引值。否则返回nil。 |
ZREM key member [member ...] | O(M log(N)) | 时间复杂度中N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。该命令将移除参数中指定的成员,其中不存在的成员将被忽略。如果与该Key关联的Value不是Sorted-Set,相应的错误信息将被返回。 | 实际被删除的成员数量。 |
ZREVRANGE key startstop[WITHSCORES] | O(log(N)+M) | 时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令的功能和ZRANGE基本相同,唯一的差别在于该命令是通过反向排序获取指定位置的成员,即从高到低的顺序。如果成员具有相同的分数,则按降序字典顺序排序。 | 返回指定的成员列表。 |
ZREVRANKkey member | O(log(N)) | 时间复杂度中的N表示Sorted-Set中成员的数量。该命令的功能和ZRANK基本相同,唯一的差别在于该命令获取的索引是从高到低排序后的位置,同样0表示第一个元素,即分数最高的成员。 | 如果该成员存在,则返回它的位置索引值。否则返回nil。 |
ZSCOREkey member | O(1) | 获取指定Key的指定成员的分数 | 如果该成员存在,以字符串的形式返回其分数,否则返回nil。 |
ZREVRANGEBYSCOREkey max min [WITHSCORES] [LIMIT offset count] | O(log(N)+M) | 时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令除了排序方式是基于从高到低的分数排序之外,其它功能和参数含义均与ZRANGEBYSCORE相同。 | 返回分数在指定范围内的成员列表。 |
ZREMRANGEBYRANKkey start stop | O(log(N)+M) | 时间复杂度中的N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。删除索引位置位于start和stop之间的成员,start和stop都是0-based,即0表示分数最低的成员,-1表示最后一个成员,即分数最高的成员。 | 被删除的成员数量。 |
ZREMRANGEBYSCOREkey min max | O(log(N)+M) | 时间复杂度中的N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。删除分数在min和max之间的所有成员,即满足表达式min <= score <= max的所有成员。对于min和max参数,可以采用开区间的方式表示,具体规则参照ZCOUNT。 | 被删除的成员数量。 |
三、命令示例:
1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:
#在Shell的命令行下启动Redis客户端工具。 /> redis-cli #添加一个分数为1的成员。 redis 127.0.0.1:6379> zadd myzset 1 "one" (integer) 1 #添加两个分数分别是2和3的两个成员。 redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three" (integer) 2 #0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。 redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" #获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。 redis 127.0.0.1:6379> zrank myzset one (integer) 0 #成员four并不存在,因此返回nil。 redis 127.0.0.1:6379> zrank myzset four (nil) #获取myzset键中成员的数量。 redis 127.0.0.1:6379> zcard myzset (integer) 3 #返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量。 redis 127.0.0.1:6379> zcount myzset 1 2 (integer) 2 #删除成员one和two,返回实际删除成员的数量。 redis 127.0.0.1:6379> zrem myzset one two (integer) 2 #查看是否删除成功。 redis 127.0.0.1:6379> zcard myzset (integer) 1 #获取成员three的分数。返回值是字符串形式。 redis 127.0.0.1:6379> zscore myzset three "3" #由于成员two已经被删除,所以该命令返回nil。 redis 127.0.0.1:6379> zscore myzset two (nil) #将成员one的分数增加2,并返回该成员更新后的分数。 redis 127.0.0.1:6379> zincrby myzset 2 one "3" #将成员one的分数增加-1,并返回该成员更新后的分数。 redis 127.0.0.1:6379> zincrby myzset -1 one "2" #查看在更新了成员的分数后是否正确。 redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES 1) "one" 2) "2" 3) "two" 4) "2" 5) "three" 6) "3"
2. ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCORE
redis 127.0.0.1:6379> del myzset (integer) 1 redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four (integer) 4 #获取分数满足表达式1 <= score <= 2的成员。 redis 127.0.0.1:6379> zrangebyscore myzset 1 2 1) "one" 2) "two" #获取分数满足表达式1 < score <= 2的成员。 redis 127.0.0.1:6379> zrangebyscore myzset (1 2 1) "two" #-inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的自己, #2表示从位置索引(0-based)等于2的成员开始,去后面3个成员。 redis 127.0.0.1:6379> zrangebyscore myzset -inf +inf limit 2 3 1) "three" 2) "four" #删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量。 redis 127.0.0.1:6379> zremrangebyscore myzset 1 2 (integer) 2 #看出一下上面的删除是否成功。 redis 127.0.0.1:6379> zrange myzset 0 -1 1) "three" 2) "four" #删除位置索引满足表达式0 <= rank <= 1的成员。 redis 127.0.0.1:6379> zremrangebyrank myzset 0 1 (integer) 2 #查看上一条命令是否删除成功。 redis 127.0.0.1:6379> zcard myzset (integer) 0
3. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:
#为后面的示例准备测试数据。 redis 127.0.0.1:6379> del myzset (integer) 0 redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four (integer) 4 #以位置索引从高到低的方式获取并返回此区间内的成员。 redis 127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES 1) "four" 2) "4" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1" #由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推。 redis 127.0.0.1:6379> zrevrange myzset 1 3 1) "three" 2) "two" 3) "one" #由于是从高到低的排序,所以one的位置是3。 redis 127.0.0.1:6379> zrevrank myzset one (integer) 3 #由于是从高到低的排序,所以four的位置是0。 redis 127.0.0.1:6379> zrevrank myzset four (integer) 0 #获取分数满足表达式3 >= score >= 0的成员,并以相反的顺序输出,即从高到底的顺序。 redis 127.0.0.1:6379> zrevrangebyscore myzset 3 0 1) "three" 2) "two" 3) "one" #该命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取。 redis 127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2 1) "three" 2) "two"
四、应用范围:
1). 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
2). Sorted-Sets类型还可用于构建索引数据。
以上就是Redis教程(六):Sorted-Sets数据类型的内容,更多相关内容请关注PHP中文网(www.php.cn)!

C#和.NET提供了强大的功能和高效的开发环境。1)C#是一种现代、面向对象的编程语言,结合了C 的强大和Java的简洁性。2).NET框架是一个用于构建和运行应用程序的平台,支持多种编程语言。3)C#中的类和对象是面向对象编程的核心,类定义数据和行为,对象是类的实例。4).NET的垃圾回收机制自动管理内存,简化开发者的工作。5)C#和.NET提供了强大的文件操作功能,支持同步和异步编程。6)常见错误可以通过调试器、日志记录和异常处理来解决。7)性能优化和最佳实践包括使用StringBuild

.NETFramework是一个跨语言、跨平台的开发平台,提供一致的编程模型和强大的运行时环境。1)它由CLR和FCL组成,CLR管理内存和线程,FCL提供预构建功能。2)使用示例包括读取文件和LINQ查询。3)常见错误涉及未处理异常和内存泄漏,需使用调试工具解决。4)性能优化可通过异步编程和缓存实现,保持代码可读性和可维护性是关键。

C#.NET保持持久吸引力的原因包括其出色的性能、丰富的生态系统、强大的社区支持和跨平台开发能力。1)性能表现优异,适用于企业级应用和游戏开发;2).NET框架提供了广泛的类库和工具,支持多种开发领域;3)拥有活跃的开发者社区和丰富的学习资源;4).NETCore实现了跨平台开发,扩展了应用场景。

C#.NET中的设计模式包括Singleton模式和依赖注入。1.Singleton模式确保类只有一个实例,适用于需要全局访问点的场景,但需注意线程安全和滥用问题。2.依赖注入通过注入依赖提高代码灵活性和可测试性,常用于构造函数注入,但需避免过度使用导致复杂度增加。

C#.NET在现代世界中广泛应用于游戏开发、金融服务、物联网和云计算等领域。1)在游戏开发中,通过Unity引擎使用C#进行编程。2)金融服务领域,C#.NET用于开发高性能的交易系统和数据分析工具。3)物联网和云计算方面,C#.NET通过Azure服务提供支持,开发设备控制逻辑和数据处理。

C#.NET开发者社区提供了丰富的资源和支持,包括:1.微软的官方文档,2.社区论坛如StackOverflow和Reddit,3.GitHub上的开源项目,这些资源帮助开发者从基础学习到高级应用,提升编程技能。

C#.NET的优势包括:1)语言特性,如异步编程简化了开发;2)性能与可靠性,通过JIT编译和垃圾回收机制提升效率;3)跨平台支持,.NETCore扩展了应用场景;4)实际应用广泛,从Web到桌面和游戏开发都有出色表现。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。