首页 > 数据库 >redis自学(2)IntSet

redis自学(2)IntSet

时间:2024-02-21 14:15:12浏览次数:23  
标签:IntSet 字节 元素 redis 升级 数组 自学 编码方式

IntSet

IntSet是redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。

 

 

可能会有疑惑,int8_t 的数组contents只有1个字节,怎么可能存的下数组,其实这里的contents存储的只是指向真正数组的指针。

IntSet的取值范围大小,实际上是由encoding属性决定的

 

 

length则是存储元素的个数。

 IntSet为了方便查找,会将数组中的元素按照升序存储

 

有个明显的疑问,元素“5”明显用不了int16的两个字节,冗余了,但是为什么还要这样呢,这是为了方便确定元素的脚标,能够更快的根据脚标查找元素,达到快速寻址。因为IntSet的内存地址是连续的,如果找脚标为1 的数据,那么拿脚标为0的地址+2个字节就是1的地址了

 

IntSet升级(占用内存空间一开始从小到大,节省内存空间)

  1. IntSet会自动升级编码方式到合适的大小。升级会根据新元素的大小判断合适的编码方式,升级的同时,原先的元素编码的方式一起升级扩容。重新申请内存,然后倒序依次将数组中的元素拷贝到扩容后正确的位置,正序会存在数据覆盖的情况,比如原先第一个元素两个字节,新的编码方式是4个字节,正序存储,第一个元素会直接把第二个元素给覆盖了,倒序是从后面开始,不会出现覆盖数据的情况,同时角标不会改变。
  2. 将待添加的元素放入数组队尾,也可能是队首,因为新元素有可能是负值,放在哪里在升级前就已经有判断了。
  3. 最后修改insert的encoding信息和length信息为最新的编码方式。

 

IntSet保证正序的方式是插入的时候,进行二分查找。

IntSet不适合数据量多的情况下使用,因为申请特别大的连续内存空间可能不方便。

标签:IntSet,字节,元素,redis,升级,数组,自学,编码方式
From: https://www.cnblogs.com/bulesea/p/18025061

相关文章

  • redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库 安装 工具 启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型......
  • Redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库安装工具启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型......
  • redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库安装工具启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型1.String......
  • 05 内存快照:宕机,Redis如何快速恢复?
    内存快照:指内存中的数据在某一个时刻的状态以文件的形式写到磁盘上,类似于照片。快照文件就称为RDB文件,其中,RDB就是RedisDataBase的缩写。两个关键问题:对哪些数据做快照?关系到快照的执行效率问题;做快照时,数据还能被增删改吗?关系到Redis是否被阻塞,能否同时正常处理请求......
  • 04 AOF日志:宕机,Redis如何避免数据丢失
    Redis的持久化主要有两大机制,即AOF(AppendOnlyFile)日志和RDB快照。Redis用于避免数据丢失的AOF方法数据库的写前日志(WriteAheadLog,WAL),在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。AOF日志正好相反,是写后日志,Redis是先执行命令,把数据写入内......
  • redis自学(1) 动态字符串SDS
      字符串是redis最常见的数据结构,但redis并没有直接使用C语言的字符串,是因为C语言本身其实是没有字符串的,所谓的字符串其实是字符数组(Java语言中的字符串是一个对象),所以C语言的字符串有很多问题:①获取字符串长度需要通过运算C语言的字符串数组都是以’\0’结尾,这是一个字符......
  • 认识Redis:不只是缓存,还有这些厉害的功能!
    在当今数据驱动的世界中,快速存取信息成为了技术发展的关键。而在众多存储解决方案中,Redis以其独特的魅力和强大的功能,成为了开发者们的宠儿。今天,就让我们一起来认识一下Redis。一、Redis是什么,可以用来干什么?Redis,英文全称是RemoteDictionaryServer(远程字典服务),是一个开源......
  • 4-Redis十大关系之哈希Hash
    Redis十大关系之哈希Hash:Map<String,Map<Object,Object>>HSETkeyfieldvaluefieldvalue...:设置属性值HGETkeyfield:获取对应属性值HGETALLkey:遍历哈希HDELkeyfield:删除field对应的属性HLENkey:获取某个key内的全部数量HEXISTSkeyfield:判断key中有没有fie......
  • NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数
    NoSQL数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!【官网地址】:http://www.redisant.cn/nosql介绍直观的用户界面从单一应用程序中同时连接Redis、Memcached、SSDB、LevelDB、RocksDB,你可以快速轻松地创建......
  • Redis3主3从+pg1主2从
    目录一、环境准备二、安装服务器部署redis集群1.安装需求2.创建redis3.上传软件4.编译安装4.1编译安装root用户编译否则问题一4.2验证安装是否成功4.3操作过程5.新建redis集群配置文件5.1新建配置文件目录,复制模板配置文件5.2修改默认配置文件6.部署步骤6.1启动redi......