redis数据结构之intset的实例详解

在redis中,intset主要用于保存整数值,由于其底层是使用数组来保存数据的,因而当对集合进行数据添加时需要对集合进行扩容和迁移操作,因而也只有在数据量不大时redis才使用该数据结构来保存整数集合。其具体的底层数据结构如下:
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
整数集合主要有三个属性:encoding用于保存当前集合的编码,有16位,32位和64位三种;length保存了当前整数集合中保存的数据数量;contents属性则保存了具体的数据,其每个数据占用的位数由encoding属性指定。
这里主要需要进行说明的是redis的intset中数据是采用从小到大的顺序存储的,因而对于数据的查询可以采用二分法进行查询,具体的搜索代码如下:
static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
int min = 0, max = intrev32ifbe(is->length)-1, mid = -1;
int64_t cur = -1;
/* The value can never be found when the set is empty */
// 处理 is 为空时的情况
if (intrev32ifbe(is->length) == 0) {
if (pos) *pos = 0;
return 0;
} else {
/* Check for the case where we know we cannot find the value,
* but do know the insert position. */
// 因为底层数组是有序的,如果 value 比数组中最后一个值都要大
// 那么 value 肯定不存在于集合中,
// 并且应该将 value 添加到底层数组的最末端
if (value > _intsetGet(is,intrev32ifbe(is->length)-1)) {
if (pos) *pos = intrev32ifbe(is->length);
return 0;
// 因为底层数组是有序的,如果 value 比数组中最前一个值都要小
// 那么 value 肯定不存在于集合中,
// 并且应该将它添加到底层数组的最前端
} else if (value < _intsetGet(is,0)) {
if (pos) *pos = 0;
return 0;
}
}
// 在有序数组中进行二分查找
// T = O(log N)
while(max >= min) {
mid = (min+max)/2;
cur = _intsetGet(is,mid);
if (value > cur) {
min = mid+1;
} else if (value < cur) {
max = mid-1;
} else {
break;
}
}
// 检查是否已经找到了 value
if (value == cur) {
if (pos) *pos = mid;
return 1;
} else {
if (pos) *pos = min;
return 0;
}
}
此外,整数集合中具体还有两个需要说明的操作是升级和降级。升级指的是当向低编码的整数集合中添加位数较高的数值时,就会扩容并将整数集合中的所有元素都转换为高位数的编码格式,然后把新添加的元素插入到指定位置;降级指的是当将整数集合中唯一一个高位的元素删除时会将其余元素转换为低位数的编码格式,但是为了提升速率,redis中并不会为剩余元素重新分配内存并进行编码转换,而只是会将该高位元素给删除,并重新分配内存给剩余的元素,然后迁移数据。如图是inset保存数据的示例:
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# redis
# intset
# 数据结构之intset的使用方法
# Redis的六种底层数据结构(小结)
# 多维度深入分析Redis的5种基本数据结构
# 详解redis数据结构之压缩列表
# Redis中5种数据结构的使用场景介绍
# redis中跳表zset的具体使用
# redis使用skiplist跳表的原因解析
# 为何Redis使用跳表而非红黑树实现SortedSet
# Redis中的数据结构跳表详解
# 数据结构
# 都要
# 组中
# 不存在
# 指的是
# 转换为
# 的是
# 存了
# 就会
# 如有
# 较高
# 希望能
# 并将
# 三种
# 要对
# 如图
# 将它
# 谢谢大家
# 会为
# 唯一一
相关文章:
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何在云服务器上快速搭建个人网站?
网站制作新手教程,新手建设一个网站需要注意些什么?
如何彻底卸载建站之星软件?
建站之星安装后如何自定义网站颜色与字体?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
山东云建站价格为何差异显著?
建站VPS推荐:2025年高性能服务器配置指南
建站与域名管理如何高效结合?
c# 服务器GC和工作站GC的区别和设置
建站之星如何快速生成多端适配网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何访问已购建站主机并解决登录问题?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
网站制作壁纸教程视频,电脑壁纸网站?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
宿州网站制作公司兴策,安徽省低保查询网站?
网站制作说明怎么写,简述网页设计的流程并说明原因?
建站主机CVM配置优化、SEO策略与性能提升指南
建站之星云端配置指南:模板选择与SEO优化一键生成
如何使用Golang table-driven基准测试_多组数据测量函数效率
建站之星24小时客服电话如何获取?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何通过IIS搭建网站并配置访问权限?
建站之星好吗?新手能否轻松上手建站?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何使用Golang安装API文档生成工具_快速生成接口文档
php json中文编码为null的解决办法
如何快速完成中国万网建站详细流程?
如何选择适配移动端的WAP自助建站平台?
南宁网站建设制作定制,南宁网站建设可以定制吗?
济南专业网站制作公司,济南信息工程学校怎么样?
如何快速登录WAP自助建站平台?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
高性价比服务器租赁——企业级配置与24小时运维服务
如何挑选最适合建站的高性能VPS主机?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
北京的网站制作公司有哪些,哪个视频网站最好?
建站上市公司网站建设方案与SEO优化服务定制指南
如何在橙子建站上传落地页?操作指南详解
制作网站怎么制作,*游戏网站怎么搭建?
如何高效利用200m空间完成建站?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
建站之星伪静态规则如何设置?
如何用免费手机建站系统零基础打造专业网站?
网站图片在线制作软件,怎么在图片上做链接?
*请认真填写需求信息,我们会在24小时内与您取得联系。