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.

posted @ 2020-11-01 23:18  未知的九月  阅读(270)  评论(0编辑  收藏  举报