集合类型 (Set) 是一个无序并唯一的键值集合。它的存储顺序不会按照插入的先后顺序进行存储。
集合类型和列表类型的区别如下:
一、集合对象概述
sadd key element [element ...]
smembers:获取所有元素,返回的结果是无序的。smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,这时候可以使用sscan来完成.
sscan:sscan 命令用于迭代集合中键的元素
redis Sscan 命令基本语法如下:
SSCAN key cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
>= 2.8.0
数组列表。
> SADD myset1 "Google"
(integer) 1
> SADD myset1 "Runoob"
(integer) 1
> SADD myset1 "Taobao"
(integer) 1
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Runoob"
smembers key
sismember key element
srem key element [element ...]
srandmember key [count]
spop key [count]
sinter key [key ...]
sunion key [key ...]
sdiff key [key ...]
sinterstore destination key [key ...]suionstore destination key [key ...]sdiffstore destination key [key ...]
命 令 | 时间复杂度 |
---|---|
saddkeyelement[element...] | 0(k),k是元素个数 |
sremkeyelement[element...] | 0(k),k是元素个数 |
scardkey | 0(1) |
sismemberkeyelement | O(1) |
srandmemberkey[count] | O(count) |
spopkey | 0(1) |
smemberskey | 0(m),n是元素总数 |
sinterkey[key...]或者sinterstore | O(m*k),k是多个集合中元素最少的个数,m是键个数 |
suinonkey[key...]或者suionstore | 0(k),k是多个集合元素个数和 |
sdiffkey[key...]或者sdiffstore | 0(k),k是多个集合元素个敷和g.csdn.netqq_.41453285 |
sadd like:{消息 Id} {点赞用户 Id}
srem like:{消息 Id} {点赞用户 Id}
sismember like:{消息 Id} {点赞用户 Id}
smembers like:{消息 Id}
scard like:{消息 Id}
sadd darrenSet qiuxiang lee king
sadd qiuxiangSet darren ting lee king
sadd kingSet qiuxiang darren ting buding
sinter darrenSet qiuxiangSet - {lee,king}
sismember qiuxiangSet king
sdiff qiuxiangSet darrenSet - {darren, ting}
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱 乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共 同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。例如一 个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产 品,通常会为网站带来更多的利益。
下面使用集合类型实现标签功能的若干功能
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
...
sinter user:1:tags user:2:tags
开发提示:用户和标签的关系维护应该在一个事务内执行,防止部分命令失败造成的数据不一致
③删除用户下的标签
srem user:1:tags tag1 tag5...
srem tag1:users user:1srem tag5:users user:1...
sinter user:1:tags user:2:tags
这种标签系统在电商系统、社交系统、视频网站,图书网站,旅游网站等都有着广泛的应用。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。例如一个社交系统可以根据用户的标签进行好友的推荐,已经用户感兴趣的新闻的推荐等,一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。
抽奖系统
Redis集合的 SPOP(随机移除并返回集合中一个或多个元素) 和 SRANDMEMBER(随机返回集合中一个或多个元素) 命令可以帮助我们实现一个抽奖系统
如果允许重复中奖,可以使用SRANDMEMBER 命令
Copy
//添加抽奖名单
127.0.0.1:6379> SADD lucky:1 Tom
(integer) 1
127.0.0.1:6379> SADD lucky:1 Jerry
(integer) 1
127.0.0.1:6379> SADD lucky:1 John
(integer) 1
127.0.0.1:6379> SADD lucky:1 Marry
(integer) 1
127.0.0.1:6379> SADD lucky:1 Sean
(integer) 1
127.0.0.1:6379> SADD lucky:1 Lindy
(integer) 1
127.0.0.1:6379> SADD lucky:1 Echo
(integer) 1
//抽取三等奖3个
127.0.0.1:6379> SRANDMEMBER lucky:1 3
1) "John"
2) "Echo"
3) "Lindy"
//抽取二等奖2个
127.0.0.1:6379> SRANDMEMBER lucky:1 2
1) "Sean"
2) "Lindy"
//抽取一等奖1个
127.0.0.1:6379> SRANDMEMBER lucky:1 1
1) "Tom"
如果不允许重复中奖,可以使用 SPOP 命令
Copy
//添加抽奖名单
127.0.0.1:6379> SADD lucky:1 Tom
(integer) 1
127.0.0.1:6379> SADD lucky:1 Jerry
(integer) 1
127.0.0.1:6379> SADD lucky:1 John
(integer) 1
127.0.0.1:6379> SADD lucky:1 Marry
(integer) 1
127.0.0.1:6379> SADD lucky:1 Sean
(integer) 1
127.0.0.1:6379> SADD lucky:1 Lindy
(integer) 1
127.0.0.1:6379> SADD lucky:1 Echo
(integer) 1
//抽取三等奖3个
127.0.0.1:6379> SPOP lucky:1 3
1) "John"
2) "Echo"
3) "Lindy"
//抽取二等奖2个
127.0.0.1:6379> SPOP lucky:1 2
1) "Sean"
2) "Marry"
//抽取一等奖1个
127.0.0.1:6379> SPOP lucky:1 1
1) "Tom"