Redis有序集合(sorted set)使用

本文详细介绍了Redis的有序集合(sorted set)特性,包括其成员和分值的概念、常用命令的使用,如zadd、zrem、zscore、zincrby、zcard、zrank、zrevrank、zrange、zrevrange、zrangebyscore、zrevrangebyscore、zcount、zremrangebyrank、zremrangebyscore、zunionstore和zinterstore等。有序集合的成员按照分值大小排序,分值相同的成员按字典序排序。文章还提到了字典序命令zrangebylex、zrevrangebylex、zlexcount和zremrangebylex,适用于分值相同的情况。最后总结了有序集合的使用要点,如分值操作、集合与字典序操作等。
摘要由CSDN通过智能技术生成

有序集合说明

Redis的有序集合(sorted set),同时具有“有序”和“集合”两种性质,这种数据结构中的每个元素都由一个成员和和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。与集合一样,有序集合中的每一个成员都是独一无二的,同一个有序中不会出现重复的成员,与此同时有序集合的成员将按照他们各自的分值大小进行排序:比如分值为3.14的成员将小于分值为10.24的成员,而分值为10000的成员也会小于分支为10086的成员有序集合的分值,除了可以是数字之外,还可以是字符串"+inf "或者"-inf ",这两个特殊分值分别用于表示无穷大和无穷小。

记录薪水数据的有序集合


       需要注意的是,虽然同一个有序集合,不能存储相同的成员,但不同成员的分值却可以是相同的。当两个或多个成员拥有相同的分值时,Redis将按照这些成员在字典中的大小对其进行排序:举个例子,如果成员apple和成员zero都拥有相同的分值100,那么Redis将认为成员apple小于成员zero,这是因为在字典序中字母a开头的单词要小于字母Z开头的单词。

记录水果价格的有序集合


       有序集合是Redis提供的所有数据结构中最为灵活的一种,它可以以多种不同的方式存取数据,比如根据成员获取分值,根据分值获取成员,根据成员的排名获取成员,根据指定的分值范围,获取不同成员等。

有序集合通用命令使用

zadd:添加或更新成员

通过zadd命令用户,可以向有序集合中添加一个或多个新成员

zadd sorted-set score member [score member ...]

默认情况下,zadd命令将返回成功添加的新成员数量作为返回值。

上图示例,对于不存在的键salary执行zadd命令,将创建出一个包含4个成员的有序集合。

通过zadd命令新创建出来的有序集合salary


zadd命令除了可以向有序集合添加新成员之外,还可以对有序中已经存在的成员分值进行更新:在默认情况下,如果用户在执行zadd命令时,给定成员已经存在了分值并且给定的分值和成员现有的分值并不相同,那么zadd命令将使用给定的新分值去覆盖现有的旧分值。

举个例子,对于有序集合salary,之前tom薪水为2000,我们执行zadd salary 5000 tom命令

命令返回为0,因为这是一次更新操作,没有添加任何新成员,所以命令返回0

通过zadd命令更新后的有序集合salary

从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

有序集合salary

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个 Redis 有序集合的代码实例: ``` import redis # 连接 Redis 数据库 r = redis.Redis(host='localhost', port=6379, db=0) # 添加有序集合数据 r.zadd('my_sorted_set', {'member1': 1, 'member2': 2, 'member3': 3}) # 获取有序集合成员数量 count = r.zcard('my_sorted_set') print('成员数量:', count) # 获取有序集合成员分数区间内的成员数量 count_range = r.zcount('my_sorted_set', 2, 3) print('分数在2-3之间的成员数量:', count_range) # 获取有序集合成员分数 score = r.zscore('my_sorted_set', 'member1') print('member1的分数:', score) # 获取有序集合排名 rank = r.zrank('my_sorted_set', 'member2') print('member2的排名:', rank) # 获取有序集合反向排名 reverse_rank = r.zrevrank('my_sorted_set', 'member2') print('member2的反向排名:', reverse_rank) # 获取有序集合指定排名范围内的成员信息 range_data = r.zrange('my_sorted_set', 0, 1, withscores=True) print('排名在0-1之间的成员信息:', range_data) # 获取有序集合指定分数范围内的成员信息 range_by_score_data = r.zrangebyscore('my_sorted_set', 1, 3, withscores=True) print('分数在1-3之间的成员信息:', range_by_score_data) # 删除有序集合成员 r.zrem('my_sorted_set', 'member1') # 获取所有有序集合成员信息 members = r.zrange('my_sorted_set', 0, -1, withscores=True) print('所有成员信息:', members) # 删除有序集合 r.delete('my_sorted_set') ``` 上述代码演示了 Redis 有序集合的基本操作,包括添加数据、获取数据、删除数据等。通过这个实例,你可以更好地理解 Redis 有序集合使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值