Redis 原理 - Set

打印 上一主题 下一主题

主题 692|帖子 692|积分 2076

Set数据结构


  • 使用 intset
    当同时满足下面两个条件时,使用 intset 存储数据

    • 元素个数少于512个 (set-max-intset-entries: 512)
    • 所有元素都是整数值

  • 不满足上面的条件, 使用 hashtable
intset 图解
  1. //intset 的编码方式
  2. #define INTSET_ENC_INT16 (sizeof(int16_t))
  3. #define INTSET_ENC_INT32 (sizeof(int32_t))
  4. #define INTSET_ENC_INT64 (sizeof(int64_t))
  5. typedef struct intset {
  6.     uint32_t encoding; // 编码方式
  7.     uint32_t length; // 集合包含的元素数量
  8.     int8_t contents[]; // 保存元素的数组
  9. } intset;
复制代码

可以看到 intset 很简单, 基本和普通数组差不多
另外, 当使用 intset 编码时,数据是有序的。
intset 演示:
  1. 127.0.0.1:6379> SADD nums 5 8 1 9 0
  2. (integer) 5
  3. 127.0.0.1:6379> OBJECT ENCODING nums
  4. "intset"
  5. 127.0.0.1:6379> SMEMBERS nums
  6. 1) "0"
  7. 2) "1"
  8. 3) "5"
  9. 4) "8"
  10. 5) "9"
复制代码
hashtable 图解


  • 请参阅我之前的文章 Redis 原理 - Hash
  • 当使用 hashtable 编码时,数据是无序的。
hashtable 演示:
  1. 127.0.0.1:6379> SADD data a b c d e f
  2. (integer) 6
  3. 127.0.0.1:6379> OBJECT ENCODING data
  4. "hashtable"
  5. 127.0.0.1:6379> SMEMBERS data
  6. 1) "c"
  7. 2) "b"
  8. 3) "a"
  9. 4) "e"
  10. 5) "d"
  11. 6) "f"
复制代码
Set常用的命令


  • SADD key member 向set中添加一个或多个元素
  • SREM key member 移除set中的指定元素
  • SCARD key 返回set中元素的个数
  • SMEMBERS key 获取一个set中的所有成员
  • SISMEMBER key member 判断一个元素是否在set中
  • SINTER key1 key2 ... 取多个set的交集

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表