Redis从入门到放弃05——Set 数据类型
Set 数据类型介绍(官网原文)
Introduction to Redis sets
A Redis set is an unordered collection of unique strings (members). You can use Redis sets to efficiently:
Track unique items (e.g., track all unique IP addresses accessing a given blog post). Represent relations (e.g., the set of all users with a given role). Perform common set operations such as intersection, unions, and differences
Redis集合是一个无序的唯一字符串(成员)集合。你可以有效地使用Redis集合:
跟踪唯一项(例如,跟踪访问给定博客文章的所有唯一IP地址)。 表示关系(例如,具有给定角色的所有用户的集合)。 执行常见的集合操作,如交集、并集和差集
limits(限制)
The max size of a Redis set is 2^32 - 1 (4,294,967,295) members.
Redis set 数据类型的最大能容纳 2^32 - 1(4,294,967,295)个成员
Set 数据类型常用命令
查看Set数据类型下所有命令 :help @Set
SADD key member [member ...]
summary: Add one or more members to a set
since: 1.0.0
SCARD key
summary: Get the number of members in a set
since: 1.0.0
SDIFF key [key ...]
summary: Subtract multiple sets
since: 1.0.0
SDIFFSTORE destination key [key ...]
summary: Subtract multiple sets and store the resulting set in a key
since: 1.0.0
SINTER key [key ...]
summary: Intersect multiple sets
since: 1.0.0
SINTERCARD numkeys key [key ...] [LIMIT limit]
summary: Intersect multiple sets and return the cardinality of the result
since: 7.0.0
SINTERSTORE destination key [key ...]
summary: Intersect multiple sets and store the resulting set in a key
since: 1.0.0
SISMEMBER key member
summary: Determine if a given value is a member of a set
since: 1.0.0
SMEMBERS key
summary: Get all the members in a set
since: 1.0.0
SMISMEMBER key member [member ...]
summary: Returns the membership associated with the given elements for a set
since: 6.2.0
SMOVE source destination member
summary: Move a member from one set to another
since: 1.0.0
SPOP key [count]
summary: Remove and return one or multiple random members from a set
since: 1.0.0
SRANDMEMBER key [count]
summary: Get one or multiple random members from a set
since: 1.0.0
SREM key member [member ...]
summary: Remove one or more members from a set
since: 1.0.0
SSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate Set elements
since: 2.8.0
SUNION key [key ...]
summary: Add multiple sets
since: 1.0.0
SUNIONSTORE destination key [key ...]
summary: Add multiple sets and store the resulting set in a key
since: 1.0.0
SADD key member [member ...]:给set集合中添加一个或者多个元素,且每个元素都唯一
SMEMBERS key:获取set集合中所有的元素
127.0.0.1:6379> sadd myset hello world world
(integer) 2
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"
SCARD key :获取set集合中元素的个数
127.0.0.1:6379> scard myset
(integer) 2
SRANDMEMBER key [count] :随机返回集合中指定 count 数量的元素个数
127.0.0.1:6379> smembers myset
1) "study"
2) "hello"
3) "good"
4) "world"
5) "learn"
6) "redis"
127.0.0.1:6379> SRandmember myset
"hello"
127.0.0.1:6379> SRandmember myset 2
1) "study"
2) "hello"
SDIFF key [key ...]:返回给定所有集合的差集
127.0.0.1:6379> sadd myset2 hello redis
(integer) 2
127.0.0.1:6379> smembers myset
1) "study"
2) "hello"
3) "good"
4) "world"
5) "learn"
6) "redis"
127.0.0.1:6379> sdiff myset myset2
1) "study"
2) "good"
3) "learn"
4) "world"
SDIFFSTORE destination key [key ...]:返回给定所有集合的差集并存储在destination中
---把 myset 和myset2的差集存储在myset3中
127.0.0.1:6379> sdiffstore myset3 myset myset2
(integer) 4
127.0.0.1:6379> smembers myset3
1) "study"
2) "good"
3) "learn"
4) "world"
SINTER key [key ...]:返回给定所有集合的交集
127.0.0.1:6379> smembers myset
1) "study"
2) "hello"
3) "good"
4) "world"
5) "learn"
6) "redis"
127.0.0.1:6379> smembers myset2
1) "redis"
2) "hello"
127.0.0.1:6379> sinter myset myset2
1) "redis"
2) "hello"
SINTERCARD numkeys key [key ...] [LIMIT limit]:该命令类似于SINTER,但它不返回结果集,而只返回结果的基数。返回集合的基数,该集合将由所有给定集合的交集产生
127.0.0.1:6379> sintercard 2 myset myset2 limit 1
(integer) 1
127.0.0.1:6379> sintercard 2 myset myset2
(integer) 2
--- 必须指定 numkeys 参数,且numkeys参数必须和key的数量一致,否则会报错
127.0.0.1:6379> sintercard myset myset2 limit 1
(error) ERR numkeys should be greater than 0
127.0.0.1:6379> sintercard 1 myset myset2
(error) ERR syntax error
127.0.0.1:6379> sintercard 3 myset myset2 limit 1
(error) ERR syntax error
SINTERSTORE destination key [key ...]: 返回给定所有集合的交集并存储在destination中
127.0.0.1:6379> sinterstore myset4 myset myset2
(integer) 2
127.0.0.1:6379> smembers myset4
1) "hello"
2) "redis"
SISMEMBER key member:返回set集合中是否存在某个元素,存在则返回1,不存在则返回0
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> sismember myset tt
(integer) 0
SMISMEMBER key member [member ...]:判断set集合中是否存在给定的一个或者多个元素,并返回是否存在的结果集
127.0.0.1:6379> SMISMEMBER myset hello redis tt
1) (integer) 1
2) (integer) 1
3) (integer) 0
SMOVE source destination member:把一个set集合中的元素移动到另一个set集合中
127.0.0.1:6379> smembers myset4
1) "hello"
2) "redis"
127.0.0.1:6379> smembers myset3
1) "study"
2) "good"
3) "learn"
4) "world"
127.0.0.1:6379> smove myset3 myset4 learn
(integer) 1
127.0.0.1:6379> smembers myset3
1) "study"
2) "good"
3) "world"
127.0.0.1:6379> smembers myset4
1) "hello"
2) "redis"
3) "learn"
SPOP key [count]:随机移除set集合中的一个元素
127.0.0.1:6379> smembers myset3
1) "study"
2) "good"
3) "world"
127.0.0.1:6379> spop myset3
"world"
127.0.0.1:6379> smembers myset3
1) "study"
2) "good"
SREM key member [member ...]:移除set集合中指定的某个元素
127.0.0.1:6379> smembers myset3
1) "study"
2) "good"
127.0.0.1:6379> srem myset3 good
(integer) 1
127.0.0.1:6379> smembers myset3
1) "study"
SUNION key [key ...]:返回给定set集合的并集
127.0.0.1:6379> smembers myset3
1) "study"
127.0.0.1:6379> smembers myset2
1) "redis"
2) "hello"
127.0.0.1:6379> sunion myset2 myset3
1) "study"
2) "hello"
3) "redis"
SUNIONSTORE destination key [key ...]:把所有给定集合的并集存储在集合destination中
127.0.0.1:6379> smembers myset1
(empty array)
127.0.0.1:6379> sunion myset2 myset3
1) "study"
2) "hello"
3) "redis"
127.0.0.1:6379> sunionstore myset1 myset2 myset3
(integer) 3
127.0.0.1:6379> smembers myset1
1) "study"
2) "hello"
3) "redis"
SSCAN key cursor [MATCH pattern] [COUNT count]:迭代集合中的元素
127.0.0.1:6379> sscan myset1 0
1) "0"
2) 1) "study"
2) "hello"
3) "redis"
4) "read"
127.0.0.1:6379> sscan myset1 0 match r*
1) "0"
2) 1) "redis"
2) "read"
127.0.0.1:6379> sscan myset1 0 match r* count 1
1) "2"
2) 1) "redis"
127.0.0.1:6379> sscan myset1 0 match r* count 3
1) "2"
2) 1) "redis"
127.0.0.1:6379> sscan myset1 0 match r* count 4
1) "0"
2) 1) "redis"
2) "read"
127.0.0.1:6379> sscan myset1 2 match r* count 4
1) "0"
2) 1) "read"
应用场景
- 微信小程序抽奖
场景 | 命令 |
---|---|
id为001的用户点击小程序参与抽奖 | sadd key 001 |
显示有多少人参与了 | scard key |
抽奖 | srandmember key 2:随机抽奖2人,不删除;随机抽奖3人:spop key 3,元素删除 |
- 微信点赞朋友圈
场景 | 命令 |
---|---|
新增点赞 | sadd pub:msg_id 点赞用户id |
取消点赞 | srem pub:msg_id 点赞用户id |
展现所有点过赞的用户 | smembers pub:msg_id |
统计点赞的用户数 | scard pub:msg_id |
展现所有点过赞的用户 | sismembers pub:msg_id 用户id |
- 抖音可能认识的人: sinter 、sdiff