redis数据结构之intset的实例详解
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,redis数据结构之intset的实例详解在redis中,intset主要用于保存整数值,由于其底层是使用数组来保存数据的,因而当对集合进行数据添加时需要对集合进行扩容和迁移操作,因而也只有在数据量不
千家信息网最后更新 2025年02月03日redis数据结构之intset的实例详解
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保存数据的示例:
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
数据
元素
数组
整数
编码
位数
底层
数据结构
结构
属性
有序
内存
数值
数量
格式
高位
分配
剩余
升级
查询
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
好房好家天津互联网科技有限公司
中国网络安全学院教务处
证券软件开发升级排行
服务器1m带宽图片
印度在什么软件开发利用
深圳网络安全课程学历要求低
数据库安全性和稳定性
易迅网络技术有限公司
联手保障儿童网络安全
数据库中的作业有什么作用
满洲里护苗网络安全
求一款网络安全的笔记本
数据库与信息系统实验5指导解析
软件开发技术交流会主题
最新a股数量数据库
服务器安全防御
当兵后学习软件开发
sql bak数据库附加
软件开发企业级应用
北京清华万维网络技术有限
stata 建数据库
远程服务器管理软件有哪些
数据库字段下划线怎么封装实体类
初中学校网络安全应急措施
手机显示服务器异常怎么修复
易安卓用什么数据库
广东帮啦网络技术有限公司
台州哲商网络技术有限公司
梦幻手游转服务器
融顺网络技术有限公司地址