redis数据类型Set命令

Redis Set介绍

集合中的数据是不重复且没有顺序。
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,
由于集合类型的Redis内部是使用值为空的散列表实现,
所有这些操作的时间复杂度都为0(1)。 
Redis还提供了多个集合之间的交集、并集、差集的运算。

SADD key member [member …] SREM key member [member …] 增加/删除元素

127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0

127.0.0.1:6379> srem set c d
(integer) 1

SMEMBERS key 获得集合中的所有元素

127.0.0.1:6379> smembers set
1) "b"
2) "a”

SISMEMBER key member 判断元素是否在集合中

127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> sismember set h
(integer) 0

SDIFF key [key …] 集合的差集运算 A-B

属于A并且不属于B的元素构成的集合

127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB 
1) "1"
127.0.0.1:6379> sdiff setB setA 
1) "4"

SINTER key [key …] 集合的交集运算 A ∩ B

属于A且属于B的元素构成的集合

127.0.0.1:6379> sinter setA setB 
1) "2"
2) "3"

SUNION key [key …] 集合的并集运算 A ∪ B

属于A或者属于B的元素构成的集合

127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"

SCARD key 获得集合中元素的个数

127.0.0.1:6379> smembers setA 
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> scard setA 
(integer) 3

SPOP key 从集合中弹出一个元素

由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出
127.0.0.1:6379> spop setA 
"1"

SortedSet类型zset

在集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,
这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,
还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。 

在某些方面有序集合和列表类型有些相似。

1、二者都是有序的。 
2、二者都可以获得某一范围的元素。 

但是,二者有着很大区别:

1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。 
2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。 
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现) 
4、有序集合要比列表类型更耗内存。 

ZADD key score member [score member …] 增加元素

向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。
返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。 

127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu 
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi 
(integer) 0

ZSCORE key member 获取元素的分数

127.0.0.1:6379> zscore scoreboard lisi 
"97"

ZREM key member [member …] 删除元素

移除有序集key中的一个或多个成员,不存在的成员将被忽略。
当key存在但不是有序集类型时,返回一个错误。

127.0.0.1:6379> zrem scoreboard lisi
(integer) 1

ZRANGE key start stop [WITHSCORES] 获得排名在某个范围的元素列表

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

127.0.0.1:6379> zrange scoreboard 0 2
1) "zhangsan"
2) "wangwu"
3) "lisi“

ZREVRANGE key start stop [WITHSCORES]

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

127.0.0.1:6379> zrevrange scoreboard 0 2
1) " lisi "
2) "wangwu"
3) " zhangsan “

如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数 

127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
获得指定分数范围的元素

127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES
1) "wangwu"
2) "94"
3) "lisi"
4) "97"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2
1) "wangwu"
2) "lisi"

ZINCRBY key increment member 增加某个元素的分数,返回值是更改后的分数

127.0.0.1:6379> ZINCRBY scoreboard 4 lisi 
"101“

ZCARD key 获得集合中元素的数量

127.0.0.1:6379> ZCARD scoreboard
(integer) 3

ZCOUNT key min max 获得指定分数范围内的元素个数

127.0.0.1:6379> ZCOUNT scoreboard 80 90
(integer) 1

ZREMRANGEBYRANK key start stop 按照排名范围删除元素

127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1
(integer) 2 
127.0.0.1:6379> ZRANGE scoreboard 0 -1
1) "lisi"

ZREMRANGEBYSCORE key min max 按照分数范围删除元素

127.0.0.1:6379> zadd scoreboard 84 zhangsan    
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100
(integer) 1

ZRANK key member 获取元素的排名 从小到大

127.0.0.1:6379> ZRANK scoreboard lisi 
(integer) 0

ZREVRANK key member 从大到小

127.0.0.1:6379> ZREVRANK scoreboard zhangsan 
(integer) 1

ZSet应用

商品销售排行榜

需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。

写入商品销售量:商品编号1001的销量是9,商品编号1002的销量是10
192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002

商品编号1001的销量加1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001

商品销量前10名
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores