Redis从入门到放弃05——Set 数据类型

100 阅读5分钟

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