热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nosql之Redis:zset(有序集)数据类型及操作命令

一:概述zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的集合,都不允许重复的成员出现在一个set中.两者的主要区别是zs

一:概述 zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的集合,都不允许重复的成员 出现在一个set中.两者的主要区别是zset的每一个成员都会有一个分数(score)与之关联.redis正是通过分数来为集合中的成员进行从小到大的排序.zset的成员是唯


一:概述

zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的集合,都不允许重复的成员

出现在一个set中.两者的主要区别是zset的每一个成员都会有一个分数(score)与之关联.redis正是通过分数来为集合中的成员进行从小到大的排序.zset的成员是唯一的,但分数(score)却可以重复.

在zset中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数.

Sorted-Sets中的成员在集合中的位置是有序的.

二:相关命令

1: zadd

命令格式: zadd key score member [[score] [member] …]

描述:将一个或多个 member 元素及其 score 值加入到有序集 key 当中.如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。

时间复杂度: O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量

返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

操作命令如下:

#添加一个元素

redis 127.0.0.1:6379> zadd zset_list 11 test1

(integer) 1

#添加多个元素

redis 127.0.0.1:6379> zadd zset_list 9 test2 10 test3

(integer) 2

#查看元素

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test2″

2) “9″

3) “test3″

4) “10″

5) “test1″

6) “11″

redis 127.0.0.1:6379> zrange zset_list 0 -1

1) “test2″

2) “test3″

3) “test1″

# 添加已存在元素,且 score 值不变 操作不成功返回0

redis 127.0.0.1:6379> zadd zset_list 10 test1

(integer) 0

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test2″

2) “9″

3) “test1″

4) “10″

5) “test3″

6) “10″

# 添加已存在元素,但是改变 score 值

redis 127.0.0.1:6379> zadd zset_list 7 test1

(integer) 0

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test1″

2) “7″

3) “test2″

4) “9″

5) “test3″

6) “10″

2:zrem

命令格式: ZREM key member [member ...]

描述:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

当 key 存在但不是有序集类型时,返回一个错误。

时间复杂度:O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量。

返回值:被成功移除的成员的数量,不包括被忽略的成员。

操作命令如下:

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test1″

2) “7″

3) “test2″

4) “9″

5) “test3″

6) “10″

#移除单个元素

redis 127.0.0.1:6379> zrem zset_list test1

(integer) 1

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test2″

2) “9″

3) “test3″

4) “10″

#移除多个

redis 127.0.0.1:6379> zrem zset_list test2 test3

(integer) 2

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

(empty list or set)

# 移除不存在元素

redis 127.0.0.1:6379> zrem zset_list non-exists-element

(integer) 0

3:zcard

描述:返回zset集合的成员数

时间复杂度:O(1)

返回值:当 key 存在且是有序集(zset)类型时,返回集合内的成员数。不存在返回0。

操作命令如下:

redis 127.0.0.1:6379> zcard zset_list

(integer) 0

redis 127.0.0.1:6379> zadd zset_list 1 test1

(integer) 1

redis 127.0.0.1:6379> zcard zset_list

(integer) 1

4:zcount

命令格式:ZCOUNT key min max

描述:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。

时间复杂度: O(log(N)+M), N 为有序集的基数, M 为值在 min 和 max 之间的元素的数量。

返回值:score 值在 min 和 max 之间的成员的数量。

操作命令如下:

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test1″

2) “1″

3) “test2″

4) “100″

5) “test3″

6) “200″

7) “test4″

Nosql之Redis:zset(有序集)数据类型及操作命令 - 文章图片 “300″

redis 127.0.0.1:6379> zcount zset_list 100 200

(integer) 2

redis 127.0.0.1:6379> zcount zset_list 100 300

(integer) 3

5: zscore

命令格式:ZSCORE key member

描述:返回有序集 key 中,成员 member 的 score 值。

如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

时间复杂度:O(1)

操作命令如下:

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test1″

2) “1″

3) “test2″

4) “100″

5) “test3″

6) “200″

7) “test4″

Nosql之Redis:zset(有序集)数据类型及操作命令 - 文章图片 “300″

redis 127.0.0.1:6379> zscore zset_list test2

“100″

6:zincrby

命令格式:ZINCRBY key increment member

描述:为有序集 key 的成员 member 的 score 值加上增量 increment 。

时间复杂度:O(log(N))

返回值: 返回member 成员的新 score 值,以字符串形式表示。

操作命令如下:

redis 127.0.0.1:6379> zscore zset_list test2

“100″

redis 127.0.0.1:6379>

redis 127.0.0.1:6379> zincrby zset_list 10 test2

“110″

redis 127.0.0.1:6379> zincrby zset_list -6 test2

“104″

7:zrange

命令格式: ZRANGE key start stop [WITHSCORES]

描述:返回指定区间的成员。其中成员位置按 score 值递增(从小到大)来排序。 WITHSCORES选项是用来让成员和它的score值一并返回.(在前面我们已经用到过)

时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。

返回值:返回指定区间的成员列表.

操作命令如下:

redis 127.0.0.1:6379> zrange zset_list 0 -1

1) “test1″

2) “test2″

3) “test3″

4) “test4″

redis 127.0.0.1:6379> zrange zset_list 0 -1 withscores

1) “test1″

2) “1″

3) “test2″

4) “104″

5) “test3″

6) “200″

7) “test4″

Nosql之Redis:zset(有序集)数据类型及操作命令 - 文章图片 “300″

#当给定区间不存在于有序集时的情况

redis 127.0.0.1:6379> zrange zset_list 10000 30000 withscores

(empty list or set)

7:zrevrange

命令格式:ZREVRANGE key start stop [WITHSCORES]

描述:和zrange一样使用,唯一不同是其成员位置按 score 值递减(从大到小)来排列。

8:zrangebyscore

命令格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

描述:返回有序集key中所有score值介于min与max之间(包括等于)的成员.成员按score值递增(从小到大)排列 。min 和 max 可以是 -inf 和 +inf

可选limit参数指定返回结果的数量及区间。

时间复杂度:O(log(N)+M), N 为有序集的基数, M 为被结果集的基数。

返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。

操作命令如下:

redis 127.0.0.1:6379> zrangebyscore zset_list -inf +inf

1) “test1″

2) “test2″

3) “test3″

4) “test4″

redis 127.0.0.1:6379> zrangebyscore zset_list -inf +inf withscores

1) “test1″

2) “1″

3) “test2″

4) “104″

5) “test3″

6) “200″

7) “test4″

Nosql之Redis:zset(有序集)数据类型及操作命令 - 文章图片 “300″

redis 127.0.0.1:6379> zrangebyscore zset_list -inf 100 withscores

1) “test1″

2) “1″

#显示大于100 小于等于700的成员

redis 127.0.0.1:6379> zrangebyscore zset_list (100 700

1) “test2″

2) “test3″

3) “test4″

#显示条件 100
redis 127.0.0.1:6379> zrangebyscore zset_list (100 (700

1) “test2″

2) “test3″

3) “test4″

8:zrevrangebyscore

命令格式: zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]

描述:和zrangebyscoreg一样,唯一不同的是成员按 score 值递减(从大到小)的次序排列。

9:zrank

命令格式: zrank key member

描述:返回有序集key中成员member的排名。成员按 score 值递增(从小到大)顺序排列。

排名以0开始,也就是说score 值最小的为0.

时间复杂度:O(log(N))

返回值:返回成员排名,member不存在返回nil.

9:zrevrank

命令格式: zrevrank key member

描述:返回有序集key中成员member的排名。成员按 score 值递增(从大到小)顺序排列。

排名以0开始,也就是说score 值最大的为0.

时间复杂度:O(log(N))

返回值:返回成员排名,member不存在返回nil.

10:zremrangebyrank

命令格式: ZREMRANGEBYRANK key start stop

描述:移除有序集 key 中,指定排名(rank)区间内的所有成员。区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。

返回值:被移除成员的数量。

11:zremrangebyscore

命令格式:zremrangebyscore key min max

描述:移除score值介于min和max之间(等于)的成员

时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。

返回值:被移除成员的数量。

操作如下:

# 移除所有score在 150 到 350 内的数据

redis> zremrangebyscore zset_list 100 200

(integer) 1

12:zunionstore

命令格式:ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

描述:计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。

12: zinterstore

命令格式:ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

描述:计算给定的一个或多个有序集的交集。其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。

时间复杂度:

O(N*K)+O(M*log(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。

返回值:保存到 destination 的结果集成员数。

操作命令如下:

redis 127.0.0.1:6379> zrange z_ulist_1 0 -1 withscores

1) “jack”

2) “20″

3) “abc”

4) “30″

5) “bb”

6) “50″

7) “cc”

Nosql之Redis:zset(有序集)数据类型及操作命令 - 文章图片 “50″

redis 127.0.0.1:6379> zadd z_ulist_2 20 bb 40 789 48 a980

(integer) 3

redis 127.0.0.1:6379> zinterstore z_ulist_x 2 z_ulist_1 z_ulist_2

(integer) 1

redis 127.0.0.1:6379> zrange z_ulist_x 0 -1 withscores

1) “bb”

2) “70″





推荐阅读
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 如何使用 `org.opencb.opencga.core.results.VariantQueryResult.getSource()` 方法及其代码示例详解 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
author-avatar
---残月_235_999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有