编程界的小学生
不会说全部api,api这东西想用自己help @set就行了。
一、特点
set类型无序不可重复。
二、核心api
基础数据的准备
sadd s1 a b c d
sadd s2 c d e f
1、交集
1.1、sinter
1.1.1、概念
语法:SINTER key1 key2 ...
,将key1,key2…中相同的元素返回。
1.1.2、演示
1.2、sinterstore
1.2.1、概念
语法:SINTERSTORE destination key1 [key2 ...]
,将key1 key2…中相同的元素都放到destination中,与SINTER的区别是SINTER会返回,而SINTERSTORE会将交集结果放入新的key中。
1.2.2、演示
1.3、应用场景
互相关注、共同好友
2、并集
SUNION、SUNIONSTORE
3、差集
SDIFF、SDIFFSTORE
差集这里额外说下:SDIFF s1 s2
的话是以s1为基础找到再s2里没有的,所以取决于s1和s2的线后顺序。
4、随机返回
4.1、概念
srandmember key count(正、负、0)
正数:取出一个去重的结果集,但是不能超过已有结果集数量
负数:取出一个带重复的结果集,但是一定满足你要的数量,比如-5,一定会给你返回5条,但是会重复
0:不返回
4.2、演示
5、随机弹出
5.1、概念
语法:SPOP key [count]
,随机从key里弹出count个元素。只支持大于等于0的数。
对比上面的SRANDMEMBER来讲区别在于,上面的只会返回,但返回的元素还在原set集合中。而spop是从原集合中弹出且返回。
5.2、演示
三、业务实战
1、互相关注、共同好友
采取交集SINTER/SINTERSTORE
2、抽奖
2.1、第一种规则
假设10个奖品,用户可能小于10,也可能大于10,用户终奖又分为重复和不重复。再比如微博要给粉丝送三件礼物,分给谁是随机的。你可以设置每个人不能重复中奖,也可以设置每个人能重复中将。
所以你会有一个粉丝列表,就比如上面的k1,如果我要随机抽出三名不重复的粉丝
srandmember k1 3
如果要随机抽出3名可以重的粉丝
srandmember k1 -3(人很多的话可能要多试几次才会出现重复)
2.2、第二种规则
上面srandmember每次都会随机抽出N个成员,但是每次抽都是从原有数据里拿的,抽2次可能是同一批人。有这样一个需求,年会一个人一个人的抽,抽完一个人后就不能再中奖了。那么就需要spop
# 一个一个人抽
spop k1 会从k1里弹出一个成员。
# count个人一起抽
spop k1 count 会从k1里取出count个成员。
四、总结
- 特点
- 核心api(不全,自己help)
- 实战案例
五、个人公众号
微信公众号【Java码农社区】