继续Redis学习笔记(二)来说说剩余的三种数据类型。

三、列表类型(List)

  1.介绍

  列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段。列表类型内部是使用双向链表实现的,所以操作列表两端的字符串速度会很快。

  2.命令

    1)向列表两端添加元素

    LPUSH key value [value...]    RPUSH key value [value...]

    LPUSH  key value [value...] 是向列表左边添加元素,添加多个元素的话依次向列表左边添加。

    RPUSH  key value [value...] 是向列表右边添加元素,添加多个元素的话依次向列表右边添加。两个命令的返回值都是列表的长度。

    

redis能创建新的数据库吗_集合类型

    从下图大家就可以明白具体过程:

    

redis能创建新的数据库吗_集合类型_02

redis能创建新的数据库吗_集合类型_03

redis能创建新的数据库吗_redis能创建新的数据库吗_04

    2)获取列表中元素的个数

    LLEN key

    返回值为列表的长度,当键不存在时会返回0。

    3)获得列表片段

    LRANGE key start stop

    此命令是返回列表中索引从start到stop之间的所有元素,包括两端的元素。Redis的列表索引从左边由0开始,右边由-1开始。那么 LRANGE key 0 -1 就可以查看列表中的所有元素了,特别的,如果start的索引位置比stop的索引位置靠后,则会返回空列表;如果stop大于实际的索引范围,则会返回到列表最右边的元素。

    4)从列表两端弹出元素

    LPOP key 和  RPOP key

    它们的返回值是被弹出(移除)元素的值。示例如下:

    

redis能创建新的数据库吗_字符串_05

    5)删除列表中指定的值

    LREM key count value

    此命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数,当然count也可以为负数。

      当count>0时,LREM命令会从列表的左边开始删除前count个值为value的元素;

      当count<0时,LREM命令会从列表的左边开始删除前|count|个值为value的元素;

      当count=0时,LREM命令会删除列表中所有值为value的元素。

       

redis能创建新的数据库吗_redis能创建新的数据库吗_06

      LREM numbers 2 3 表示从numbers列表的左边开始删除前两个值为3的元素;LREM numbers -2 -1 表示从numbers列表的右边删除前两个值为-1的元素;返回值为2表示              成功删除了2个元素。

     6)获得/设置指定索引的元素值

    LINDEX key index    LSET key index  value

    LINDEX 命令用来返回指定索引的元素值,索引从0(左边第一位)和-1(右边第一位)开始。

    LSET 命令会将索引为index的元素赋值为value。示例如下:

    

redis能创建新的数据库吗_集合类型_07

    7)只保留列表指定片段

    LTRIM key start end

    此命令用来删除指定索引范围之外的所有元素,只保留指定索引范围之内的元素,其指定索引范围的方法和LRANGE 命令一样。

    8)向列表中插入元素

     LINSERT key BEFORE|AFTER pivot value

    LINSERT 命令首先会在列表中查询值为pivot的元素,然后根据BEFORE|AFTER来决定是把value插入到pivot的前面还是后面。返回值为执行插入操作后,列表的元素个数。

    

redis能创建新的数据库吗_redis能创建新的数据库吗_08

    9)将元素从一个列表转移到另一个列表

     RPOPLPUSH source destinntion

    RPOPLPUSH 命令会先从source 列表的右边弹出一个元素,然后将其加入到destination列表的左边,并返回这个元素的值。当然source和destination是可以相同的。

四、集合类型(Set)

  1.介绍

  集合类型在Redis中是使用值为空的散列表(hash table)实现的。在集合中的每个元素都是不同的,且没有顺序。一个集合类型的数据至多可以存储2的32次方-1个字符串。

  集合类型和列表类型有很多的相似之处,对比如下:

  

redis能创建新的数据库吗_字符串_09

  2.命令

    1)SADD key member [member1 ...]    SREM key member [member1 ...]

    SADD 命令用来向集合中添加一个或多个元素,如果键不存在则会创建该键。又因为Set中是没有重复的元素的,所以如果要添加的元素已经在集合中存在,则会自动忽略掉这个元        素。返回值为成功添加的元素个数(忽略的元素不计)。

    SREM 命令用来从集合中删除一个或多个元素,返回值为成功删除的元素个数。示例如下:

    

redis能创建新的数据库吗_有序集合_10

    第二条SADD命令返回值为2,是因为元素a在第一次SADD命令中已经添加了。SREM命令返回值为1是因为集合中没有c这个元素。

    2)获得集合中的所有元素,以及判断元素是否在集合中

    SMEMBERS key      SISMEMBER key member

    SMEMBERS 命令会返回集合中所有的元素;SISMEMBER 命令用来判断集合中是否存在member元素,当值存在时返回值为1,否则为0。

    3)集合间的运算

    SDIFF key [key···]

    此命令用于对多个集合取差集。示例如下:

    

redis能创建新的数据库吗_字符串_11

    注意:SDIFF setA setB 表示结果为A-B,如下图所示;SDIFF setB setA 表示结果为B-A,从上图可以看出结果不同。

    

redis能创建新的数据库吗_redis能创建新的数据库吗_12

    SINTER key [key···]

    SINTER 命令用来对多个集合取交集运算。示例如下图:

    

redis能创建新的数据库吗_集合类型_13

    

redis能创建新的数据库吗_集合类型_14

    SUNION key [key···]

    此命令用于对多个集合进行并集运算。示例如下:

    

redis能创建新的数据库吗_集合类型_15

    

redis能创建新的数据库吗_redis能创建新的数据库吗_16

    SDIFFSTORE destination key [key···]      SINTERSTORE destination key [key···]      SUNIONSTORE destination key [key···]

    以上3个命令和之前的3个集合间运算的命令用法基本一致,区别仅仅在于*STORE 命令不会直接返回结果,而是将结果存储在destination 键中,常用与需要进行多步集合运算的场   景中。

    4)获得集合中元素个数

    SCARD key

    SCARD命令用来获得集合中的元素个数。

    5)随机获得集合中的元素

    SRANDMEMBER key [count]

    SRANDMEMBER 命令用来从集合中随机获得元素,[count]参数可以指定一次获得几个元素,根据count的正负不同,具体表现也不同。

    当count>0时,SRANDMEMBER 会随机从集合里获得count个不重复的元素。如果count的值大于集合中的元素个数,那么SRANDMEMBER 会返回集合中所有的元素。

    当count<0时,SRANDMEMBER 会随机从集合里获得|count|个元素,这些元素有可能相同。

    6)从集合中弹出一个元素

    SPOP key

    SPOP 命令与LPOP 命令作用类似,区别是LPOP是List的命令,是从列表左边弹出一个元素(List有序)。SPOP是Set的命令,由于Set的元素是无序的,所以SPOP命令会从集合中随       机弹出一个元素。

五、有序集合类型(Sorted Set)

  1.介绍

  有序集合类型是在集合类型的基础上为集合中每个元素都关联了一个分数,这使得我们不仅可以完成集合类型支持的一些操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素与分数有关的操作。虽然集合中的每个元素都是不同的,但是它们的分数却可以相同。

  有序集合类型和列表类型的比较:

  相似点:

    1)二者都是有序的。

    2)二者可以获得某一范围的元素。

  不同点:

    1)列表是通过链表实现的,所以获取靠近两端的元素速度极快;有序集合类型是使用散列表(Skip list)和跳跃表实现的,所以即使读取位于中间的元素速度也很快。

    2)列表中不能简单的调整某个元素的位置,但是有序集合可以通过更改元素的分数来调整元素的位置。

    3)有序集合要比列表类型更加耗费内存。

  2.命令

    1)增加元素

    ZADD key score member [score member ···]

    ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换掉原来的分数。返回值是新添加到有序集合中的元素个数,不包含之前已经存在      的元素。所以ZADD命令不但可以用来做添加操作,更可以用来做更新操作。另外,分数不仅可以是整数,也可以是浮点数。示例如下:

  

redis能创建新的数据库吗_有序集合_17

    2)获得元素的分数

    ZSCORE key member 示例如下

    

redis能创建新的数据库吗_redis能创建新的数据库吗_18

    3)获得排名在某个范围内的所有元素

    ZRANGE key start stop [WITHSCORES]    ZREVRANGE key start stop [WITHSCORES]

    ZRANGE 命令会按照元素分数从小到大的顺序返回索引从start 到 stop 之间的所有元素(包含两端的元素)。

    

redis能创建新的数据库吗_集合类型_19

    如果需要同事获取到分数的话只需要在命令尾部加上WITHSCORES即可。如下:

    

redis能创建新的数据库吗_字符串_20

    ZREVRANGE 命令和ZRANGE命令用法一致,区别在于ZREVRANGE 命令是按照元素分数从大到小的顺序给出结果的。特别的,如果元素的值是中文的话,取决于中文的编码格          式。

    4)获得指定分数范围内的元素

    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

    ZRANGEBYSCORE 命令是按照元素分数从小到大的顺序返回分数在min和max(包含min、max)之间的元素。如果希望分数范围不包含端点值,可以在分数前加上“(”符号。min      和max还支持无穷大,同ZADD命令一样。-inf表示负无穷,+inf表示正无穷。示例如下:

    

redis能创建新的数据库吗_有序集合_21

    WITHSCORES参数的用法和ZRANGE命令一样,此处不在赘述。

    LIMIT offset count  参数表示在获得的元素列表的基础上向后偏移offset个元素,并且只获取前count个元素。想获得分数高于60分的从第二个人开始的前3个人,示例如下:

    

redis能创建新的数据库吗_redis能创建新的数据库吗_22

    想获取分数低于100分或等于100分的前三个人,可以用ZREVRANGEBYSCORE命令,示例如下:

    

redis能创建新的数据库吗_有序集合_23

    5)增加某个元素的分数

    ZINCRBY key increment member

    返回值是增加后的分数。示例如下:

    

redis能创建新的数据库吗_redis能创建新的数据库吗_24

    6)获得集合中元素的数量,获得指定分数范围内的元素个数

    ZCARD key      ZCOUNT key min max

    ZCOUNT 命令中min和max参数的特性和ZRANGEBYSCORE中的一样。

    7)删除元素

    ZREM key member [member ···]

    ZREM命令是删除一个或者多个元素,返回值是删除的元素的个数(不包含本来就不存在的元素)。

    ZREMRANGEBYRANK key start stop

    ZREMRANGEBYRANK 命令是按照元素分数从小到大的的顺序(即索引0表示最小的值)删除在指定排名范围之内的所有元素,并返回删除元素的数量。示例如下:

    

redis能创建新的数据库吗_集合类型_25

    ZREMRANGEBYSCORE key min max

    ZREMRANGEBYSCORE命令会删除指定分数范围内的所有元素,返回值是删除的元素数量。示例如下:

    

redis能创建新的数据库吗_集合类型_26

    8)获得元素的排名

    ZRANK key member    ZREVRANK key member

    ZRANK 命令会按照元素分数从小到大的顺序获得指定的元素的排名(从小到大,即分数最小的排名为0);ZREVRANK 命令则相反(从大到小,即分数最大的排名为0)。示例如下

    

redis能创建新的数据库吗_字符串_27

    9)计算有序集合的交集

     ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight...] ] [AGGREGATE SUM|MIN|MAX]

     ZINTERSTORE 命令用来计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合存储),返回值是destination 键中的元素个数。

    destination键中元素的分数是由AGGREGATE 参数决定的。

      (1)当AGGREGATE 是SUM时(默认值),destination键中元素的分数是每个参与计算的集合中该元素分数的和。

      (2)当AGGREGATE 是MIN时,destination键中元素的分数是每个参与计算的集合中该元素分数的最小值。

      (3)当AGGREGATE 是MAX时,destination键中元素的分数是每个参与计算的集合中该元素分数的最大值。

    

redis能创建新的数据库吗_redis能创建新的数据库吗_28

    另外还有一个命令与ZINTERSTORE命令的用法一样,名为ZUNIONSTORE,它的作用是计算集合间的并集,这里不再赘述。