redis专题五:redis的数据类型之set
一、基本简介
现在出现了新的查询需求:存储大量数据的同时,还需要在查询方面提供更高的效率。虽然list满足存储大量的数据,也可以通过索引来进行访问,但是list底层是双向链表的结构,在查询上的效率并没有可观。
需要的存储结构:能够存储大量数据,高效的内部存储机制,便于查询。
这个时候,可能我们会联想到前面的hash,但是这里面有一个问题,我们用的是右边的value,而不是左边的名字(field)。因此,我们做一个变形:
- 本质set类型与hash存储结构完全相同,仅存储键,不存储值,并且值是不允许重复的。
二、基本操作
功能 | 命令 | 其他说明 |
添加数据 | sadd key member1 member2 ... | 添加成功返回1 |
获取全部数据 | smembers key | |
删除数据 | srem key member1 member2 ... | |
获取集合数据总量 | scard key | 返回数据总数 |
判断集合中是否包含指定数据 | sismember key member | 有返回1,没有返回0 |
三、扩展操作
3.1 set操作随机数据
场景:比方说今日头条App,当你注册后,会设置三条爱好的内容,但是为了增加用户的活跃度,兴趣点,必须让用户对其他信息类别感兴趣,增加客户的留存度,怎么实现?
方案:
- 系统分析出各个分类的最新或最热点的消息条目并组织成set集合
- 随机挑选其中部分信息
- 配合用户关注信息分类的热点信息组织成展示的全信息集合
功能 | 命令 | 其他说明 |
随机获取集合中指定数量的数据 | srandmember key [count] | 集合元素数量不变 |
随机获取集合中的某个数据并将该数据移出集合 | spop key | 集合元素数量改变 |
3.2 set数据交并差操作
场景:微信公共号针对关注的公共号,会显示多少好友已经关注? QQ推荐好友?
功能 | 命令 | 其他说明 |
求两个集合的交并差集 |
sinter key1 key2 sunion key1 key2 sdiff key1 key2 |
sdiff 差集A-B注意有先后顺序问题 |
求两个集合的交并差集并存储到指定集合中 |
sinterstore destination key1 key2 sunionstore destination key1 key2 sdiffstore destination key1 key2 |
detination意指新的集合 |
将指定集合从原始集合中移到目标集合中 | smove source destination member |
tips:
- redis应用于同类信息的关联检索,二度关联检索,深度关联检索
- 显示共同关注
- 显示共同好友
- 由用户A出发,获取到好友用户B的好友信息列表
- 由用户A出发,获取到好友用户B的购物车清单
四、set操作数据类型的注意事项
- set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
- set虽然与hash的存储结构相同,但是不能当hash用,无法启用hash存储值的空间
下一篇写redis数据类型之sorted_set.