这些Redis命令你都掌握了没?

本章主要内容

  • 字符串命令、列表命令和集合命令
  • 散列命令和有序集合命令
  • 发布命令与订阅命令
  • 其他命令

本章将介绍一些没有在第1章和第2章出现过的Redis命令,学习这些命令有助于读者在已有示例的基础上构建更为复杂的程序,并学会如何更好地去解决自己遇到的问题。本章将使用客户端与Redis服务器进行简单的互动,并以此来介绍命令的用法,如果读者想要看一些更为具体的代码示例,那么可以阅读第2章。

根据结构或者概念的不同,本章将多个命令分别放到了多个不同的节里面进行介绍,并且这里展示的命令都是各种应用程序最经常会用到的。和第1章介绍各个结构时的做法类似,本章也是通过与客户端进行互动的方式来介绍各个命令,在有需要的时候,文中还会说明本书在哪些章节用到了正在介绍的命令。

在每个不同的数据类型的章节里,展示的都是该数据类型所独有的、最具代表性的命令。首先让我们来看看,除了GETSET之外,Redis的字符串还支持哪些命令。

查阅本章未介绍命令的文档 患于未然,本章只会介绍最常用的Redis命令或者本书后续章节会用到的命令,如果读者需要一份完整的命令文档作为参考,那么可以访问http://redis.io/commands.

Redis 2.4和Redis 2.6 正如附录A所说,在本书编写之际,Windows平台上面只有Redis 2.4可用,而本书却会用到只有Redis 2.6或以上版本才支持的特性。Redis 2.4和Redis 2.6之间的主要区别包括(但不限于)Lua脚本(将在第11章介绍)、毫秒精度的过期操作(相关的PTTL命令、PEXPIRE命令和PEXPIREAT命令将在本章介绍)、一些二进制位操作(BITOP命令和BITCOUNT命令),另外还有一些在Redis 2.6以前只能接受单个参数的命令,比如RPUSHLPUSHSADDSREMHDELZADDZREM,从Redis 2.6开始都可以接受多个参数了。

3.1 字符串

本书在第1章和第2章曾经说过,Redis的字符串就是一个由字节组成的序列,它们和很多编程语言里面的字符串没有什么显著的不同,跟C或者C++风格的字符数组也相去不远。在Redis里面,字符串可以存储以下3种类型的值。

  • 字节串(byte string)。

  • 整数。

  • 浮点数。

用户可以通过给定一个任意的数值,对存储着整数或者浮点数的字符串执行自增(increment)或者自减(decrement)操作,在有需要的时候,Redis还会将整数转换成浮点数。整数的取值范围和系统的长整数(long integer)的取值范围相同(在32位系统上,整数就是32位有符号整数,在64位系统上,整数就是64位有符号整数),而浮点数的取值范围和精度则与IEEE 754标准的双精度浮点数(double)相同。Redis明确地区分字节串、整数和浮点数的做法是一种优势,比起只能够存储字节串的做法,Redis的做法在数据表现方面具有更大的灵活性。

本节将对Redis里面最简单的结构——字符串进行讨论,介绍基本的数值自增和自减操作,以及二进制位(bit)和子串(substring)处理命令,读者可能会惊讶地发现,Redis里面最简单的结构居然也有如此强大的作用。

表3-1展示了对Redis字符串执行自增和自减操作的命令。

表3-1 Redis中的自增命令和自减命令

命令用例和描述
INCRINCR key-name——将键存储的值加上1
DECRDECR key-name——将键存储的值减去1
INCRBYINCRBY key-name amount——将键存储的值加上整数amount
DECRBYDECRBY key-name amount——将键存储的值减去整数amount
INCRBYFLOATINCRBYFLOAT key-name amount——将键存储的值加上浮点数amount,这个命令在Redis 2.6或以上的版本可用

当用户将一个值存储到Redis字符串里面的时候,如果这个值可以被解释(interpret)为十进制整数或者浮点数,那么Redis会察觉到这一点,并允许用户对这个字符串执行各种INCR*DECR*操作。如果用户对一个不存在的键或者一个保存了空串的键执行自增或者自减操作,那么Redis在执行操作时会将这个键的值当作是0来处理。如果用户尝试对一个值无法被解释为整数或者浮点数的字符串键执行自增或者自减操作,那么Redis将向用户返回一个错误。代码清单3-1展示了对字符串执行自增操作和自减操作的一些例子。

代码清单3-1 这个交互示例展示了Redis的INCR操作和DECR操作

在这里插入图片描述

在读完本书其他章节之后,读者可能会发现本书只调用了 incr(),这是因为 Python的Redis库在内部使用INCRBY命令来实现incr()方法,并且这个方法的第二个参数是可选的:如果用户没有为这个可选参数设置值,那么这个参数就会使用默认值1。在编写本书的时候,Python的Redis客户端库支持Redis 2.6的所有命令,这个库通过incrbyfloat()方法来实现INCRBYFLOAT命令,并且incrbyfloat()方法也有类似于incr()方法的可选参数特性。

除了自增操作和自减操作之外,Redis还拥有对字节串的其中一部分内容进行读取或者写入的操作(这些操作也可以用于整数或者浮点数,但这种用法并不常见),本书在第9章将展示如何使用这些操作来高效地将结构化数据打包(pack)存储到字符串键里面。表3-2展示了用来处理字符串子串和二进制位的命令。

表3-2 供Redis处理子串和二进制位的命令

命令用例和描述
APPENDAPPEND key-name value——将值value追加到给定键key-name当前存储的值的末尾
GETRANGEGETRANGE key-name start end——获取一个由偏移量start至偏移量end范围内所有字符组成的子串,包括startend在内
SETRANGESETRANGE key-name offset value——将从start偏移量开始的子串设置为给定值
GETBITGETBIT key-name offset——将字节串看作是二进制位串(bit string),并返回位串中偏移量为offset的二进制位的值
SETBITSETBIT key-name offset value——将字节串看作是二进制位串,并将位串中偏移量为offset的二进制位的值设置为value
BITCOUNTBITCOUNT key-name [start end]——统计二进制位串里面值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围内的二进制位进行统计
BITOPBITOP operation dest-key key-name [key-name ...]——对一个或多个二进制位串执行包括并(AND)、或(OR)、异或(XOR)、非(NOT)在内的任意一种按位运算操作(bitwise operation),并将计算得出的结果保存在dest-key键里面

GETRANGE和SUBSTR Redis现在的GETRANGE命令是由以前的SUBSTR命令改名而来的,因此,Python客户端至今仍然可以使用substr()方法来获取子串,但如果读者使用的是2.6或以上版本的Redis,那么最好还是使用getrange()方法来获取子串。

在使用SETRANGE或者SETBIT命令对字符串进行写入的时候,如果字符串当前的长度不能满足写入的要求,那么Redis会自动地使用空字节(null)来将字符串扩展至所需的长度,然后才执行写入或者更新操作。在使用GETRANGE读取字符串的时候,超出字符串末尾的数据会被视为是空串,而在使用GETBIT读取二进制位串的时候,超出字符串末尾的二进制位会被视为是0。代码清单3-2展示了一些字符串处理命令的使用示例。

代码清单3-2 这个交互示例展示了Redis的子串操作和二进制位操作

在这里插入图片描述

很多键值数据库只能将数据存储为普通的字符串,并且不提供任何字符串处理操作,有一些键值数据库允许用户将字节追加到字符串的前面或者后面,但是却没办法像Redis一样对字符串的子串进行读写。从很多方面来讲,即使Redis只支持字符串结构,并且只支持本节列出的字符串处理命令,Redis也比很多别的数据库要强大得多;通过使用子串操作和二进制位操作,配合WATCH命令、MULTI命令和EXEC命令(本书的3.7.2节将对这3个命令进行初步的介绍,并在第4章对它们进行更深入的讲解),用户甚至可以自己动手去构建任何他们想要的数据结构。第9章将介绍如何使用字符串去存储一种简单的映射,这种映射可以在某些情况下节省大量内存。

只要花些心思,我们甚至可以将字符串当作列表来使用,但这种做法能够执行的列表操作并不多,更好的办法是直接使用下一节介绍的列表结构,Redis为这种结构提供了丰富的列表操作命令。

3.2 列表

在第1章曾经介绍过,Redis的列表允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作。除此之外,列表还可以用来存储任务信息、最近浏览过的文章或者常用联系人信息。

本节将对列表这个由多个字符串值组成的有序序列结构进行介绍,并展示一些最常用的列表处理命令,阅读本节可以让读者学会如何使用这些命令来处理列表。表3-3展示了其中一部分最常用的列表命令。

表3-3 一些常用的列表命令

命令用例和描述
RPUSHRPUSH key-name value [value ...]——将一个或多个值推入列表的右端
LPUSHLPUSH key-name value [value ...]——将一个或多个值推入列表的左端
RPOPRPOP key-name——移除并返回列表最右端的元素
LPOPLPOP key-name——移除并返回列表最左端的元素
LINDEXLINDEX key-name offset——返回列表中偏移量为offset的元素
LRANGELRANGE key-name start end——返回列表从start偏移量到end偏移量范围内的所有元素,其中偏移量为start和偏移量为end的元素也会包含在被返回的元素之内
LTRIMLTRIM key-name start end——对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,其中偏移量为start和偏移量为end的元素也会被保留

因为本书在第1章已经对列表的几个推入和弹出操作进行了简单的介绍,所以读者应该不会对上面列出的推入和弹出操作感到陌生,代码清单3-3展示了这些操作的用法。

代码清单3-3 这个交互示例展示了Redis列表的推入操作和弹出操作

在这里插入图片描述

这个示例里面第一次用到了LTRIM命令,组合使用LTRIMLRANGE可以构建出一个在功能上类似于LPOP或者RPOP的操作,它能够一次返回并弹出多个元素。本章稍后将会介绍原子地执行多个命令的方法,而更高级的Redis事务特性则会在第4章介绍。

有几个列表命令可以将元素从一个列表移动到另一个列表,或者阻塞(block)执行命令的客户端直到有其他客户端给列表添加元素为止,这些命令在第1章都没有介绍过,表3-4列出了这些阻塞弹出命令和元素移动命令。

表3-4 阻塞式的列表弹出命令以及在列表之间移动元素的命令

命令用例和描述
BLPOPBLPOP key-name [key-name ...] timeout——从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
BRPOPBRPOP key-name [key-name ...] timeout——从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
RPOPLPUSHRPOPLPUSH source-key dest-key——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素
BRPOPLPUSHBRPOPLPUSH source-key dest-key timeout——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出的元素出现

在第6章讨论队列时,这组命令将会非常有用。代码清单3-4展示了几个使用BRPOPLPUSH移动列表元素的例子以及使用BLPOP从列表里面弹出多个元素的例子。

代码清单3-4 这个交互示例展示了Redis列表的阻塞弹出命令以及元素移动命令

在这里插入图片描述

对于阻塞弹出命令和弹出并推入命令,最常见的用例就是消息传递(messaging)和任务队列(task queue),本书将在第6章对这两个主题进行介绍。

练习:通过列表来降低内存占用

在2.1节和2.5节中,我们使用了有序集合来记录用户最近浏览过的商品,并把用户浏览这些商品时的时间戳设置为分值,从而使得程序可以在清理旧会话的过程中或是执行完购买操作之后,进行相应的数据分析。但由于保存时间戳需要占用相应的空间,所以如果分析操作并不需要用到时间戳的话,那么就没有必要使用有序集合来保存用户最近浏览过的商品了。为此,请在保证语义不变的情况下,将update_token()函数里面使用的有序集合替换成列表。提示:如果读者在解答这个问题时遇上困难的话,可以到6.1.1节中找找灵感。

列表的一个主要优点在于它可以包含多个字符串值,这使得用户可以将数据集中在同一个地方。Redis的集合也提供了与列表类似的特性,但集合只能保存各不相同的元素。接下来的一节中就让我们来看看不能保存相同元素的集合都能做些什么。

3.3 集合

Redis的集合以无序的方式来存储多个各不相同的元素,用户可以快速地对集合执行添加元素操作、移除元素操作以及检查一个元素是否存在于集合里。第1章曾经对集合进行过简单的介绍,并在构建文章投票网站时,使用集合记录文章已投票用户名单以及群组属下的所有文章。

本节将对最常用的集合命令进行介绍,包括插入命令、移除命令、将元素从一个集合移动到另一个集合的命令,以及对多个集合执行交集运算、并集运算和差集运算的命令。阅读本节也有助于读者更好地理解本书在第7章介绍的搜索示例。

表3-5展示了其中一部分最常用的集合命令。

表3-5 一些常用的集合命令

命令用例和描述
SADDSADD key-name item [item ...]——将一个或多个元素添加到集合里面,并返回被添加元素当中原本并不存在于集合里面的元素数量
SREMSREM key-name item [item ...]——从集合里面移除一个或多个元素,并返回被移除元素的数量
SISMEMBERSISMEMBER key-name item——检查元素item是否存在于集合key-name
SCARDSCARD key-name——返回集合包含的元素的数量
SMEMBERSSMEMBERS key-name——返回集合包含的所有元素
SRANDMEMBERSRANDMEMBER key-name [count]——从集合里面随机地返回一个或多个元素。当count为正数时,命令返回的随机元素不会重复;当count为负数时,命令返回的随机元素可能会出现重复
SPOPSPOP key-name——随机地移除集合中的一个元素,并返回被移除的元素
SMOVESMOVE source-key dest-key item——如果集合source-key包含元素item,那么从集合source-key里面移除元素item,并将元素item添加到集合dest-key中;如果item被成功移除,那么命令返回1,否则返回0

表3-5里面的不少命令都已经在第1章介绍过了,代码清单3-5展示了这些命令的使用示例。

代码清单3-5 这个交互示例展示了Redis中的一些常用的集合命令

在这里插入图片描述

通过使用上面展示的命令,我们可以将各不相同的多个元素添加到集合里面,比如第1章就使用集合记录了文章已投票用户名单,以及文章属于哪个群组。但集合真正厉害的地方在于组合和关联多个集合,表3-6展示了相关的命令。

表3-6 用于组合和处理多个集合的Redis命令

命令用例和描述
SDIFFSDIFF key-name [key-name ...]——返回那些存在于第一个集合、但不存在于其他集合中的元素(数学上的差集运算)
SDIFFSTORESDIFFSTORE dest-key key-name [key-name ...]——将那些存在于第一个集合但并不存在于其他集合中的元素(数学上的差集运算)存储到dest-key键里面
SINTERSINTER key-name [key-name ...]——返回那些同时存在于所有集合中的元素(数学上的交集运算)
SINTERSTORESINTERSTORE dest-key key-name [key-name ...]——将那些同时存在于所有集合的元素(数学上的交集运算)存储到dest-key键里面
SUNIONSUNION key-name [key-name ...]——返回那些至少存在于一个集合中的元素(数学上的并集计算)
SUNIONSTORESUNIONSTORE dest-key key-name [key-name ...]——将那些至少存在于一个集合中的元素(数学上的并集计算)存储到dest-key键里面

这些命令分别是并集运算、交集运算和差集运算这3个基本集合操作的“返回结果”版本和“存储结果”版本,代码清单3-6展示了这些命令的使用示例。

代码清单3-6 这个交互示例展示了Redis的差集运算、交集运算以及并集运算

在这里插入图片描述

和Python的集合相比,Redis的集合除了可以被多个客户端远程地进行访问之外,其他的语义和功能基本都是相同的。

接下来的一节将对Redis的散列处理命令进行介绍,这些命令允许用户将多个相关的键值对存储在一起,以便执行获取操作和更新操作。

3.4 散列

第1章提到过,Redis的散列可以让用户将多个键值对存储到一个Redis键里面。从功能上来说,Redis为散列值提供了一些与字符串值相同的特性,使得散列非常适用于将一些相关的数据存储在一起。我们可以把这种数据聚集看作是关系数据库中的行,或者文档数据库中的文档。

本节将对最常用的散列命令进行介绍:其中包括添加和删除键值对的命令、获取所有键值对的命令,以及对键值对的值进行自增或者自减操作的命令。阅读这一节可以让读者学习到如何将数据存储到散列里面,以及这样做的好处是什么。表3-7展示了一部分常用的散列命令。

表3-7 用于添加和删除键值对的散列操作

命令用例和描述
HMGETHMGET key-name key [key ...]——从散列里面获取一个或多个键的值
HMSETHMSET key-name key value [key value ...]——为散列里面的一个或多个键设置值
HDELHDEL key-name key [key ...]——删除散列里面的一个或多个键值对,返回成功找到并删除的键值对数量
HLENHLEN key-name——返回散列包含的键值对数量

在表3-7列出的命令当中,HDEL命令已经在第1章中介绍过了,而HLEN命令以及用于一次读取或者设置多个键的HMGETHMSET则是新出现的命令。像HMGETHMSET这种批量处理多个键的命令既可以给用户带来方便,又可以通过减少命令的调用次数以及客户端与Redis之间的通信往返次数来提升Redis的性能。代码清单3-7展示了这些命令的使用方法。

代码清单3-7 这个交互示例展示了Redis中的一些常用的散列命令

在这里插入图片描述
第1章介绍的HGET命令和HSET命令分别是HMGET命令和HMSET命令的单参数版本,这些命令的唯一区别在于单参数版本每次执行只能处理一个键值对,而多参数版本每次执行可以处理多个键值对。

表3-8列出了散列的其他几个批量操作命令,以及一些和字符串操作类似的散列命令。

表3-8 展示Redis散列的更高级特性

命令用例和描述
HEXISTSHEXISTS key-name key——检查给定键是否存在于散列中
HKEYSHKEYS key-name——获取散列包含的所有键
HVALSHVALS key-name——获取散列包含的所有值
HGETALLHGETALL key-name——获取散列包含的所有键值对
HINCRBYHINCRBY key-name key increment——将键key保存的值加上整数increment
HINCRBYFLOATHINCRBYFLOAT key-name key increment——将键key保存的值加上浮点数increment

尽管有HGETALL存在,但HKEYSHVALUES也是非常有用的:如果散列包含的值非常大,那么用户可以先使用HKEYS取出散列包含的所有键,然后再使用HGET一个接一个地取出键的值,从而避免因为一次获取多个大体积的值而导致服务器阻塞。

HINCRBYHINCRBYFLOAT可能会让读者回想起用于处理字符串的INCRBYINCRBYFLOAT,这两对命令拥有相同的语义,它们的不同在于HINCRBYHINCRBYFLOAT处理的是散列,而不是字符串。代码清单3-8展示了这些命令的使用方法。

代码清单3-8 这个交互示例展示了Redis散列的一些更高级的特性
在这里插入图片描述

正如前面所说,在对散列进行处理的时候,如果键值对的值的体积非常庞大,那么用户可以先使用HKEYS获取散列的所有键,然后通过只获取必要的值来减少需要传输的数据量。除此之外,用户还可以像使用SISMEMBER检查一个元素是否存在于集合里面一样,使用HEXISTS检查一个键是否存在于散列里面。另外第1章也用到了本节刚刚回顾过的HINCRBY来记录文章被投票的次数。

在接下来的一节中,我们要了解的是之后的章节里面会经常用到的有序集合结构。

3.5 有序集合

和散列存储着键与值之间的映射类似,有序集合也存储着成员与分值之间的映射,并且提供了分值处理命令,以及根据分值大小有序地获取(fetch)或扫描(scan)成员和分值的命令。本书曾在第1章使用有序集合实现过基于发表时间排序的文章列表和基于投票数量排序的文章列表,还在第2章使用有序集合存储过cookie的过期时间。

本节将对操作有序集合的命令进行介绍,其中包括向有序集合添加新元素的命令、更新已有元素的命令,以及对有序集合进行交集运算和并集运算的命令。阅读本节可以加深读者对有序集合的认识,从而帮助读者更好地理解本书在第1章、第5章、第6章和第7章展示的有序集合示例。

表3-9展示了一部分常用的有序集合命令。

表3-9 一些常用的有序集合命令

命令用例和描述
ZADDZADD key-name score member [score member ...]——将带有给定分值的成员添加到有序集合里面
ZREMZREM key-name member [member ...]——从有序集合里面移除给定的成员,并返回被移除成员的数量
ZCARDZCARD key-name——返回有序集合包含的成员数量
ZINCRBYZINCRBY key-name increment member——将member成员的分值加上increment
ZCOUNTZCOUNT key-name min max——返回分值介于minmax之间的成员数量
ZRANKZRANK key-name member——返回成员member有序集合中的排名
ZSCOREZSCORE key-name member——返回成员member的分值
ZRANGEZRANGE key-name start stop [WITHSCORES]——返回有序集合中排名介于startstop之间的成员,如果给定了可选的WITHSCORES选项,那么命令会将成员的分值也一并返回

在上面列出的命令当中,有一部分命令已经在第1章和第2章使用过了,所以读者应该不会对它们感到陌生,代码清单3-9回顾了这些命令的用法。

代码清单3-9 这个交互示例展示了Redis中的一些常用的有序集合命令

在这里插入图片描述

因为ZADDZREMZINCRBYZSCOREZRANGE都已经在第1章和第2章介绍过了,所以读者应该不会对它们感到陌生。ZCOUNT命令和其他命令不太相同,它主要用于计算分值在给定范围内的成员数量。

表3-10展示了另外一些非常有用的有序集合命令。

表3-10 有序集合的范围型数据获取命令和范围型数据删除命令,以及并集命令和交集命令

命令用例和描述
ZREVRANKZREVRANK key-name member——返回有序集合里成员member所处的位置,成员按照分值从大到小排列
ZREVRANGEZREVRANGE key-name start stop [WITHSCORES]——返回有序集合给定排名范围内的成员,成员按照分值从大到小排列
ZRANGEBYSCOREZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]——返回有序集合中,分值介于minmax之间的所有成员
ZREVRANGEBYSCOREZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]——获取有序集合中分值介于minmax之间的所有成员,并按照分值从大到小的顺序来返回它们
ZREMRANGEBYRANKZREMRANGEBYRANK key-name start stop——移除有序集合中排名介于startstop之间的所有成员
ZREMRANGEBYSCOREZREMRANGEBYSCORE key-name min max——移除有序集合中分值介于minmax之间的所有成员
ZINTERSTOREZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM\|MIN\|MAX]——对给定的有序集合执行类似于集合的交集运算
ZUNIONSTOREZUNIONSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM\|MIN\|MAX]——对给定的有序集合执行类似于集合的并集运算

在表3-10展示的命令里面,有几个是之前没介绍过的新命令。除了使用逆序来处理有序集合之外,ZREV*命令的工作方式和相对应的非逆序命令的工作方式完全一样(逆序就是指元素按照分值从大到小地排列)。代码清单3-10展示了ZINTERSTOREZUNIONSTORE的用法。

代码清单3-10 这个交互示例展示了ZINTERSTORE命令和ZUNIONSTORE命令的用法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxLLnkPo-1582278773582)(http://write.epubit.com:9000/api/storage/getbykey/original?key=1605e5d3a8acf464014a)]

有序集合的并集运算和交集运算在刚开始接触时可能会比较难懂,所以本节将使用图片来展示交集运算和并集运算的执行过程。图3-1展示了对两个输入有序集合执行交集运算并得到输出有序集合的过程,这次交集运算使用的是默认的聚合函数sum,所以输出有序集合成员的分值都是通过加法计算得出的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3TWIvdP-1582278773583)(http://write.epubit.com:9000/api/storage/getbykey/original?key=16058e0db83719a8ec02)]

图3-1 执行conn.zinterstore('zset-i', ['zset-1', 'zset-2'])将使得同时存在于zset-1zset-2里面的元素被添加到zset-i里面

并集运算和交集运算不同,只要某个成员存在于至少一个输入有序集合里面,那么这个成员就会被包含在输出有序集合里面。图3-2展示了使用聚合函数min执行并集运算的过程,min函数在多个输入有序集合都包含同一个成员的情况下,会将最小的那个分值设置为这个成员在输出有序集合的分值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePjIzKPz-1582278773585)(http://write.epubit.com:9000/api/storage/getbykey/original?key=16058cc8dff70b2633b9)]

图3-2 执行conn.zunionstore('zset-u', ['zset-1', 'zset-2'], aggregate='min')会将存在于zset-1或者zset-2里面的元素通过min函数组合到zset-u里面

在第1章中,我们就基于“集合可以作为ZUNIONSTORE操作和ZINTERSTORE操作的输入”这个事实,在没有使用额外的有序集合来存储群组文章的评分和发布时间的情况下,实现了群组文章的添加和删除操作。图3-3展示了如何使用ZUNIONSTORE命令来将两个有序集合和一个集合组合成一个有序集合。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyWe2Fc2-1582278773585)(http://write.epubit.com:9000/api/storage/getbykey/original?key=16050b64512ec23fd710)]

图3-3 执行conn.zunionstore('zset-u2', ['zset-1', 'zset-2', 'set-1'])将使得所有存在于zset-1zset-2或者set-1里面的元素都被添加到zset-u2里面

第7章将使用ZINTERSTOREZUNIONSTORE来构建几个不同类型的搜索系统,并说明如何通过可选的WEIGHTS参数来以几种不同的方式组合有序集合的分值,从而使得集合和有序集合可以用于解决更多问题。

读者在开发应用的过程中,也许曾经听说过发布与订阅(publish/subscribe)模式,又称pub/sub模式,Redis也实现了这种模式,接下来的一节将对其进行介绍。

本文摘自《Redis实战》,【美】Josiah L. Carlson(约西亚 L.卡尔森)著,黄健宏译。近期本书在京东做半价促销,如果喜欢可以入手

本书对Redis本身以及它的键值对模型进行了介绍,读者将接触到包括缓存、分布式广告定向等实际使用案例,学到如何从小型的作业任务开始,扩展Redis以适应大规模的数据集,以及如何与其他传统的关系数据库或是其他NoSQL存储系统进行集成。有经验的开发者应该会对集群和服务器脚本编程等较为深入的内容感兴趣。

本书主要内容

  • 全面介绍Redis

  • 预处理实时数据

  • 管理内存数据集

  • 发布/订阅及配置

  • 持久化到磁盘

本书面向熟悉数据库概念的开发者。阅读本书既不要求读者预先了解NoSQL数据库概念,也不要求读者有任何Redis使用经验。本书也适合具备编程能力的系统管理员阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值