Redis的数据结构之Set

Redis的数据结构之Set

简介
Reids的set是集合类型,可以保存多个字符串元素,集合中的元素不能重复,并且集合中的元素也是无序的,无法通过下标来获取集合中的元素,这些特性与java的set非常类似。
数据结构
Redis的set底层使用了intset和hashtable两种数据结构存储的,其中intset可以理解为一种特殊的数组,而hashtable就是普通的哈希表。
Set的底层存储intset和hashtable存在编码转换,使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:

  • 1.结合对象保存的所有元素都是整数值
  • 2.集合对象保存的元素数量不超过512个

hashtable数据结构
hashtable的数据结构与上一章Hash中的结构基本一致,本章就不在重复说明。
intSet数据结构


说明:

  • encoding:contents保存的数据类型,默认类型为int16_t。
  • contents:实际内容数组
  • length:contents的元素数量

基础命令


sadd 添加元素
基本语法
sadd key value1...valuen
示例


scard 获取集合的成员数
基本语法
scard key
示例


sdiff 获取集合与集合的差集
基本语法
sdiff key1 key2
示例


sinter 获取集合与集合的交集
基本语法
sinter key1 key2
示例


sismember 判断member元素是否是集合key的成员
基本语法
sismember key member
示例


smembers 获取集合中的所有成员
基本语法
smembers key
示例


sunion 获取所有给定集合的并集
基本语法
sunion key1 key2
示例


srem 移除一个或多个元素
基本语法
srem key member
示例


sscan 迭代集合中元素
基本语法
sscan key cursor [match pattern] count
说明:

  • cursor:游标,从0开始
  • pattern :匹配模式
  • count:指定从数据集里返回多少元素,默认值为10.

示例
sscan mset 0 match j*


应用场景

  • 统计手机App每天的新增用户数

key以user:id 以及当天日期,例如 user:id:20200803; value为Set集合,记录当天登录的用户ID。

  • 博客共同好友
    通过set的获取多个集合的交集即可。
  • 网页UV的统计

统计用户每天访问网页的次数,一个用户一天内的多次访问只能算作一次。
注意事项
采用Set对于一些大集合进行相关的精确统计时,效率非常低,内存开销大,在生产环境尽量避免。
总结
本章讲解了Redis的数据结构Set,需要注意redis的set的聚合操作使用场景,如有疑问请随时反馈。

发布于 2022-07-06 16:13