首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏仁扬笔记

    Redis的设计与实现(5)-整数集合

    整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现. 整数集合 (intset) 是 Redis 用于保存整数值的集合抽象数据结构, 它可以保存类型为 int16_t , int32_t 或者 int64_t 的整数值, 并且保证集合中不会出现重复元素. 升级 每当我们要将一个新元素添加到整数集合里面, 并且新元素的类型比整数集合现有所有元素的类型都要长时, 整数集合需要先进行升级 (upgrade) , 然后才能将新元素添加到整数集合里面. , 程序才会对数组进行升级. 5. O(1) intsetLen 返回整数集合包含的元素个数. O(1) intsetBlobLen 返回整数集合占用的内存字节数. O(1) 7. 总结 整数集合集合键的底层实现之一.

    50610编辑于 2023-06-26
  • 来自专栏龙进的专栏

    集合整数表示

    集合的元素数比较少的时候,我们可以使用整数来表示集合(用到整数的二进制) 一些集合运算可以这么写: 空集:0 只含有第i个元素的集合{i}: 1<<i 含有全部n个元素的集合{0, 1, …, n-1 }: (1<<n)-1 判断第i个元素是否属于集合S: if(S>>i&1) 向集合中加入第i个元素:S|(1<<i) 从集合中去除第i个元素:S&~(1<<i) 集合S和T的并集:S|T 集合S和T的交集 :S&T 枚举集合S的所有子集 for( int S = 0; S < (1<<n); ++S) { //对于集合的处理 } 枚举{0, 1, …, n-1}所包含的所有大小为k的子集 下面的代码根据字典序升序

    59220编辑于 2022-10-31
  • 来自专栏Redis源码学习系列

    Redis源码学习之整数集合

    整数集合 整数集合有以下几个特点: 1.局限性:只存储整数类型数据 2.有序性:以从小到大的顺序存储 3.唯一性:存储的数据不会重复 整数集合在Redis中是集合对象的底层存储之一,当一个集合对象的元素都是整数类型且元素数量不多 (不超过512个)时,就会使用整数集合整数集合在Redis中的实现 1.数据结构 整数集合结构体有3个属性: encoding:代表整数集合的编码类型,可以存储int16、int32和int64三种类型的数据 length:整数集合中的元素个数 contents:整数集合中的元素数组,以字节数组的形式保存 举个例子,一个长度为3,编码为int16(两个字节)的整数集合如下图所示: 由图可见,整数集合中存了3个编码为int16的元素 4.查找元素 由于整数集合的有序性,所以查找某个元素是非常容易的,且其底层是以数组形式存储,所以很自然的想到二分,比较简单,流程如下图所示: 5.升级插入 好了,终于到整数集合最关键的操作了。

    79900发布于 2018-10-11
  • 来自专栏kafka专栏

    【Redis】三、Redis整数集合和压缩列表

    整数集合 ---- 整数集合(intset)是集合建的底层实现之一,当一个集合只包括整数值的元素,并且这个集合的元素数量不多时,Redis就会用整数集合作为集合建的底层实现 typedef struct []; }intset; contents 数组是整数集合的底层实现: 数组中的各个项按值大小有序排列,并且数组中不包含任何重复项; 整数集合集合建的底层实现之一 整数集合的底层实现为数组 65535整数,那就会将整个集合升级为int32_t 类型的; 并且之前的int16_t类型的1、2、3也会用int32_t类型来保存; 升级操作为整数集合带来了操作上的灵活性,并且尽可能的节约了内存 previous length的长度可能是1个字节或者是5个字节,如果上一个节点的长度小于254,则该节点只需要一个字节就可以表示前一个节点的长度了,如果前一个节点的长度大于等于254,则previous encoding 节点的encoding保存的是节点的content的内容类型以及长度,encoding类型一共有两种,一种字节数组一种是整数,encoding区域长度为1字节、2字节或者5字节长 content

    71330发布于 2021-07-14
  • 来自专栏用户7890857的专栏

    4、Redis数据结构——整数集合-intset

    整数集合 整数集合集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 1、整数集合实现: 整数集合是redis用于保存整数值的集合抽象数据结构,它可以可以保存类型位int16_t、int32_t、int64_t的整数值,并且保证集合中不会出现重复元素。 ,并且新元素的类型比整数集合现有元素类型长时,整数集合都需要先进行升级(upgrade),然后才能将新元素添加到整数集合里面。 假如当前的整数集合中只有一个数字2,那么我们用16位的整数的数组就可以放下。 升级整数集合并添加新元素共分为三步进行: 1、 根据新元素的类型,扩张整数集合底层数组的空间大小,并为新元素分配空间。

    82200发布于 2021-06-05
  • 来自专栏技术成长

    Redis的整数集合的升级和降级

    图片当整数集合需要进行升级时,具体的步骤和机制如下:创建新的整数集合(新集合):根据需要升级的整数集合中的元素个数,预估新集合所需的存储空间,并创建一个新的整数集合。 将原整数集合中的元素迁移到新集合:遍历原整数集合中的每个元素,将其插入到新集合中。如果原整数集合是有序的,可以使用二分查找算法快速找到插入位置。 替换原整数集合为新集合:将原整数集合的指针替换为新集合的指针,使得后续的操作都基于新集合进行。释放原整数集合:通过内存管理工具释放原整数集合所占用的内存空间。 升级机制的目的是为了解决整数集合存在的局限性,例如只能存储有限范围的整数。通过升级,可以扩展整数集合的能力以适应更大范围的整数数据。 在Redis中,整数集合升级的主要好处包括:节省内存空间:整数集合是一种特殊的数据结构,用于存储整数值。在升级之前,Redis使用的是压缩列表来存储整数集合,该结构在存储大量整数时会浪费很多内存空间。

    42041编辑于 2023-09-18
  • 来自专栏兜兜毛毛

    Java集合---CopyOnWriteArrayList(5

    实现算法 该集合如其名字一样,是先创建一个新的数组,然后将旧的数组copy到新数组中,再切换数组引用。并且该数组是在每次添加时都会执行以上流程,所以不建议在多写入的场景使用。 该集合在多并发时使用ReentrantLock锁来处理并发问题,比Vector中synchronized的效率会高一些,但在并法过程中可能会出现脏读问题,如两个线程一个执行读取数组数量,一个在做写入操作 这里说明一下,之前的几个集合在删除操作时都是不会对object[]数组进行操作,但这个集合会重新生成-1的新数组。所以可以说该集合的数组长度与集合的实际数据占用长度是相同的。

    45810发布于 2019-10-23
  • 来自专栏专注 Java 基础分享

    Redis 的底层数据结构(整数集合

    当一个集合中只包含整数,并且元素的个数不是很多的话,redis 会用整数集合作为底层存储,它的一个优点就是可以节省很多内存,虽然字典结构的效率很高,但是它的实现结构相对复杂并且会分配较多的内存空间。 而我们的整数集合(intset)可以做到使用较少的内存空间却达到和字典一样效率的实现,但也是前提的,集合中只能包含整型数据并且数量不能太多。 整数集合最多能存多少个元素在 redis 中也是有体现的。 OBJ_SET_MAX_INTSET_ENTRIES 512 也就是超过 512 个元素,或者向集合中添加了字符串或其他数据结构,redis 会将整数集合向字典结构进行转换。 总结一下,整数集合(intset)使用了非常简洁的数据结构,可以更少的占用内存存储一些整数,但终究是基于数组的,也就避免不了不能存储大量数据的缺点。

    91810发布于 2019-10-23
  • 来自专栏大闲人柴毛毛

    Redis源码分析(四)——Redis数据结构-整数集合

    整数集合特点 有序:集合中所有值按照从小到大顺序排列。 不重复 可以存储int16_t、int32_t、int64_t三种类型的整数 1. 升级 整数集合中可以存储int16_t、int32_t、int64_t这三种类型的整数,但在任一时刻,集合中所有元素的类型都是统一的。 如果当前集合存储的元素是int16_t类型,当需要存入一个int32_t类型的整数时,Redis会分配一片新的内存空间,将每个元素的类型提升为int32_t,再将所有元素迁移至新数组中。 整数集合优点 4.1 灵活 整数集合可以通过自动升级底层数组来适应新元素,所以我们可以随意地将int16_t、int32_t、int64_t类型的整数添加到集合中,而不必担心类型错误。 4.2 节约内存 如果要用一个数组同时能够保存int16_t、int32_t、int64_t这三种类型的整数,那么只能创建一个int64_t类型的数组,而Redis整数集合可以保存三种类型的整数,只有当有需要的时候才进行升级操作

    1K70发布于 2018-03-09
  • 来自专栏陈琛的Redis文章

    多图解释Redis的整数集合intset升级过程

    整数集合概念 整数集合是Redis设计的一种底层结构,是set的底层实现,当集合中只包含整数值元素,并且这个集合元素数据不多时,会使用这种结构。 (这边只需要简单看下,下面针对每个模块详细说明哈) 整数集合的实现 我们看下intset.h里面关于整数集合的定义,上代码哈: //整数集合结构体 typedef struct intset { 3.根据新的编码格式新增内存 上面已经说明了编码格式为INTSET_ENC_INT32,计算规则为length*编码格式的位数,即5*32=160。所以新增的位数为64-159。 整数集合的源码分析 创建一个空集合 intsetnew 这个方法比较简单,是初始化整数集合的步骤,即下图部分。 主要的步骤是分配内存空间,设置默认编码格式,以及初始化数组长度length。 ,先从整数集合是什么,,剖析了其主要组成部分,进而通过多幅过程图解释了intset是如何升级的,最后结合源码对整数集合进行描述,如创建过程,升级过程,中间穿插例子和过程图。

    70030发布于 2020-07-07
  • 来自专栏技术杂货店

    java集合5】——— Iterator接口

    二、为什么需要iterator接口 首先,我们知道iterator接口是为了定义遍历集合的规范,也是一种抽象,把在不同集合的遍历方式抽象出来,这样遍历的时候,就不需要知道不同集合的内部结构。 SpitIterator主要是定义类将集合分割成多个集合,方便并行计算。 public static void spliterator(){ List<String> list = Arrays.asList("1", "2", "3","4","5" 就是不断把前面一部分分出来 结果如下: tryAdvance: 1 2 ------------------------------------------- forEachRemaining: 3 4 5 ---------- spliterator1: 8 9 10 ------------------------------------------ spliterator2: 1 2 3 4 5

    82810编辑于 2022-02-15
  • 来自专栏好好学习

    Redis05-Redis的数据结构之整数集合

    整数集合的概念 当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现,它可以保存的类型为int16t、int32t或者int64_t的整数值,集合中不允许有重复元素 length属性的值为5,表示整数集合包含五个元素。content数组按从小到大的顺序保存着集合中的五个元素。 因为每个集合元素都是int16t类型的整数值,所以contents数组的大小等于 size of(int16_t)*5=80位 整数集合的升级 每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的类型都要长时 sadd user:3:tags tag1 tag2 tag5 给标签添加用户 sadd tag1:users user:1 user:2 sadd tag2:users user:1 user sadd tag3:users user:1 user:4 删除用户下的标签 srem user:1:tags tag1 tag5 计算用户共同感兴趣的标签 sinter

    54950发布于 2021-08-18
  • 来自专栏性能与架构

    Redis 5 有序集合新增命令

    Redis 5 已经发布了,对有序集合新增了4个命令: ZPOPMAX ZPOPMIN BZPOPMAX BZPOPMIN 下面看一下这几个命令的作用和用法。 ZPOPMAX 命令: ZPOPMAX key [count] 作用: 从指定集合中删除并返回 count 个 score 值最高的元素。如果没有指定 count,默认值为 1。 score redis> ZRANGE myzset 0 -1 WITHSCORES 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" # 返回2个score 值最高的元素 redis> ZPOPMAX myzset 2 1) "three" 2) "3" 3) "two" 4) "2" # 查看集合剩余元素 redis> ZRANGE myzset 0 -1 1) "one" 2) "1" 3) "two" 4) "2" # 取出一个元素,集合中还剩一个元素 redis> BZPOPMAX myzset2 0 1) "myzset2" 2) "two" 3

    1.5K20发布于 2018-12-05
  • 来自专栏Yunfeng's Simple Blog

    PyQt5 代码片段集合

    安装 目前PyQt主要是4和5版本,因为两者不兼容,因此官方建议使用PyQt5, 这里以Python3 为例进行说明。 pip3 install PyQt5 SIP 安装好后可以使用下面这个代码片段测试安装是否成功,如果可以正常运行说明安装已经成功: import sys from PyQt5 import QtCore , QtWidgets from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget from PyQt5.QtCore import PyQt5.QtMultimediaWidgets import QVideoWidget from PyQt5.QtWidgets import (QApplication, QFileDialog 中文教程, 上手非常好的教程 PyQt5 实例教程, 实例很全面

    88330发布于 2019-12-25
  • 来自专栏呼延

    Reids系列(五)底层数据结构之整数集合

    可以看到图中,当我给一个 set 中放入了 5 个数字,此时集合的编码方式是 intset, 而当我放入了一个字符串,编码方式就变成了 hashtable. 定义 intset(整数集合)是 Reids 用于保存整数值的集合抽象数据结构,可以保存 16,31,64 位的整数且保证不重复。 length 属性保存了当前整数集合中有多少个整数。 contents 是一个数组,具体是多少位整数的数组,取决 encoding 的值。 ? 这是一个保存了 5整数的 intset 的结构图。 整数集合分级的好处 用能容纳数字的最小编码进行存储,可以有效的节约内存。 整数集合封装了对三种整数之间的转换,使用我们不用考虑类型错误,可以不断的向整数集合内添加整数。提升了操作的灵活性。 不支持降级 与升级相对应的,当大的数字被删除之后,整数集合不会进行降级。 总结 整数集合时实现集合键的一种数据结构。它以有序数组的实现方式来存储所有的集合元素。

    43110发布于 2020-02-14
  • 来自专栏技术成长

    Redis整数集合的实现原理和底层数据结构

    Redis的整数集合(intset)是一种特殊的集合数据结构,它专门用于存储整数值。 这些函数会对整数集合及其中的整数值进行合理的处理和操作。Redis的整数集合通过紧凑的数组方式存储整数值,并根据整数值的大小选择合适的编码方式,以达到高效地存储和操作整数集合的目的。 Redis整数集合的底层数据结构是有序数组。优势:内存紧凑:整数集合使用连续的内存存储整数,无需额外的指针和相关的内存管理开销,因此相比于Hash表等数据结构,整数集合在存储整数时能够更加紧凑。 适用场景:由于整数集合在存储整数时具有紧凑、快速查找和简单的特点,适用于以下场景:限定范围:当需要存储一组有序的整数,并且这些整数的范围比较小,整数集合是一个很好的选择。例如,用户ID、商品ID等。 集合运算:整数集合对于一些集合运算,如并集、交集和差集等操作具有高效的性能。对于存储的整数进行这些操作时,整数集合可以提供很好的支持。

    44141编辑于 2023-09-18
  • 来自专栏技术成长

    Redis中整数集合出现的性能瓶颈和优化措施

    图片Redis在设计整数集合时考虑了内存优化。具体的优化策略如下:不同大小的整数使用不同的编码方式存储,以节省内存空间。 整数集合可以使用intset或者quicklist来实现,intset用于存储较小的整数集合,quicklist用于存储较大的整数集合。 通过以上的内存优化策略,Redis能够根据需求选择最佳的编码方式,以最小的内存消耗来存储整数集合。在Redis中,整数集合是一种特殊的数据结构,用于存储有序的整数值。 虽然整数集合在大多数情况下表现出色,但仍然存在性能瓶颈。性能瓶颈:内存占用:整数集合在存储大量连续的整数时,会导致大量的内存分配。这可能会带来内存碎片和内存不足的问题。 针对特定使用场景选择数据结构:如果集合中存放的整数具有连续性,可以考虑使用有序集合(Sorted Set)来替代整数集合。有序集合采用了跳跃表和散列表相结合的方式,用于快速范围查询。

    62391编辑于 2023-09-18
  • 来自专栏PHPer 进击

    跟着大彬读源码 - Redis 10 - 对象编码之整数集合

    整数集合是 Redis 集合键的底层实现之一。当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现。 1 整数集合的实现 整数集合是 Redis 用于保存整数值的集合抽象数据结构。它可以保存类型为 int16_t、int32_t、int64_t 的整数值,并且保证集合中不会出现重复元素。 2 升级操作 每当我们要将一个新元素添加到整数集合时,如果新元素的类型比整数集合的 encoding 类型大,整数集合就需要先进行升级操作(upgrade),然后才能将新元素添加到整数集合中。 但是,因为有了升级操作,整数集合可以通过它来自适应新元素,所以我们可以随意地将 int16_t、int32_t、和 int64_t 类型的整数添加到集合中,而不必担心出现类型错误,大大的提升了整数集合的灵活性 5 总结 整数集合集合键的底层实现之一。 整数集合以有序、无重复的方式保存集合元素。在有需要时,会根据新添加元素的类型,改变底层数组的类型。 升级操作提升了操作的灵活性,并尽可能的节约了内存。

    81820发布于 2019-08-14
  • 来自专栏前端重点笔记

    Day5 集合的深浅copy

    集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:   去重,把一个列表变成集合,就自动去重了。    1,集合的创建。 print(set1) del set1 # 删除集合 print(set1) 4,集合的其他操作:   4.1 交集。 (| 或者 union) set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7,8} print 5,frozenset不可变集合,让集合变成不可变类型。

    43750发布于 2019-09-18
  • 来自专栏拭心的安卓进阶之路

    Java 集合深入理解(5):AbstractCollection

    什么是 AbstractCollection AbstractCollection 是 Java 集合框架中 Collection 接口 的一个直接实现类, Collection 下的大多数子类都继承 实现的方法 1.addAll() 添加一个集合内的全部元素: public boolean addAll(Collection<? contains(it.next())) { return false; } } return true; } 5.isEmpty() 是否为空: it.remove(); return true; } } return false; } 7.removeAll() 删除指定集合中包含在本集合的元素 () 方法对某个集合进行处理后,再调用这个集合的 修改方法(add,remove,set…),都会报这个错; 因此 AbstractCollection.add(E) 抛出这个错误是准从标准; 那为什么会有这个标准呢

    1.2K90发布于 2018-01-05
领券