当前位置: 首页 > news >正文

世界顶级摄影网站新网站百度多久收录

世界顶级摄影网站,新网站百度多久收录,蓝色网站源码,做玩游戏任务得q币的网站(笔记总结自b站黑马程序员课程) 一、结构 IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。 结构如下: typedef struct intset {uint32_t encoding; //编码方式uint32_t l…

(笔记总结自b站黑马程序员课程)

一、结构

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

typedef struct intset {uint32_t encoding; //编码方式uint32_t length; //元素个数int8_t contents[]; //整数数组
} intset;

注意整数数组记录的是每一个数的起始地址,决定数字长度是编码方式。

其中的encoding包含三种模式,表示存储的整数大小不同:

#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

为了方便查找,Redis会将intset中所有的整数按照升序依次保存在contents数组中,结构如图:

现在,数组中每个数字都在int16_t的范围内,因此采用的编码方式是INTSET_ENC_INT16,每部分占用的字节大小为:

①encoding:4字节(固定)

②length:4字节(固定)

③contents:2字节 * 3 = 6字节  

二、扩展 

我们向该其中添加一个数字:50000,这个数字超出了int16_t的范围,intset会自动升级编码方式到合适的大小。 以当前案例来说流程如下:

  • 升级编码为INTSET_ENC_INT32, 每个整数占4字节,并按照新的编码方式及元素个数扩容数组

  • 倒序依次将数组中的元素拷贝到扩容后的正确位置(倒序可以规避数据覆盖问题)

  • 将待添加的元素放入数组末尾

  • 最后,将inset的encoding属性改为INTSET_ENC_INT32,将length属性改为4

三、源码

源码理解就行,注意插入数据底层用到了二分查找的算法。

插入新数据:

/* Insert an integer in the intset */
intset *intsetAdd(intset *is, int64_t value, uint8_t *success) {//获取当前值编码uint8_t valenc = _intsetValueEncoding(value);//要插入的位置uint32_t pos;if (success) *success = 1;/* Upgrade encoding if necessary. If we need to upgrade, we know that* this value should be either appended (if > 0) or prepended (if < 0),* because it lies outside the range of existing values. *///判断编码是否超过当前intset的编码if (valenc > intrev32ifbe(is->encoding)) {//超出编码,需要升级/* This always succeeds, so we don't need to curry *success. */return intsetUpgradeAndAdd(is,value);} else {//在当前intset中查找值与value一样元素的角标pos/* Abort if the value is already present in the set.* This call will populate "pos" with the right position to insert* the value when it cannot be found. */if (intsetSearch(is,value,&pos)) {if (success) *success = 0; //如果找到了,则无需插入,直接结束并返回失败return is;}//数组扩容is = intsetResize(is,intrev32ifbe(is->length)+1);//移动数组中pos之后的元素到pos+1,给新元素腾出空间if (pos < intrev32ifbe(is->length)) intsetMoveTail(is,pos,pos+1);}//插入新元素_intsetSet(is,pos,value);//重置元素长度is->length = intrev32ifbe(intrev32ifbe(is->length)+1);return is;
}

升级编码方式:

/* Upgrades the intset to a larger encoding and inserts the given integer. */
static intset *intsetUpgradeAndAdd(intset *is, int64_t value) {//获取当前inset编码uint8_t curenc = intrev32ifbe(is->encoding);//获取新编码uint8_t newenc = _intsetValueEncoding(value);int length = intrev32ifbe(is->length); //获取元素个数//判断新元素是大于0还是小于0,小于0插入队首,大于0插入队尾int prepend = value < 0 ? 1 : 0;//重置编码为新编码/* First set new encoding and resize */is->encoding = intrev32ifbe(newenc);//重置数组大小is = intsetResize(is,intrev32ifbe(is->length)+1);/* Upgrade back-to-front so we don't overwrite values.* Note that the "prepend" variable is used to make sure we have an empty* space at either the beginning or the end of the intset. *///倒序遍历,诸葛搬运元素到新的位置while(length--)_intsetSet(is,length+prepend,_intsetGetEncoded(is,length,curenc));/* Set the value at the beginning or the end. *///插入新元素,prepend决定是队首还是队尾if (prepend)_intsetSet(is,0,value);else_intsetSet(is,intrev32ifbe(is->length),value);//修改数组长度is->length = intrev32ifbe(intrev32ifbe(is->length)+1);return is;
}

四、总结

Intset可以看做是特殊的整数数组,具备一些特点:

  • Redis会确保Intset中的元素唯一、有序

  • 具备类型升级机制,可以节省内存空间

  • 底层采用二分查找方式来查询

注意:一般适合在数据量不是很多的情况下使用 

http://www.hengruixuexiao.com/news/11745.html

相关文章:

  • 宜昌c2b网站建设搜索引擎推广
  • 广州新闻频道短视频矩阵seo系统源码
  • 惠州仲恺住房和城乡建设局网站友情链接管理系统
  • 买域名做网站表白优化英语
  • 网站 换图片让百度收录自己的网站
  • 烟台专业做网站公司哪家好网站一级域名和二级域名区别
  • 怎么打开域名网站中国互联网公司排名
  • 贸易公司寮步网站建设哪家好做电商一个月能挣多少钱
  • 怎样做交互式网站搜狗站长平台验证不了
  • wordpress下载及安装运营seo是什么意思
  • 合肥电子商务开发网站建设深圳做网站seo
  • 山东省春季高考网站建设试题国内新闻最新消息
  • 阿里巴巴网站规划德国搜索引擎
  • wordpress无法查看发布上海百度关键词优化公司
  • 潍坊地区制作网站免费下载b站视频软件
  • 安卓网站建站系统下载网站seo推广优化教程
  • 网站建设商业计划书上海网站优化公司
  • 网站代理备案价格企业内训机构
  • 制作网站的商家河南关键词排名顾问
  • 南宁网站建设哪家公司会计培训班哪个机构比较好
  • 单位网站建设方案seo网络推广公司排名
  • 建立网站 用英语如何做网络营销推广
  • 上海宝山手机网站制作中国十大广告公司排行榜
  • 做业务员要认识什么批发网站竞价托管哪家便宜
  • 入户广州网站网站收录怎么弄
  • 海口免费做网站亚马逊跨境电商
  • 做家具商城网站行业门户网站推广
  • 网页图片文字识别郑州网站优化外包
  • vps怎么搭建wordpressseo网站推广方式
  • 17网站一起做网店怎么样郑州seo顾问热狗