一. 概述
首先我們來看看Redis中的Set類型有什么特點(diǎn)。
與List相比,Set集合中的元素不允許重復(fù),一個(gè)集合中最多可以對(duì)應(yīng)2^32-1(4294967295)個(gè)元素。
Set除了可以執(zhí)行增刪改查的命令之外,還支持交集、并集、差集等的計(jì)算。
二. 基本命令
對(duì)我們來說,常用的Set命令有如下幾種。
1.插入操作
#插入: sadd key value1 value2 .....
192.168.65.15:6379> sadd student aa bb cc
#返回新增成功value的個(gè)數(shù)
(integer) 3
#第二次插入,由于存在重復(fù)元素,所以不成功
192.168.65.15:6379> sadd student aa bb cc
(integer) 0
2. 查詢操作 .............
#查詢所有: smembers key
192.168.65.15:6379> smembers student
"aa"
"cc"
"bb"
#查詢?cè)厥欠翊嬖冢?sismember key value
192.168.65.15:6379> sismember student aa
#如果存在返回1
(integer) 1
#如果不存在返回0
192.168.65.15:6379> sismember student dd
(integer) 0
#隨機(jī)返回count個(gè)元素: srandmember key count
192.168.65.15:6379> srandmember student 2
"aa"
"cc"
#返回集合元素的個(gè)數(shù):scard key
192.168.65.15:6379> scard student
(integer) 3
3. 刪除操作
#刪除元素,返回刪除的個(gè)數(shù):srem key value...
192.168.65.15:6379> srem student aa
(integer) 1
#查看一下,果然已刪除
192.168.65.15:6379> smembers student
"cc"
"bb"
#隨機(jī)刪除元素并返回刪除的元素
192.168.65.15:6379> spop student 1
"cc"
#查看一下,果然已刪除
192.168.65.15:6379> smembers student
"bb"
三. 交集、并集、差集
除了以上幾種基本的操作之外,我們還可以計(jì)算集合的交集、并集、差集。
1.計(jì)算交集
#新增學(xué)生數(shù)據(jù):張三 20歲 男
192.168.65.15:6379> sadd student1 zs 20 boy
(integer) 3
#新增學(xué)生數(shù)據(jù):李四 22歲 男
192.168.65.15:6379> sadd student2 ls 22 boy
(integer) 3
#求這兩條數(shù)據(jù)的交集:boy
192.168.65.15:6379> sinter student1 student2
"boy"
2.計(jì)算并集
#集合合并,并且重復(fù)部分只保留一份
192.168.65.15:6379> sunion student1 student2
"20"
"boy"
"22"
"zs"
"ls"
3.計(jì)算差集
#sdiff key1 key2 結(jié)果是 key1中去重重復(fù)部分
192.168.65.15:6379> sdiff student1 student2
"20"
"zs"
4.保存結(jié)果
最后我們把上述操作的命令完整地展示在下面。
#計(jì)算交集,并保存
#sinterstore 保存的key key1 key2
192.168.65.15:6379> sinterstore student_jj student1 student2
(integer) 1
192.168.65.15:6379> smembers student_jj
"boy"
#計(jì)算并集,并保存
#sunionstore 保存的key key1 key2
192.168.65.15:6379> sunionstore student_bj student1 student2
(integer) 5
192.168.65.15:6379> smembers student_bj
"20"
"boy"
"22"
"zs"
"ls"
#計(jì)算差集,并保存
#sdiffstore 保存的key key1 key2
192.168.65.15:6379> sdiffstore student_cj student1 student2
(integer) 2
192.168.65.15:6379> smembers student_cj
"20"
"zs"
192.168.65.15:6379>
四. 應(yīng)用場景
學(xué)習(xí)完了Set命令,我們又該把Set應(yīng)用在哪些地方呢?以下是我們總結(jié)出來的一些常見應(yīng)用場景。
#用戶1的開發(fā)語言標(biāo)簽:
192.168.65.15:6379> sadd user1 java go python
(integer) 3
#用戶2的開發(fā)語言標(biāo)簽:
192.168.65.15:6379> sadd user2 java net c#
(integer) 3
#用戶1和用戶2的開發(fā)語言共同標(biāo)簽:
192.168.65.15:6379> sinter user1 user2
"java"
#設(shè)置一個(gè)獎(jiǎng)品池:一等獎(jiǎng)num1 至 四等獎(jiǎng)num4
192.168.65.15:6379> sadd prize num1 num2 num3 num4
(integer) 4
#隨機(jī)抽取獎(jiǎng)品
192.168.65.15:6379> spop prize 1
"num2"