有序集合说明
Redis的有序集合(sorted set),同时具有“有序”和“集合”两种性质,这种数据结构中的每个元素都由一个成员和和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。与集合一样,有序集合中的每一个成员都是独一无二的,同一个有序中不会出现重复的成员,与此同时有序集合的成员将按照他们各自的分值大小进行排序:比如分值为3.14的成员将小于分值为10.24的成员,而分值为10000的成员也会小于分支为10086的成员有序集合的分值,除了可以是数字之外,还可以是字符串"+inf "或者"-inf ",这两个特殊分值分别用于表示无穷大和无穷小。
![](https://i-blog.csdnimg.cn/blog_migrate/508188f76fa8c78cbb1e567f3db1e0eb.jpeg)
需要注意的是,虽然同一个有序集合,不能存储相同的成员,但不同成员的分值却可以是相同的。当两个或多个成员拥有相同的分值时,Redis将按照这些成员在字典中的大小对其进行排序:举个例子,如果成员apple和成员zero都拥有相同的分值100,那么Redis将认为成员apple小于成员zero,这是因为在字典序中字母a开头的单词要小于字母Z开头的单词。
![](https://i-blog.csdnimg.cn/blog_migrate/9245a484eae6adfa755806f4e497493f.jpeg)
有序集合是Redis提供的所有数据结构中最为灵活的一种,它可以以多种不同的方式存取数据,比如根据成员获取分值,根据分值获取成员,根据成员的排名获取成员,根据指定的分值范围,获取不同成员等。
有序集合通用命令使用
zadd:添加或更新成员
通过zadd命令用户,可以向有序集合中添加一个或多个新成员
zadd sorted-set score member [score member ...]
默认情况下,zadd命令将返回成功添加的新成员数量作为返回值。
上图示例,对于不存在的键salary执行zadd命令,将创建出一个包含4个成员的有序集合。
![](https://i-blog.csdnimg.cn/blog_migrate/2371c0c23743401d23d7e350e65284c7.jpeg)
zadd命令除了可以向有序集合添加新成员之外,还可以对有序中已经存在的成员分值进行更新:在默认情况下,如果用户在执行zadd命令时,给定成员已经存在了分值并且给定的分值和成员现有的分值并不相同,那么zadd命令将使用给定的新分值去覆盖现有的旧分值。
举个例子,对于有序集合salary,之前tom薪水为2000,我们执行zadd salary 5000 tom命令
命令返回为0,因为这是一次更新操作,没有添加任何新成员,所以命令返回0
![](https://i-blog.csdnimg.cn/blog_migrate/cccc4a377aef2c7f519319bfb585deab.jpeg)
从Redis3.0.2版本开始,Redis允许用户在执行的命令是通过使用可选的xx选项或者nx选项来显示的指示命令只执行更新操作或只执行添加操作
zadd sorted-set [xx|nx] score member [score member ...]
这两个选项的功能如下:
- 在给定xx选项的情况下,zadd命令只会对给定成员当中已经存在于有序结合的成员进行更新,而那些不存在于有序集合的给定成员,则会被忽略。换句话说带有xx选项的zadd命令只会对有序集合已有的成员进行更新,而不会向有序集合添加任何新成员。
- 在给定nx选项的情况下,命令只会把给定成员当中不存在于有序集合的成员添加到有序集合里面,而那些已经存在于有序集合中的给定成员则会被忽略。换句话说这有nx选项的命令只会向有序集合添加新成员,而不会对已有的成员进行任何更新。
示例,对于集合salary,执行以下命令只会将成员jack的分值从原来4000调整为4500,而命令中出现的新成员bob则不会被添加到有序集合中
如果对集合salary,执行以下命令,则只会将原先集合salary中不存在的成员bob添加到集合中,而已经存在的成员jack的分值并不会被改变。
在默认情况下,zadd命令会返回新添加成员的数量作为返回值。但是从Redis3.0.2版本开始,用户可以通过给定ch选项,让命令返回参数被修改(changed)成员的数量作为返回值。
zadd sorted-set [ch] score member [score member ...]
"被修改成员"指的是新添加的有序集合的成员以及分值被更新的成员。
示例,对于有序集合salary,执行命令 zadd salary ch 3500 peter 4000 bob 9000 david
zrange 命令为查看集合所有键值对的命令,后面会说到。通过使用zrange命令查看salary集合成员,可以看到,被修改的成员为bob和david,前者的值从3800变为了4000,后者则被添加到有序集合中。与此相反,成员peter已经存在于集合中,并且它的值已经是3500,所以命令没有对它做任何修改。
zrem:移除指定的成员
通过使用zrem命令,用户可以从有序集合中移除指定的一个或多个成员,以及这些成员关联的分值。
zrem sorted-set member [member ...]
zrem命令会返回被移除成员的数量作为返回值
示例,通过下面命令,可以删除有序集合salary中一个成员
通过执行以下命令,可以删除有序集合中两个成员
如果用户给定的某个成员并不存在于有序集合中,那么zrem命令将会自动忽略该成员。
比如,执行以下命令并不会导致salary中任何元素被移除,因为这些元素都不存在与集合中
zscore:获取成员的分值
通过使用zscore命令,用户可以获取与给定成员相关联的分值。
zscore sorted-set member
![](https://i-blog.csdnimg.cn/blog_migrate/66e49d02443d417e533b2fed1937348c.jpeg)