为了账号安全,请及时绑定邮箱和手机立即绑定

快速整明白Redis中的整数集合到底是个啥

标签:
Redis

整数集合简介

整数集合(intset)是Redis集合数据类型的内部编码之一,当集合数据类型中的元素都是整数并且元素数量较少的时候,Redis就使用整数集合作为内部编码。

整数集合(intset)中可以保存int16_tint32_tint64_t类型的整数,而且保证整数集合中元素不会重复。

整数集合的结构

整数集合(intset)的结构中包含三个属性:编码方式(encoding)、元素数量(length)和元素数组(contents)。

  • 编码方式(encoding)表示当前整数集合的编码方式,可以设置为:INTSET_ENC_INT16INTSET_ENC_INT32INTSET_ENC_INT64
  • 元素数量(length)表示当前整数集合的包含元素的数量,也就是保存元素的数组的长度。
  • 元素数组(contents)保存了当前整数集合的所有元素,每一个元素都是数组的一个数组项,元素按照从小到大在数组中排列,并且没有重复的元素。

当编码方式为INTSET_ENC_INT16的时候,元素数组就是一个int16_t类型的数组,数组中的每个项都是int16_t类型的整数(最小值为−215-2^{15}215 = -32,768,最大值为215−12^{15} - 12151 = 32,767)。

当编码方式为INTSET_ENC_INT32的时候,元素数组就是一个int32_t类型的数组,数组中的每个项都是int32_t类型的整数(最小值为−231-2^{31}231 = -2,147,483,648,最大值为231−12^{31} - 12311 = 2,147,483,647)。

当编码方式为INTSET_ENC_INT64的时候,元素数组就是一个int64_t类型的数组,数组中的每个项都是int64_t类型的整数(最小值为−263-2^{63}263 = -9,223,372,036,854,775,808,最大值为263−12^{63} - 12631 = 9,223,372,036,854,775,807)。

整数集合的升级

向整数集合添加元素的时候,如果新元素的类型比这个整数集合的编码方式还长,那么整数集合就是先进行升级,然后再把新元素添加进去。

升级的操作包括:

  • INTSET_ENC_INT16升级到INTSET_ENC_INT32
  • INTSET_ENC_INT16升级到INTSET_ENC_INT64
  • INTSET_ENC_INT32升级到INTSET_ENC_INT64

升级过程总共分为3步:

  1. 根据新元素的数据类型,增大元素数组的内存空间,同时为新元素也分配好空间。
  2. 把现有的元素都转换为新元素的数据类型,并按照从小到大的顺序放到正确的位上。
  3. 把新元素放到元素数组的最后一个位置上。

另外,整数集合是不支持降级操作的。即使元素被删除后,整数集合符合较短的编码方式,也不会有降级操作。

总结

整数集合(intset)是Redis集合数据类型的内部编码之一,可以保存int16_tint32_tint64_t类型的整数。

整数集合(intset)的结构中包含三个属性:编码方式(encoding)、元素数量(length)和元素数组(contents)。

新增的元素的类型比整数集合的编码方式还长时,该整数集合会有升级操作。整数集合不支持降级操作。

最后,谢谢你这么帅,还给我点赞推荐关注

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消