List和Set的异同

  • List
  • 可以重复:list元素是可以重复的
  • 无序:集合里面的元素是无序的
  • 有序:是元素的插入和弹出有序
  • Set
  • 去重:set集合去重了的,元素不会有重复的
  • 无序:集合里面的元素是无序的
  • 无序:元素插入和弹出是无序的

常用的命令

redis set 和hset的区别 redis中set和list区别_应用场景

命令演示

127.0.0.1:7000> sadd k1 hello	#添加 1个元素到集合
(integer) 1
127.0.0.1:7000> sadd k1 world	#再次添加 1个元素到集合
(integer) 1
127.0.0.1:7000> sadd k1 world	#添加已有的元素到集合,会被忽略,返回0,命令失败
(integer) 0
127.0.0.1:7000> SMEMBERS k1		#返回k1集合所有的元素
1) "hello"
2) "world"
127.0.0.1:7000> SCARD k1	#返回k1集合元素的数量
(integer) 2
127.0.0.1:7000> SCARD k2	#返回k2集合元素的数量,k2还不存在,所以返回为0
(integer) 0
-----------------------------------------------------------------------------------------------------------
127.0.0.1:7000> sadd k2 1 2 3 4 5 6 7 8 9 10
(integer) 10
127.0.0.1:7000> SISMEMBER k2 2		#检测2是否是k2集合的成员,是返回1
(integer) 1
127.0.0.1:7000> SISMEMBER k2 20		#检测20是否是k2集合的成员,不是返回0
(integer) 0
127.0.0.1:7000> SRANDMEMBER k2 3	#随机返回3个k2集合的成员
1) "8"
2) "3"
3) "9"
127.0.0.1:7000> SRANDMEMBER k2 3
1) "4"
2) "8"
3) "7"
127.0.0.1:7000> SRANDMEMBER k2 15	#15>10,超出了集合的大小,所以返回全部k2集合的成员
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:7000> SRANDMEMBER k2 -4	#负数,且绝对值小于10,所以随机返回k2集合的4个成员
1) "7"
2) "9"
3) "10"
4) "1"
127.0.0.1:7000> SRANDMEMBER k2 -20	·#负数,且绝对值大于10,所以返回K2集合的全部成员,但是顺序随机
 1) "4"
 2) "3"
 3) "4"
 4) "4"
 5) "5"
 6) "10"
 7) "3"
 8) "9"
 9) "5"
10) "6"
11) "2"
12) "10"
13) "6"
14) "9"
15) "6"
16) "2"
17) "4"
18) "6"
19) "5"
20) "5"
127.0.0.1:7000> SRANDMEMBER k2	#不带count的话,默认随机返回一个成员
"10"
127.0.0.1:7000> SRANDMEMBER k2
"5"
127.0.0.1:7000> spop k2 2	#移除并返回K2集合2个元素
1) "2"
2) "8"
127.0.0.1:7000> SMEMBERS k2	#2和8已经被移除了
1) "1"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
7) "9"
8) "10"
127.0.0.1:7000> spop k2
"4"
127.0.0.1:7000> SMEMBERS k2
1) "1"
2) "3"
3) "5"
4) "6"
5) "7"
6) "9"
7) "10"
127.0.0.1:7000> spop k2 20	#20大于了集合的个数,移除和返回全部成员
1) "1"
2) "3"
3) "5"
4) "6"
5) "7"
6) "9"
7) "10"
127.0.0.1:7000> SMEMBERS k2	#K2集合为空了
(empty array)

差集

127.0.0.1:7000> sadd k3  a b c
(integer) 3
127.0.0.1:7000> sadd k4 c
(integer) 1
127.0.0.1:7000> sadd k5 b c e 
(integer) 3
127.0.0.1:7000> SDIFF k3 k4 	#求差集,k3是第一个集合,即求出的交集是元素在K3而不在k4,换言之可以表示为k3-(k3交k4)
1) "a"
2) "b"
127.0.0.1:7000> SDIFF k3 k5 
1) "a"
127.0.0.1:7000> SDIFF k3 k4 k5
1) "a"
127.0.0.1:7000> SDIFFSTORE k6 k3 k4 k5	#求出的差集存储在k6这个集合中
(integer) 1
127.0.0.1:7000> SMEMBERS k6	#验证上一步结果
1) "a"

交集

127.0.0.1:7000> sadd k1 a b c d 
(integer) 4
127.0.0.1:7000> sadd k2 c
(integer) 1
127.0.0.1:7000> sadd k3 a c e 
(integer) 3
127.0.0.1:7000> SINTER k1 k2 k3		#求交集
1) "c"
127.0.0.1:7000> SINTERSTORE destk1 k1 k2 k3		#求交集,并把结果存储在另外一个集合中
(integer) 1
127.0.0.1:7000> SMEMBERS destk1		#验证上一步的结果
1) "c"
127.0.0.1:7000>

并集

127.0.0.1:7000> sadd k1 a b c d
(integer) 4
127.0.0.1:7000> sadd k2 c
(integer) 1
127.0.0.1:7000> sadd k3  a c e 
(integer) 3
127.0.0.1:7000> SUNION k1 k2 k3		#并集
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
127.0.0.1:7000> SUNIONSTORE destk1 k1 k2 k3	 #求出这3个集合的交集,并存储在另外一个集合中
(integer) 5
127.0.0.1:7000> SMEMBERS destk1		#验证上一步的结果
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
127.0.0.1:7000>
127.0.0.1:7000> sadd k1 1 2 3 4 5 6 7
(integer) 7
127.0.0.1:7000> sadd k2 one two
(integer) 2
127.0.0.1:7000> sadd k2 10 20 30
(integer) 3
127.0.0.1:7000> SMEMBERS k2
1) "one"
2) "10"
3) "20"
4) "two"
5) "30"
127.0.0.1:7000> SMOVE k1 k2 1	#移除1
(integer) 1
127.0.0.1:7000> SMOVE k1 k2 2	#移除2
(integer) 1
127.0.0.1:7000> SMOVE k1 k2 3 4		#只能移除1个元素,所以报错
(error) ERR wrong number of arguments for 'smove' command
127.0.0.1:7000> SMOVE k1 k2 3
(integer) 1
127.0.0.1:7000> SMEMBERS k1		#K1前面3个元素都被移除了,k2增加了这3个元素
1) "4"
2) "5"
3) "6"
4) "7"
127.0.0.1:7000> SMEMBERS k2		#K1前面3个元素都被移除了,k2增加了这3个元
1) "1"
2) "30"
3) "two"
4) "one"
5) "10"
6) "3"
7) "20"
8) "2"
127.0.0.1:7000> 
127.0.0.1:7000> SMOVE k1 k3 7		#移除一个元素到不存在的一个集合时,新建一个集合K3,然后元素移除到K3中
(integer) 1
127.0.0.1:7000> SMEMBERS k3		#验证上一步的结果
1) "7"

127.0.0.1:7000> SMEMBERS k2		#查看K2的元素
1) "1"
2) "30"
3) "two"
4) "one"
5) "10"
6) "3"
7) "20"
8) "2"
127.0.0.1:7000> SREM  k2 1 30	#被移除的元素在k2集合中
(integer) 2
127.0.0.1:7000> SMEMBERS k2		#1和30已经被移除了
1) "two"
2) "one"
3) "10"
4) "3"
5) "20"
6) "2"
127.0.0.1:7000> SREM  k2 100	#被移除的元素100不在K2集合中,该操作被忽略,直接返回0
(integer) 0
127.0.0.1:7000> SREM  k4 100	#被移除的集合不存在,直接返回0
(integer) 0
127.0.0.1:7000>

应用场景

  • 1、srandmember的使用场景
  • 送礼物,礼物有3个,但是人很多。这个怎么做呢?这个一般是要这3个礼物被不同的人领取,所以要去重。srandemember key +3。