Redis 原理 – Set

  • Redis 原理 – Set已关闭评论
  • 32 次浏览
  • A+
所属分类:.NET技术
摘要

可以看到 intset 很简单, 基本和普通数组差不多另外, 当使用 intset 编码时,数据是有序的。


Set数据结构

  1. 使用 intset
    当同时满足下面两个条件时,使用 intset 存储数据
    • 元素个数少于512个 (set-max-intset-entries: 512)
    • 所有元素都是整数值
  2. 不满足上面的条件, 使用 hashtable

intset 图解

//intset 的编码方式 #define INTSET_ENC_INT16 (sizeof(int16_t)) #define INTSET_ENC_INT32 (sizeof(int32_t)) #define INTSET_ENC_INT64 (sizeof(int64_t))  typedef struct intset {     uint32_t encoding; // 编码方式     uint32_t length; // 集合包含的元素数量     int8_t contents[]; // 保存元素的数组 } intset; 

Redis 原理 - Set

可以看到 intset 很简单, 基本和普通数组差不多

另外, 当使用 intset 编码时,数据是有序的。

intset 演示:

127.0.0.1:6379> SADD nums 5 8 1 9 0 (integer) 5 127.0.0.1:6379> OBJECT ENCODING nums "intset" 127.0.0.1:6379> SMEMBERS nums 1) "0" 2) "1" 3) "5" 4) "8" 5) "9" 

hashtable 图解

  • 请参阅我之前的文章 Redis 原理 - Hash
  • 当使用 hashtable 编码时,数据是无序的。

hashtable 演示:

127.0.0.1:6379> SADD data a b c d e f (integer) 6 127.0.0.1:6379> OBJECT ENCODING data "hashtable" 127.0.0.1:6379> SMEMBERS data 1) "c" 2) "b" 3) "a" 4) "e" 5) "d" 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的交集