**Redis数据类型:set** set集合类型也可以保存多个字符串元素,与列表不同的是,集合中不允许有重复元素并且集合中的元素是无序的。一个集合最多可以存储2^32-1个元素。 无序集合,自动去重,将数据放到set中就可去重,可以基于JVM的HashSet去重,如果系统部署在多台机器上,就可以用redis进行全局去重。可以基于set做交集,并集,差集的操作。如把2个人的粉丝列表弄一个交集,就能看到两个人的共同好友是谁。 **1.1、用户标签** 例如一个用户对篮球、足球感兴趣,另一个用户对橄榄球、乒乓球感兴趣,这些兴趣点就是一个标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同感兴趣的标签。给用户打标签的时候需要①给用户打标签,②给标签加用户,需要给这两个操作增加事务。 给用户打标签 ```bash sadd user:1:tags tag1 tag2 ``` 给标签添加用户 ```bash sadd tag1:users user:1 ``` ```bash sadd tag2:users user:1 ``` 使用交集(sinter)求两个user的共同标签 ```bash sinter user:1:tags user:2:tags ``` 标签的常见场景还包括,将文章或商品的标签存储在 Redis 的 Set 类型中,然后可以通过 SADD 和 SREM 命令添加或删除标签,通过 SMEMBERS 命令获取所有标签,通过 SINTER 命令获取包含多个标签的文章或商品,从而实现标签系统的功能。 **1.2、抽奖功能** 集合有两个命令支持获取随机数,分别是: 随机获取count个元素,集合元素个数不变 ```bash srandmember key [count] ``` 随机弹出count个元素,元素从集合弹出,集合元素个数改变 ```bash spop key [count] ``` 用户点击抽奖按钮,参数抽奖,将用户编号放入集合,然后抽奖,分别抽一等奖、二等奖,如果已经抽中一等奖的用户不能参数抽二等奖则使用spop,反之使用srandmember。 **1.3、好友关系** 可以将用户的好友 ID 存储在 Redis 的 Set 类型中,然后可以通过 SADD 和 SREM 命令添加或删除好友关系,通过 SISMEMBER 命令判断两个用户是否为好友关系,从而实现好友关系的功能。 **1.4、排重功能** 可以将用户的 IP 地址或 ID 存储在 Redis 的 Set 类型中,然后可以通过 SADD 命令添加新的 IP 地址或 ID,通过 SISMEMBER 命令判断 IP 地址或 ID 是否已经存在,从而实现排重系统的功能。 **1.5、投票功能** 可以将用户的 ID 存储在 Redis 的 Set 类型中,然后可以通过 SADD 命令将用户的 ID 添加到投票列表中,通过 SCARD 命令获取投票列表的长度,从而实现投票系统的功能。