Redis入门指南 第3章 Redis的5种主要数据类型及相应的命令(四) 集合类型

Redis入门指南 第3章 Redis的5种主要数据类型及相应的命令(四) 集合类型

一、介绍

  • 集合的概念大家应该都很熟悉了,在集合中的每个元素都是不同的,而且没有顺序。集合类型的常用操作是向集合中加入或者删除元素、判断某个元素是否存在等,由于集合类型在 Redis 内部是使用值为空的散列表实现的,所以这些操作的时间复杂度都是 O(1)。最方便的是多个集合类型键之间还可以进行交集、并集和差集运算

二、命令

  • 1.增加/删除元素

    • SADD 命令用来向集合中增加一个或者多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。该命令的返回值是成功加入的元素数量(忽略的元素不计算在内)。用法如下:

      redis> SADD letters a
      (integer) 1
      redis> SADD letters a b c
      (integer) 2
      
    • 第二条 SADD 命令的返回值为 ”2“,这是因为元素 ”a“ 已经存在于 letters 集合中,所以实际上只加入了两个新的元素

    • SREM 命令用来从集合中删除一个或者多个元素,并返回删除成功的个数,例如:

      redis> SREM letters c d
      (integer) 1
      
    • 由于元素 “d” 不存在于该集合中,所以只成功删除了一个元素,即返回值为 1

  • 2.获得集合中的所有元素

    • SMEMBERS 命令会返回集合中的所有元素,用法如下:

      redis> SMEMBERS letters
      1) "b"
      2) "a"
      
  • 3.判断元素是否在集合中

    • SISMEMBER 命令用来判断一个元素是否在集合中,它的时间复杂度为 O(1)O(1)O(1)。当值存在时该命令返回 1,当值不存在或者键不存在时则返回 0。用法如下:

      redis> SISMEMBER letters a
      (integer) 1
      redis> SISMENBER letters d
      (integer) 0
      
  • 4.集合间运算

  • (1)SDIFF

    • SDIFF 命令用来对多个集合执行差集运算。集合 A 与集合 B 的差集表示为 ABA - BA−B,代表所有属于 A 且不属于 B 的元素构成的集合。其用法如下:

      redis> SADD setA 1 2 3
      (integer) 3
      redis> SADD setB 2 3 4
      (integer) 3
      redis> SDIFF setA setB
      1) "1"
      redis> SDIFF setB setA
      1) "4"
      
    • SDIFF 命令支持同时传入多个键,例如:

      redis> SADD setC 2 3
      (integer) 2
      redis> SDIFF setA setB setC
      1) "1"
      
    • 计算顺序是先计算 setAsetBsetA - setBsetA−setB,再计算结果与 setC 的差集

  • (2)SINTER

    • SINTER 命令用来对多个集合执行交集操作。集合 A 与集合 B 的交集表示为 ABA \cap BA∩B,代表所有属于 A 且属于 B 的元素构成的集合。其用法如下:

      redis> SINTER setA setB
      1) "2"
      2) "3"
      
    • SINTER 命令同样支持同时传入多个键,例如:

      redis> SINTER setA setB setC
      1) "2"
      2) "3"
      
  • (3)SUNION

    • SUNION 命令用来对多个集合执行并集运算。集合 A 与集合 B 的并集表示为 ABA \cup BA∪B,代表所有属于 A 或者属于 B 的元素构成的集合。其用法如下:

      redis> SUNION setA setB
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      
    • SUNION 命令同样支持同时传入多个键,例如:

      redis> SUNION setA setB setC
      1) "1"
      2) "2"
      3) "3"
      4) "4"
      
  • 5.获得集合中元素个数

    • SCARD 命令用来获得集合中的元素个数,例如:

      redis> SMEMBERS letters
      1) "b"
      2) "a"
      redis> SCARD letters
      (integer) 2
      
  • 6.进行集合运算并将结果存储

    SDIFFSTORE destination key [key...]
    SINTERSTORE destination key [key...]
    SUNIONSTORE destination key [key...]
    
    # SDIFFSTORE 命令和 SDIFF 命令功能一样
    # 唯一的不同之处就是前者不会直接返回运算结果,而是将结果存储在 destination 键中
    # SINTERSTORE、SUNIONSTORE 与之相似
    
  • 7.随机获得集合中的元素

    • SRANDMEMBER 命令用来随机从集合中获取一个元素,用法如下:

      redis> SRANDMENBER letters
      "a"
      redis> SRANDMENBER letters
      "b"
      redis> SRANDMENBER letters
      "c"
      
    • 还可以传递 count 参数来一次随机获得多个元素,根据 count 的正负,具体表现也不同

      • 1)当 count 为正数时,SRANDMEMBER 会随机从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则 SRANDMEMBER 会返回集合中的所有元素

      • 2)当 count 为负数时,SRANDMEMBER 会随机从集合里获得 count|count|∣count∣ 个元素,这些元素有可能相同

    • 例如:

      redis> SRANDMENBER letters 2
      1) "a"
      2) "c"
      
  • 8.从集合中弹出一个元素

    • 在之前讲解过 LPOP 命令和 RPOP 命令,分别是从列表的左边和右边弹出一个元素(即返回该值并从列表中将其删除)。SPOP 命令的功能与之类似,但是因为集合类型的元素是无序的,所以 SPOP 命令会从集合中随机选择一个元素弹出,例如:

      redis> SPOP letters
      "b"
      redis> SMEMBERS 
      1) "a"
      2) "c"
      2) "d"
      
上一篇:Asp.NET笔记


下一篇:php – MySQL – 不区分大小写的搜索