集合
集合不允许有重复元素,并且结合中的元素是无序的,不能通过索引下标直接获取,Redis支持集合内的增删改查,支持多个集合取交集、并集、差集
命令
集合内操作
#添加元素,返回结果为添加成功的个数
sadd key element [element ...]
#删除元素,返回结果为删除成功的个数
srem key element [element ...]
#计算元素个数,使用redis内部变量,不会遍历集合所有元素,时间复杂度为O(1)
scard key
#判断元素是否在集合中,存在返回1,反之返回0
sismember key element
#随机从集合返回指定个数元素,[count]是可选参数,如果不写默认为1,返回的元素不会真实的从集合中删除
srandmember key [count]
#从集合随机弹出元素,真实的从集合中移除元素
spop key
#获取所有元素(无序)
smembers key
集合间的操作
前提:
有两个集合:是user:1:follow和user:2:follow
集合添加元素,如下:
127.0.0.1:6379> sadd user:1:follow it music his sports (integer) 4 127.0.0.1:6379> sadd user:2:follow it news ent sports (integer) 4
实践:
#求两个集合的交集
sinter user:1:follow user:2:follow
#求多个集合的并集
suinon key [key ...]
#求多个集合的差集
sdiff key [key ...]
#将交集、并集、差集的结果保存
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
举例说明:
127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow (integer) 2
127.0.0.1:6379> type user:1_2:inter
set
127.0.0.1:6379> smembers user:1_2:inter
1) "it"
2) "sports"
内部编码
intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)
hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使 用hashtable作为集合的内部实现
使用场景
- 添加用户赞数
- 取消用户赞数
- 展示获取赞数最多的十个用户
- 展示用户信息以及用户分数
命令 | 描述 |
---|---|
zadd user:ranking:2016_03_15 mike count | mike用户添加指定赞数 |
zrem user:ranking:2016_03_15 mike | 删除mike用户赞数 |
zrevrangebyrank user:ranking:2016_03_15 0 9 | 展示获取赞数最多的十个用户 |
zscore user:ranking:2016_03_15 mike | 用户分数 |
zrank user:ranking:2016_03_15 mike | 用户排名 |