首页 > 数据库 >Redis整数集合

Redis整数集合

时间:2023-03-20 19:44:59浏览次数:44  
标签:Redis 整数 类型 int64 数组 集合 contents

集合键的底层实现之一,当集合只包含整数值元素,且报价函的元素不多时,就会使用整数集合作为集合键的底层实现。

intset实现

typedef struct intset {
	uint32_t encoding; // 编码方式
	uint32_t length; // 集合包含的元素数量
	int8_t contents[]; // 保存元素的数组
} intset;
  • contents[]: 是整数集合的底层实现,各元素在数组中按值从小到大排列,并且无重复项。
  • length:contents数组包含的元素数量,即数组长度。
  • encoding:决定contents数组包含的整数类型,虽然contents[] 明面上是声明为int8_t类型,但实际取决于encoding
    • 如果encoding = INTSET_ENC_INT16, 那么contents就是int16_t类型的数组,如果是INTSET_ENC_INT32或INTSET_ENC_INT64,就分别是int32_t, int64_t类型的数组。

如上图,虽然contents数组只有一个是真正需要64位保存的整数:contents[0],但其余四个都是int64_t类型的。所以当整数集合涉及到保存位数更多的整数的时候,就需要对数组进行升级。

升级

  • 条件:有新元素加入整数集合,并且改新元素的类型大于整数集合现有的元素的类型,整数集合触发升级操作。然后才能将新元素加入整数集合。

  • 步骤:

    • 根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。
    • 底层数组所有的元素类型换成与新元素相同的类型,并将类型转换后的元素放到正确的位置上,并且元素的整体顺序不变。
    • 将新元素添加到新数组里。

好处:

  • 提升整数集合的灵活性
    • 因为C语⾔是静态类型语⾔,为了避免类型错误,我们通常不会将两种不同类型的值放在同⼀个数据结构⾥⾯。例如,我们⼀般只使⽤int16_t类型的数组来保存int16_t类型的值,只使⽤int32_t类型的数组来保存int32_t类型的值,诸如此类。但是,因为整数集合可以通过⾃动升级底层数组来适应新元素,所以我们可以随意地将int16_t、int32_t或者int64_t类型的整数添加到集合中,⽽不必担⼼出现类型错误,这种做法⾮常灵活。
  • 节约内存
    • 要让⼀个数组可以同时保存int16_t、int32_t、int64_t三种类型的值,最简单的做法就是直接使⽤int64_t类型的数组作为整数集合的底层实现。不过这样⼀来,即使添加到整数集合⾥⾯的都是int16_t类型或者int32_t类型的值,数组都需要使⽤int64_t类型的空间去保存它们,从⽽出现浪费内存的情况。⽽整数集合现在的做法既可以让集合能同时保存三种不同类型的值,⼜可以确保升级操作只会在有需要的时候进⾏,这可以尽量节省内存。

整数集合不支持降级操作,即使将整数数组里的int64_t类型的整数全部删除,只留下int32_t或int16_t的整数,底层数组也不会降级,仍然是int64_t类型的。

标签:Redis,整数,类型,int64,数组,集合,contents
From: https://www.cnblogs.com/wz-NO1/p/17237466.html

相关文章

  • redis存储session如何查询当前请求的sessionID
    redis存储session如何查询当前请求的sessionID问题项目登录信息session使用的redis存储,在排查bug过程中需要查询缓存;发现无法知道,当前的浏览器请求获取到的缓存信息;解......
  • 查找手机价格低于3000(返回集合类型)
    packagecom.itheima.test;importjava.util.ArrayList;publicclassTest8{publicstaticvoidmain(String[]args){ArrayList<Phone>list=new......
  • linux安装redis
    redis-server../redis.conf开启服务,进程得守护着,命令终端不能退出redis-server&../redis.conf开启服务,进程不用留在终端打开的效果解决办法:https://www.......
  • Redis类型(type)与编码(encoding)
    本文已收录至Github,推荐阅读......
  • Redis类型(type)与编码(encoding)
    本文已收录至Github,推荐阅读......
  • [pat乙]1006 换个格式输出整数
    1006换个格式输出整数(15分)让我们用字母B来表示“百”、字母S表示“十”,用12…n来表示不为零的个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234......
  • Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
    文章目录​​1.Sa-Token介绍​​​​2.登录认证​​​​2.1登录与注销​​​​2.2会话查询​​​​2.3Token查询​​​​3.权限认证​​​​3.1获取当前账号权限码......
  • mybatis返回集合对象包含List<String>
    mybatis返回集合对象包含List<String>时间:2021-07-13本文章向大家介绍mybatis返回集合对象包含List<String>,主要包括mybatis返回集合对象包含List<String>使用实例、应用......
  • linux 下redis设置开机自启动
    一、创建redis服务配置文件#!/bin/sh#chkconfig:23451090#description:StartandStopredisPATH=/usr/local/bin:/sbin:/usr/bin:/bin#找到本机......
  • redis 操作集合基本操作
    Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合对象的编码可以是intset或者hashtable。Redis中集合是通过哈......