继续Redis学习笔记(二)来说说剩余的三种数据类型。
三、列表类型(List)
1.介绍
列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段。列表类型内部是使用双向链表实现的,所以操作列表两端的字符串速度会很快。
2.命令
1)向列表两端添加元素
LPUSH key value [value...] RPUSH key value [value...]
LPUSH key value [value...] 是向列表左边添加元素,添加多个元素的话依次向列表左边添加。
RPUSH key value [value...] 是向列表右边添加元素,添加多个元素的话依次向列表右边添加。两个命令的返回值都是列表的长度。
从下图大家就可以明白具体过程:
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
它们的返回值是被弹出(移除)元素的值。示例如下:
5)删除列表中指定的值
LREM key count value
此命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数,当然count也可以为负数。
当count>0时,LREM命令会从列表的左边开始删除前count个值为value的元素;
当count<0时,LREM命令会从列表的左边开始删除前|count|个值为value的元素;
当count=0时,LREM命令会删除列表中所有值为value的元素。
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。示例如下:
7)只保留列表指定片段
LTRIM key start end
此命令用来删除指定索引范围之外的所有元素,只保留指定索引范围之内的元素,其指定索引范围的方法和LRANGE 命令一样。
8)向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT 命令首先会在列表中查询值为pivot的元素,然后根据BEFORE|AFTER来决定是把value插入到pivot的前面还是后面。返回值为执行插入操作后,列表的元素个数。
9)将元素从一个列表转移到另一个列表
RPOPLPUSH source destinntion
RPOPLPUSH 命令会先从source 列表的右边弹出一个元素,然后将其加入到destination列表的左边,并返回这个元素的值。当然source和destination是可以相同的。
四、集合类型(Set)
1.介绍
集合类型在Redis中是使用值为空的散列表(hash table)实现的。在集合中的每个元素都是不同的,且没有顺序。一个集合类型的数据至多可以存储2的32次方-1个字符串。
集合类型和列表类型有很多的相似之处,对比如下:
2.命令
1)SADD key member [member1 ...] SREM key member [member1 ...]
SADD 命令用来向集合中添加一个或多个元素,如果键不存在则会创建该键。又因为Set中是没有重复的元素的,所以如果要添加的元素已经在集合中存在,则会自动忽略掉这个元 素。返回值为成功添加的元素个数(忽略的元素不计)。
SREM 命令用来从集合中删除一个或多个元素,返回值为成功删除的元素个数。示例如下:
第二条SADD命令返回值为2,是因为元素a在第一次SADD命令中已经添加了。SREM命令返回值为1是因为集合中没有c这个元素。
2)获得集合中的所有元素,以及判断元素是否在集合中
SMEMBERS key SISMEMBER key member
SMEMBERS 命令会返回集合中所有的元素;SISMEMBER 命令用来判断集合中是否存在member元素,当值存在时返回值为1,否则为0。
3)集合间的运算
SDIFF key [key···]
此命令用于对多个集合取差集。示例如下:
注意:SDIFF setA setB 表示结果为A-B,如下图所示;SDIFF setB setA 表示结果为B-A,从上图可以看出结果不同。
SINTER key [key···]
SINTER 命令用来对多个集合取交集运算。示例如下图:
SUNION key [key···]
此命令用于对多个集合进行并集运算。示例如下:
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命令不但可以用来做添加操作,更可以用来做更新操作。另外,分数不仅可以是整数,也可以是浮点数。示例如下:
2)获得元素的分数
ZSCORE key member 示例如下
3)获得排名在某个范围内的所有元素
ZRANGE key start stop [WITHSCORES] ZREVRANGE key start stop [WITHSCORES]
ZRANGE 命令会按照元素分数从小到大的顺序返回索引从start 到 stop 之间的所有元素(包含两端的元素)。
如果需要同事获取到分数的话只需要在命令尾部加上WITHSCORES即可。如下:
ZREVRANGE 命令和ZRANGE命令用法一致,区别在于ZREVRANGE 命令是按照元素分数从大到小的顺序给出结果的。特别的,如果元素的值是中文的话,取决于中文的编码格 式。
4)获得指定分数范围内的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANGEBYSCORE 命令是按照元素分数从小到大的顺序返回分数在min和max(包含min、max)之间的元素。如果希望分数范围不包含端点值,可以在分数前加上“(”符号。min 和max还支持无穷大,同ZADD命令一样。-inf表示负无穷,+inf表示正无穷。示例如下:
WITHSCORES参数的用法和ZRANGE命令一样,此处不在赘述。
LIMIT offset count 参数表示在获得的元素列表的基础上向后偏移offset个元素,并且只获取前count个元素。想获得分数高于60分的从第二个人开始的前3个人,示例如下:
想获取分数低于100分或等于100分的前三个人,可以用ZREVRANGEBYSCORE命令,示例如下:
5)增加某个元素的分数
ZINCRBY key increment member
返回值是增加后的分数。示例如下:
6)获得集合中元素的数量,获得指定分数范围内的元素个数
ZCARD key ZCOUNT key min max
ZCOUNT 命令中min和max参数的特性和ZRANGEBYSCORE中的一样。
7)删除元素
ZREM key member [member ···]
ZREM命令是删除一个或者多个元素,返回值是删除的元素的个数(不包含本来就不存在的元素)。
ZREMRANGEBYRANK key start stop
ZREMRANGEBYRANK 命令是按照元素分数从小到大的的顺序(即索引0表示最小的值)删除在指定排名范围之内的所有元素,并返回删除元素的数量。示例如下:
ZREMRANGEBYSCORE key min max
ZREMRANGEBYSCORE命令会删除指定分数范围内的所有元素,返回值是删除的元素数量。示例如下:
8)获得元素的排名
ZRANK key member ZREVRANK key member
ZRANK 命令会按照元素分数从小到大的顺序获得指定的元素的排名(从小到大,即分数最小的排名为0);ZREVRANK 命令则相反(从大到小,即分数最大的排名为0)。示例如下
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键中元素的分数是每个参与计算的集合中该元素分数的最大值。
另外还有一个命令与ZINTERSTORE命令的用法一样,名为ZUNIONSTORE,它的作用是计算集合间的并集,这里不再赘述。