NoSQL--Redis 2.4--Set

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

一、概述:

1、在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。

2、和List类型不同的是,Set集合中不允许出现重复的元素,换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。

3、和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如交集、并集差集。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。如qq好友推荐用的就是Set的交集

例子:

wKioL1l3Az7C6cVGAACZBkaMv9E614.jpg

tomFri集合:


wKiom1l3B1qySkk_AACEwtkqDv4676.jpg

linkenFri集合:


wKioL1l3B2ajbqKZAAB0yxxoZeg744.jpg

交集:


wKioL1l3CA_QFsZgAAAmigYCYc4665.jpg

并集:


wKioL1l3CFuhNdhtAAA_OT9mnPs102.jpg

差集:


wKioL1l3CPqQIjqAAAAqEU_zxhA971.jpg

wKioL1l3CQair2I7AAAozP-l8_M344.jpg

二、应用范围:

1可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。

2充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。


三、方法:

1、sadd方法:

SADD key member [member ...]

将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略。

假如key不存在,则创建一个只包含member元素作成员的集合。

当key不是集合类型时,返回一个错误。


# 添加单个元素

redis> SADD bbs "discuz.net"
(integer) 1

# 添加重复元素

redis> SADD bbs "discuz.net"
(integer) 0

# 添加多个元素

redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2

redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"

2、srem方法:


SREM key member [member ...]

移除集合key中的一个或多个member元素,不存在的member元素会被忽略。

当key不是集合类型,返回一个错误。

# 测试数据

redis> SMEMBERS languages
1) "c"
2) "lisp"
3) "python"
4) "ruby"

# 移除单个元素

redis> SREM languages ruby
(integer) 1

# 移除不存在元素

redis> SREM languages non-exists-language
(integer) 0

# 移除多个元素

redis> SREM languages lisp python c
(integer) 3

redis> SMEMBERS languages
(empty list or set)

3、smembers方法:

SMEMBERS key

返回集合key中的所有成员。

# 情况1:空集合

redis> EXISTS not_exists_key    # 不存在的key视为空集合
(integer) 0

redis> SMEMBERS not_exists_key
(empty list or set)


# 情况2:非空集合

redis> SADD programming_language python
(integer) 1

redis> SADD programming_language ruby
(integer) 1

redis> SADD programming_language c
(integer) 1

redis> SMEMBERS programming_language
1) "c"
2) "ruby"
3) "python"

4、spop方法:

SPOP key

移除并返回集合中的一个随机元素(set为无序集合)。


redis> SMEMBERS my_sites
1) "huangz.51cto.com"
2) "sideeffect.me"
3) "douban.com"

redis> SPOP my_sites
"huangz.51cto.com"

redis> SMEMBERS my_sites
1) "sideeffect.me"
2) "douban.com"

5、sdiff方法:


SDIFF key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的差集,以先写的集合为标准

不存在的key被视为空集。


redis> SMEMBERS myset1
1) "one"
2) "two"

redis> SMEMBERS myset2
1) "two"
2) "three"

redis> SDIFF myset1 myset2
1) "one"

redis> SDIFF myset2 myset1
1) "three"

6、sdiffstore方法:


SDIFFSTORE destination key [key ...]

此命令等同于SDIFF,但它将结果保存到destination集合,而不是简单地返回结果集。

如果destination集合已经存在,则将其覆盖。

destination可以是key本身。


redis> SMEMBERS myset1
1) "one"
2) "two"

redis> SMEMBERS myset2
1) "two"
2) "three"

redis> SDIFFSTORE myset3 myset1 myset2
1) "one"

redis> SMEMBERS myset3
1) "one"


7、sinter方法:

SINTER key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的交集。

不存在的key被视为空集。

当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

redis> SMEMBERS myset1
1) "one"
2) "two"

redis> SMEMBERS myset2
1) "two"
2) "three"
redis> SINTER myset1 myset2
1) "two"

8、sinterstore方法:

SINTERSTORE destination key [key ...]

此命令等同于SINTER,但它将结果保存到destination集合,而不是简单地返回结果集。

如果destination集合已经存在,则将其覆盖。

destination可以是key本身。


redis> SMEMBERS myset1
1) "one"
2) "two"

redis> SMEMBERS myset2
1) "two"
2) "three"
redis> SINTERSTORE myset3 myset1 myset2

redis> SMEMBERS myset3
1) "two"

9、sunion方法:


SUNION key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的并集。

不存在的key被视为空集。


redis> SMEMBERS myset1
1) "one"
2) "two"

redis> SMEMBERS myset2
1) "two"
2) "three"
redis> SUNION  myset1 myset2
1) "two"
2) "three"
3) "one"

10、sunionstore方法:


SUNIONSTORE destination key [key ...]

此命令等同于SUNION,但它将结果保存到destination集合,而不是简单地返回结果集。

如果destination已经存在,则将其覆盖。

destination可以是key本身。

redis> SMEMBERS myset1
1) "one"
2) "two"

redis> SMEMBERS myset2
1) "two"
2) "three"
redis> SUNIONSTORE myset3  myset1 myset2

redis> SMEMBERS myset3
1) "two"
2) "three"
3) "one"

11、smove方法:

SMOVE source destination member

将member元素从source集合移动到destination集合。

SMOVE是原子性操作。

如果source集合不存在或不包含指定的member元素,则SMOVE命令不执行任何操作,仅返回0。否则,member元素从source集合中被移除,并添加到destination集合中去。

当destination集合已经包含member元素时,SMOVE命令只是简单地将source集合中的member元素删除。

当source或destination不是集合类型时,返回一个错误。

redis> SMEMBERS songs
1) "Billie Jean"
2) "Believe Me"

redis> SMEMBERS my_songs
(empty list or set)

redis> SMOVE songs my_songs "Believe Me"
(integer) 1

redis> SMEMBERS songs
1) "Billie Jean"

redis> SMEMBERS my_songs
1) "Believe Me"

12、scard方法:

SCARD key

返回集合key中元素的数量。

redis> SMEMBERS tool
1) "pc"
2) "printer"
3) "phone"

redis> SCARD tool
(integer) 3

redis> SMEMBERS fake_set
(empty list or set)

redis> SCARD fake_set
(integer) 0

13、sismember方法:

SISMEMBER key member

判断member元素是否是集合key的成员。

redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"

redis> SISMEMBER joe's_movies "bet man"
(integer) 0

redis> SISMEMBER joe's_movies "Fast Five"
(integer) 1

14、srandmember方法:

SRANDMEMBER key返回集合中的一个随机元素。

该操作和SPOP相似,但SPOP将随机元素从集合中移除并返回,而SRANDMEMBER则仅仅返回随机元素,而不对集合进行任何改动。

redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"

redis> SRANDMEMBER joe's_movies
"Fast Five"

redis> SMEMBERS joe's_movies    # 集合中的元素不变
1) "hi, lady"
2) "Fast Five"
3) "2012"









本文转自lzf0530377451CTO博客,原文链接: http://blog.51cto.com/8757576/1717303,如需转载请自行联系原作者






相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 NoSQL 关系型数据库
什么是NoSQL?什么是redis?redis是做什么的?
什么是NoSQL?什么是redis?redis是做什么的?
36 1
|
6天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
125 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
1月前
|
NoSQL Redis 索引
[Redis]——Redis命令手册set、list、sortedset
[Redis]——Redis命令手册set、list、sortedset
|
1月前
|
存储 NoSQL Java
【Redis】1、学习 Redis 的五大基本数据类型【String、Hash、List、Set、SortedSet】
【Redis】1、学习 Redis 的五大基本数据类型【String、Hash、List、Set、SortedSet】
54 0
|
3月前
|
存储 NoSQL 关系型数据库
Redis Sorted Set 底层实现原理深度解读与排行榜实战
Redis Sorted Set 底层实现原理深度解读与排行榜实战
59 0
|
3月前
|
存储 NoSQL 关系型数据库
Redis Set 用了 2 种数据结构来存储,到现在才知道
Redis Set 用了 2 种数据结构来存储,到现在才知道
37 0
|
3月前
|
存储 监控 NoSQL
搞定 Redis 数据存储原理,别只会 set、get 了
搞定 Redis 数据存储原理,别只会 set、get 了
40 0
|
3月前
|
存储 NoSQL Java
面试题:redis除了使用string、set还了解哪些类型
面试题:redis除了使用string、set还了解哪些类型
15 0
|
3月前
|
存储 消息中间件 缓存
Redis不止能存储字符串,还有List、Set、Hash、Zset,用对了能给你带来哪些优势?
Redis不止能存储字符串,还有List、Set、Hash、Zset,用对了能给你带来哪些优势?
|
4月前
|
存储 分布式计算 NoSQL
基于内存的分布式NoSQL数据库Redis(五)数据存储与RDB设计
基于内存的分布式NoSQL数据库Redis(五)数据存储与RDB设计
153 0