IT小栈

  • 主页
  • Java基础
  • RocketMQ
  • Kafka
  • Redis
  • Shiro
  • Spring
  • Spring Boot
  • Spring Cloud
  • 资料链接
  • 关于
所有文章 友链

IT小栈

  • 主页
  • Java基础
  • RocketMQ
  • Kafka
  • Redis
  • Shiro
  • Spring
  • Spring Boot
  • Spring Cloud
  • 资料链接
  • 关于

Redis基本数据类型之Set

2020-07-08

Redis 的 Set 最常使用的数据结构之一。特点就是无序、值唯一,可以应用很多场合。

1、简单介绍

Redis 的 Set集合中值的排列是无序的,是唯一的,这就意味着集合中不能出现重复的数据,集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)

2、常用命令

2.1、SADD-添加元素

SADD key member [member …]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

2.2、SISMEMBER-元素是否存在集合中

SISMEMBER key member

判断 member 元素是否集合 key 的成员。如果 member 元素是集合的成员,返回 1 。 如果 member 元素不是集合的成员,或 key 不存在,返回 0 。

2.3、SPOP-随机移除并返回集合中的一个元素

SPOP key

移除*并返回集合中的一个随机元素。

2.4、SRANDMEMBER-随机返回一个元素

SRANDMEMBER key [count]

如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

2.5、SREM-移除集合中元素

SREM key member [member …]

移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。

当 key 不是集合类型,返回一个错误。

2.6、SCARD-集合中元素的数量

SCARD key

集合中元素的数量。当 key 不存在时,返回 0 。

2.7、SMEMBERS-集合中所有元素

SMEMBERS key

返回集合 key 中的所有成员。不存在的 key 被视为空集合

2.8、SINTER-多个集合的交集

SINTER key [key …]

获取多个集合的交集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)

2.9、SINTERSTORE-多个集合的交集保存到新的集合中

SINTERSTORE destination key [key …]

获取多个集合的交集并放入 destination 集合中。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身

2.10、SUNION–多个集合的并集

SUNION key [key …]

返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。

2.11、SUNIONSTORE-多个集合的并集保存到新的集合中

SUNIONSTORE destination key [key …]

获取多个集合的并集并放入 destination 集合中。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身

2.12、SDIFF-集合差集

SDIFF key [key …]

返回一个集合的全部成员,该集合是所有给定集合之间的差集

2.13、SDIFFSTORE-集合差集保存到新的集合中

SDIFFSTORE destination key [key …]

返回一个集合的全部成员,该集合是所有给定集合之间的差集保存到新的集合中。

3、内部实现

集合对象的编码可以是 intset 或者 hashtable(字典) 。

3.1、intset整型集合

redis中intset是一个整数集合, 只能存储整数类型的数据, 可以是16位, 32位, 或者是64位, 是以升序排列的数组进行保存数据。

查看其数据结构

1
2
3
4
5
6
7
8
typedef struct intset {
//编码类型 int16_t、int32_t、int64_t
uint32_t encoding;
//长度 最大长度:2^32
uint32_t length;
//柔性数组,集合内容,按升序排列数组
int8_t contents[];
} intset;

intset实质就是一个有序数组,可以看到添加删除元素都比较耗时,查找元素是O(logN)时间复杂度,不适合大规模的数据。

举例:

1
SADD numbers 1 3 5

3.2、hashtable字典

关于字典相关的定义操作请参照《Redis基本数据类型之Hash-字典》

3.3、转换

当集合对象可以同时满足以下两个条件时, 对象使用 intset 编码:

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

第二个条件的上限值是可以修改的, 配置文件中 set-max-intset-entries

以上条件有一个不满足就会使用hashtable字典进行存储。

本文作者: 顾 明 训
本文链接: https://www.itzones.cn/2020/07/08/Redis基本数据类型之Set/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
  • redis intset
  • redis

扫一扫,分享到微信

微信分享二维码
Redis基本数据类型之ZSet
Redis基本数据类型之List
  1. 1. 1、简单介绍
  2. 2. 2、常用命令
    1. 2.1. 2.1、SADD-添加元素
    2. 2.2. 2.2、SISMEMBER-元素是否存在集合中
    3. 2.3. 2.3、SPOP-随机移除并返回集合中的一个元素
    4. 2.4. 2.4、SRANDMEMBER-随机返回一个元素
    5. 2.5. 2.5、SREM-移除集合中元素
    6. 2.6. 2.6、SCARD-集合中元素的数量
    7. 2.7. 2.7、SMEMBERS-集合中所有元素
    8. 2.8. 2.8、SINTER-多个集合的交集
    9. 2.9. 2.9、SINTERSTORE-多个集合的交集保存到新的集合中
    10. 2.10. 2.10、SUNION–多个集合的并集
    11. 2.11. 2.11、SUNIONSTORE-多个集合的并集保存到新的集合中
    12. 2.12. 2.12、SDIFF-集合差集
    13. 2.13. 2.13、SDIFFSTORE-集合差集保存到新的集合中
  3. 3. 3、内部实现
    1. 3.1. 3.1、intset整型集合
    2. 3.2. 3.2、hashtable字典
    3. 3.3. 3.3、转换
© 2020 IT小栈
载入天数...载入时分秒... || 本站总访问量次 || 本站访客数人次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链

tag:

  • jvm
  • Java基础
  • kafka HW
  • kafka Leader Epoch
  • kafka
  • kafka位移主题
  • kafka位移提交
  • kafka副本机制
  • kafka ISR
  • zookeeper
  • kafka消息丢失
  • kafka日志存储
  • kafka Log Clean
  • kafka Log Compaction
  • kafka消费位移设置
  • kafka Rebalance
  • kafka分区算法
  • kafka生产者拦截器
  • kafka SASL/SCRAM
  • kafka ACL
  • redis
  • redis Ziplist
  • redis Hashtable
  • redis LinkedList
  • redis QuickList
  • redis intset
  • redis String
  • redis SDS
  • redis SkipList
  • redisDb
  • redisServer
  • redis 简介
  • Redis Cluster
  • 主从同步
  • RocketMQ高可用HA
  • 事务消息
  • 内存映射
  • MMAP
  • 同步刷盘
  • 异步刷盘
  • 消息存储文件
  • RocketMQ安装
  • 延迟消息
  • RocketMQ入门
  • 推拉模式
  • PushConsumer
  • 消费结果处理
  • rebalance
  • RocketMQ权限控制
  • RocketMQ ACL
  • 消息过滤
  • 消息重试
  • 消费位置
  • 集群消费
  • 广播消费
  • 运维命令
  • shiro源码分析
  • shiro入门
  • IOC和DI
  • Spring创建Bean
  • Bean生命周期
  • Sping属性注入
  • 异常
  • SpringMVC
  • springCloud
  • Eureka

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 我的OSCHINA
  • 我的CSDN
  • 我的GITHUB
  • 一生太水