集合
集合Set用来保存多个字符串,但不允许重复,且元素是无序的,不能通过索引获得下标。
集合支持取交集、并集、差集,可以解决实际问题。
命令
[list]
sadd key element [element ...]
srem key element [element ...]
scard key
sismember key element
srandmember key [count]
count不写,默认为1
spop key
smemebers key
[/list]
sinter key [key ...]
sunion key [key ...]
sdiff key [key ...]
sinterstore destination key [key ...] sunionstore destination key [key ...] sdiffstore destination key [key ...]
[/list]
内部编码
- intset:当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset作为集合的内部实现,减少内存的使用
- hashtable:当集合无法满足intset的条件时,Redis会选用hashtable作为集合的内部实现
使用场景
集合典型的使用场景是标签(tag),为不同标签客户推荐不同的产品等,用户和标签的关系应该在一个事务内自行,防止部分失败造成数据的不一致
[list]
sadd user:1:tags tag1 tag2 tag3 sadd user:2:tags tag1 tag2 tag3
sadd tag1:users user:1 user3 sadd tag2:users user:1 user2 user3
srem user:1:tags tag1 tag5
srem tag1:users user:1 srem tag2:users user:1
sinter user:1:tags user:2:tags
[/list]
上面是一个用集合实现标签的基本思路,实际的标签系统远为复杂,但集合的应用场景通常为:
- sadd = Tagging(标签)
- spop/srandmember = Random item(生成随机谁,如抽奖)
- sadd + sinter = Social Graph (社交需求你,如人际关系图)