Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

一、集合对象的编码

  • 集合对象的编码可以是intset或者hashtable

intset型编码

  • ntset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在 整数集合里面
  • 举个例子,以下代码将创建一个如下图所示的intset编码集合对象:

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

hashtable型编码

  • hashtable编码的集合对象使用字典作为底层实现
  • 字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为NULL
  • 举个例子,以下代码将创建一个如下图所示的hashtable编码集合对象:

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

二、编码转换

编码的规则

  • intset编码的规则如下:
    • 集合对象保存的所有元素都是整数值
    • 集合对象保存的元素数量不超过512个
  • hashtable编码的规则:
    • 不能满足上面那两个条件的列表对象需要使用hashtable编码

配置选项

  • 上面intset编码的规则的第二个条件的上限值是可以修改的,具体请看配置文件中关于set-max-intset-entries选项 的说明

演示案例

  • 举个例子,以下代码创建了一个只包含整数元素的集合对象,该对象的编码为intset:

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

  • 不过,只要我们向这个只包含整数元素的集合对象添加一个字符串元素,集合对象的编 码转移操作就会被执行:

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

  • 除此之外,如果我们创建一个包含512个整数元素的集合对象,那么对象的编码应该会 是intset:

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

  • 但是,只要我们再向集合添加一个新的整数元素,使得这个集合的元素数量变成513, 那么对象的编码转换操作就会被执行:

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)

三、集合命令的实现

  • 因为集合键的值为集合对象,所以用于集合键的所有命令都是针对集合对象来构建的,下表列出了其中一部分集合键命令,以及这些命令在不同编码的集合对象下的实现方法

Redis(源码剖析):11---对象之集合对象(SADD、SCARD)