一、基本简介

现在出现了新的查询需求:存储大量数据的同时,还需要在查询方面提供更高的效率。虽然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.

版权声明:本文为leijisong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/leijisong/p/13909738.html