来自文章集合:
一文带你搞懂redis使用过程(持续更新中)
集合(Set)
Redis Set是String类型的无序集合。集合成员是唯一的,不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
场景
- 唯一值存储:set存储唯一的数值,确保不会出现重复的值存在
- 去重:可以用set进行大数据量的去重操作,保证数据的唯一性
- 标签系统:用set存储标签,每个元素就是一个标签,因为set的唯一性,可以确保同一标签不会被重复计数。
- 共同好友:在社交网络中,可以用set存储两个用户共同的好友,这样可以快速地取出共同好友的信息。(使用SINTER key1 [key2] 命令返回给定所有集合的交集)
- 订阅者和粉丝:可以用set存储用户的订阅者或粉丝,保证不会有重复的订阅者或粉丝被记录。
用法示例
// 向集合插入一个或多个成员(集合不存在则创建集合并插入):SADD <key_name> <value> [value...]
127.0.0.1:6379> SADD redis_set_1 redis_1 redis_2 redis_3 redis_2
(integer) 3
// 查询集合所有成员:SMEMBERS <key_name>
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_1"
// 查询集合成员数:SCARD <key_name>
127.0.0.1:6379> SCARD redis_set_1
(integer) 3
// 移除集合中一个或多个成员
127.0.0.1:6379> SADD redis_set_2 redis_1 redis_11 redis_12 redis_13 redis_2
(integer) 5
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_2"
2) "redis_13"
3) "redis_12"
4) "redis_11"
5) "redis_1"
127.0.0.1:6379> SREM redis_set_2 redis_2
(integer) 1
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_13"
2) "redis_12"
3) "redis_11"
4) "redis_1"
// 返回给定集合之间的`差集`:SDIFF <key_name_1> [key_name...]
127.0.0.1:6379> SDIFF redis_set_1
1) "redis_2"
2) "redis_3"
3) "redis_1"
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_13"
2) "redis_12"
3) "redis_11"
4) "redis_1"
// 返回给定所有集合的`差集`并存储到目标集合中:SDIFFSTORE <target_key_name> <key_name> [key_name...]
127.0.0.1:6379> SDIFFSTORE redis_set_3 redis_set_1 redis_set_2
(integer) 2
127.0.0.1:6379> SMEMBERS redis_set_3
1) "redis_2"
2) "redis_3"
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_13"
2) "redis_12"
3) "redis_11"
4) "redis_1"
// 目标集合是已经存在的集合,集合原有成员会被清空
127.0.0.1:6379> SDIFFSTORE redis_set_2 redis_set_1 redis_set_2
(integer) 2
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_2"
2) "redis_3"
// 返回的`差集`实际上是指key_name_1与其他对比,只有自身特有的成员集合
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_1"
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_2"
2) "redis_3"
3) "redis_4"
127.0.0.1:6379> SMEMBERS redis_set_3
1) "redis_2"
2) "redis_3"
127.0.0.1:6379> SDIFF redis_set_3 redis_set_1 redis_2
(empty list or set)
127.0.0.1:6379> SDIFF redis_set_2 redis_set_1 redis_3
1) "redis_4"
127.0.0.1:6379> SDIFF redis_set_1 redis_set_3 redis_2
1) "redis_1"
// 返回给定所有集合的并集:SINTER <key_name_1> <key_name_2> [key_name_x...]
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_1"
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_2"
2) "redis_3"
3) "redis_4"
127.0.0.1:6379> SMEMBERS redis_set_3
1) "redis_2"
2) "redis_3"
127.0.0.1:6379> SINTER redis_set_1 redis_set_2
1) "redis_2"
2) "redis_3"
// 返回给定所有集合的`交集`并存储到目标集合中:SINTER <target_key_name> <key_name> [key_name...]
127.0.0.1:6379> SINTERSTORE redis_set_4 redis_set_1 redis_set_2
(integer) 2
127.0.0.1:6379> SMEMBERS redis_set_4
1) "redis_3"
2) "redis_2"
// 检测集合中是否存在某成员:SISMEMBER <key_name> <value>
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_1"
127.0.0.1:6379> SISMEMBER redis_set_1 redis_4
(integer) 0
127.0.0.1:6379> SISMEMBER redis_set_1 redis_2
(integer) 1
// 随机删除集合中指定数目的元素:SPOP <key_name> <count>
127.0.0.1:6379> SADD redis_set_1 redis_5 redis_4 redis_6
(integer) 3
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_1"
4) "redis_5"
5) "redis_4"
6) "redis_6"
127.0.0.1:6379> SPOP redis_set_1 1
1) "redis_3"
127.0.0.1:6379> SPOP redis_set_1 2
1) "redis_4"
2) "redis_2"
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_5"
2) "redis_1"
3) "redis_6"
// 返回集合中一个或多个随机元素:SRANDMEMBER <key_name> <count>
127.0.0.1:6379> SADD redis_set_1 redis_1 redis_2 redis_3 redis_4 redis_5
(integer) 5
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_4"
4) "redis_1"
5) "redis_5"
127.0.0.1:6379> SRANDMEMBER redis_set_1 1
1) "redis_2"
127.0.0.1:6379> SRANDMEMBER redis_set_1 2
1) "redis_3"
2) "redis_1"
127.0.0.1:6379> SRANDMEMBER redis_set_1 23
1) "redis_5"
2) "redis_3"
3) "redis_1"
4) "redis_4"
5) "redis_2"
// 返回指定所有集合的并集:SUNION <key_name_1> [key_name_x...]
127.0.0.1:6379> SMEMBERS redis_set_2
1) "redis_2"
2) "redis_3"
3) "redis_4"
127.0.0.1:6379> SMEMBERS redis_set_3
1) "redis_2"
2) "redis_3"
127.0.0.1:6379> SUNION redis_set_2 redis_set_3
1) "redis_3"
2) "redis_2"
3) "redis_4"
// 返回指定所有集合的并集,并存储到指定key中:SUNIONSTORE <target_key_name> <key_name_1> [key_name_x...]
127.0.0.1:6379> SUNIONSTORE redis_set_4 redis_set_2 redis_set_3
(integer) 3
127.0.0.1:6379> SMEMBERS redis_set_4
1) "redis_3"
2) "redis_2"
3) "redis_4"
// 移动集合中某个元素到另一个集合:SMOVE <key_name> [key_name_x...]
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd redis_set_1 redis_1 redis_2 redis_3
(integer) 3
127.0.0.1:6379> sadd redis_set_2 redis_11 redis_12
(integer) 2
127.0.0.1:6379> SMOVE redis_set_1 redis_set_2 redis_4
(integer) 0
127.0.0.1:6379> SMOVE redis_set_1 redis_set_2 redis_3
(integer) 1
127.0.0.1:6379> smember redis_set_2
1) "redis_12"
2) "redis_3"
3) "redis_11"
/*
迭代集合中的元素:SSCAN <Key_name> <index> [MATCH pattern] [COUNT count]
当使用SSCAN命令扫描集合时,扫描的顺序可能与期望的不同,是因为集合set是无序的,而SSCAN命令是根据内部哈希表的顺序进行扫描的。所以输出结果的顺序可能与预期的搜索顺序不同。
*/
127.0.0.1:6379> SMEMBERS redis_set_1
1) "redis_3"
2) "redis_2"
3) "redis_4"
4) "redis_1"
127.0.0.1:6379> SSCAN redis_set_1 0 MATCH redis* COUNT 1
1) "1"
2) 1) "redis_4"
2) "redis_1"
127.0.0.1:6379> SSCAN redis_set_1 0 MATCH redis* COUNT 1
1) "1"
2) 1) "redis_4"
2) "redis_1"
127.0.0.1:6379> SSCAN redis_set_1 1 MATCH redis* COUNT 1
1) "3"
2) 1) "redis_3"
2) "redis_2"
127.0.0.1:6379> SSCAN redis_set_1 2 MATCH redis* COUNT 1
1) "1"
2) 1) "redis_4"
2) "redis_1"
127.0.0.1:6379> SSCAN redis_set_1 0 MATCH redis* COUNT 5
1) "0"
2) 1) "redis_4"
2) "redis_1"
3) "redis_3"
4) "redis_2"