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

奇月网络官方网站sousou提交网站入口

奇月网络官方网站,sousou提交网站入口,网站名字要备案吗,wordpress壁纸模板简单动态字符串SDS Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组#xff0c;以下简称C字符串)#xff0c;而是自己构 建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型#xff0c;并将SDS用作Redis的默认字符 串表示。 SDS 的实现…简单动态字符串SDS Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组以下简称C字符串)而是自己构 建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型并将SDS用作Redis的默认字符 串表示。 SDS 的实现 struct sdshdr{// 记录buf中已使用字节数量等于sds保存字符串的长度int len;// 记录buf数组中未使用字节的数量int free;// 字节数组保存字符串char buf[]; }SDS 与 C字符串的区别 常数复杂度获取字符串的长度。sds中记录了字符串长度可以直接获取杜绝缓存区溢出。sds的空间分配完全杜绝了发生缓冲区溢出的可能性当sds API需要对SDS进行修改的时候API会先检查SDS的空间是否满足修改的需要如果不满足会自动将SDS的空间扩展至执行修改所需的大小。减少修改字符串时带来的内存冲分配次数。 空间预分配。优化SDS字符串增长操作当SDS需要进行空间扩展的时候程序不仅会为SDS分配修改锁必须要的空间还会为SDS分配额外的未使用空间。分配公式 如果对SDS进行修改之后SDS的长度小于1MB那么程序分配和len属性同样大小的未使用空间这时SDS的len属性的值和free相同如果对SDS进行修改之后SDS的长度大于1MB那么程序会分配1MB的未使用空间。 惰性空间的释放。用于优化SDS的字符串缩短操作当SDS缩短的时候程序不立即使用内存重分配来回收缩短后多出来的字节而是使用free属性将这些字节的数量记录起来。等待将来使用。SDS API提供的有真正释放空间的方法。 二进制安全。C字符串必须符合某种编码并且除字符串末尾外不能包含空字符只能保存文本数据。SDS通过len判断字符串末尾。SDS不是保存字符而是保存二进制所以SDS不仅可以保存文本数据还可以保存二进制。 链表 链表的实现 链表节点的结构 typedef struct listNode{struct listNode *prev;struct listNode *next;void *value; }listNode;持有链表的结构 typedef struct list{listNode *head;listNode *tail;unsigned long len;// 节点值复制函数void *(*dup)(void *ptr);// 节点值释放函数void (*free)(void *ptr);// 节点值对比函数int (*match)(void *ptr, void *key); }list;Redis 链表的特点 双向双向列表。无环表头的prev指针和表尾的next指针都执行null。长度计数获取节点数量的复杂度为O(1)多态链表节点使用void*指针来保存节点值可以通过list结构的dupfreematch三个属性为节点值设置类型特定函数所以链表可以用于保存各种不同类型的值。 字典map 字典的实现 Redis的字典使用哈希表作为底层实现一个哈希表里面可以有多个哈希表节点而每个哈希表节点就保存了字典中的一个键值对。 哈希表的结构定义 typedef struct dictht{//哈希表数组dictEntry **table;// 哈希表的大小unsigned long size;// 哈希表大小掩码用于计算索引总是等于size- 1unsigned long sizemask;// 哈希表已有节点的数量unsigned long used; }table属性是一个数组数组中的每一个元素都是一个指向dict.h/dictEntry结构每个dictEntry结构保存一个键值对。 哈希表节点结构定义 typedef struct dictEntry{void *key;union{void *val;unit64_tu64;int64_ts64;}v;// 指向下一个哈希表节点形成链表 struct dictEntry *next; }字典结构的定义 typedef struct dict{// 类型特定函数dictType *type;// 私有数据void *privadata;// 哈希表dictht ht[2];// rehash 索引 当rehash不再进行时值为-1int trehashidx; }type 是一个指向dictType结构的指针每个dictType结构保存了一簇用于操作特定类型键值对的函数Redis会为用途不同的字典设置不同的类型特定函数。privdata保存了需要传给那些类型特定函数的可选参数。ht[2] 保存了两个hash表一般情况下只使用h[0] 在进行rehash的时候会使用到h[1]trehashidx 记录了rehash的进度。 解决hash冲突 使用链地址法解决hash冲突。 rehash 哈希表保存的键值对数量太多或者太少的时候将要执行rehash重新散列 rehash的步骤 为字典的ht[1] 哈希表分配空间这个哈希表的大小决定于要执行的操作以及ht[0] 当前包含的键值对数量即ht[0].used属性的值、 如果执行的扩展操作ht[1].size 第一个大于等于ht[0].used * 2的2的n次幂收缩操作ht[1] 第一个大于等于ht[0].used * 2的2的n次幂 保存在ht[0]中的键值对重新rehash到ht[1]上。迁移完成之后释放ht[0] 将 ht[1] 设置为ht[0]并在ht[1]新创建一个空白哈希表。 什么时候进行扩展与收缩呢 程序自动对哈希表扩展的条件满足一条即可 服务器目前没有在执行BGSAVE或者BGREWRITEAOF命令并且哈希表负载因子大于等于1服务器在执行BGSAVE或者BGREWRITEAOF命令并且哈希表负载因子大于等于5 负载因子(factor) 哈希表以保存节点数量 / 哈希表大小。ht[0].used / ht[0].size 自动收缩的条件负载因子小于0.1 渐进式rehash 在字典中维持一个索引计数器变量rehashidx通过这个变量进行rehash。 首先将rehashidx设置为0表示rehash开始。在rehash期间每次对字典进行添加删除查找或者更新操作时顺带进行rehash 即将ht[0]哈希表在rehashidx索引上的键值对rehash到ht[1]上 rehashidx逐渐增加所有的rehash之后将rehashidx设置为-1表示结束。 这种方式避免了集中式的rehash带来的庞大工作量。在进行使用中逐渐的rehash完成。 在渐进式rehash过程中字典会同时使用ht[0]和ht[1]两个哈希表。例如查找回去两个哈希表中进行。新添加的只保存到ht[1]中。最终ht[0]变为空表。 跳跃表 跳跃表支持平均O(logN)最坏O(N)复杂度的节点查找还可以通过顺序性操作来批量处理节点。在Redis中用于实现有序集合。 跳跃表的实现 跳跃表由zskiplistNode和zskiplist两个结构定义。 header指向的节点是表头节点表头节点只有层其它属性不会使用。 跳跃表节点的实现 typedef struct zskiplistNode{// 层struct zskiplistLevel{//前进指针struct zskiplistNode *forward;//跨度unsigned int span;} level[];// 后退指针struct zskiplistNode *backward;//分值double score;//成员对象robj *obj; }zskiplistNode;层 level[]。通过层加快访问其它节点的速度。数组中的每个元素包含一个指向其它节点的指针和与指向节点的跨度。每次创建一个新跳跃表节点的时候程序根据幂次定律power law越大的数出现的概率越小随机生成一个介于1和32之间的值作为level数组的大小这个大小就是层的高度。 **前进指针。**每个层都有一个指向表尾方向的前进指针。**层的跨度**用于记录两个节点之间的距离。 **后退指针。**用于表尾向表头方向访问节点。每次只能回退至前一个节点。**分值和成员。**节点的分值是一个double类型的浮点数跳跃表中的所有节点都按分值从小到大来排序。节点的成员对象是一个指针它指向一个字符串对象保存着一个SDS值。成员对象必须是唯一的分值是可以相同的。 跳跃表结构定义 typedef struct zskiplist{//表头节点和表尾节点struct zskiplistNode *header, *tail;//表中节点的数量unsigned long length;//表中层数最大的节点层数不包括表头节点int level; }zskiplist;通过这个结构持有跳跃表节点。 整数集合 整数集合是集合键的底层实现之一当一个集合只包含整数值元素并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现。 整数集合的实现 整数集合是Redis用于保存整数数值的集合抽象数据结构它可以保存int16_tint32_t或者int64_t的整数值并且保证集合中不会出现重复元素。 intset结构表示一个整数集合 typedef struct intset{//编码方式uint32_t encoding;//集合包含的元素数量uint32_t length;//保存元素的数组int8_t contents[]; }intset;contents 数组是整数集合的底层实现整数集合的每个元素都是contents数组的一个数组项item各个项在数组中按值的大小从小到大有序地排列并且数组中不会包括任何重复项。contents属性声明为int8_t类型的数组但实际上contents数组不保存任何int8_t类型的数组contents数组的真正类型取决于encoding属性的值。 升级 每当将一个新元素添加到整数集合里面并且新元素的类型比整数集合现在所有元素的类型都要长时整数集合需要先进行升级upgrade然后才能将新元素添加到整数集合里面。 升级整数集合并添加新元素分为三步进行 根据新元素的类型扩展整数集合底层数组的空间大小并为新元素分配空间。将底层数组现有的所有元素都转换成与新元素相同的类型并将类型转换后的元素放置到正确位置上。将新元素加到底层数组里面。 升级的好处1提升整数集合的灵活性使用者不用考虑整数的类型底层会自动升级类型不用担心类型错误。2尽可能的节约内存。 整数集合不支持降级升级后编码就会一直保持升级后的状态。 压缩列表 压缩列表ziplist是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项并且每个列表要么就是小整数值要么就是长度比较短的字符串那么Redis就会使用压缩列表来做列表键的底层实现。 压缩列表的实现 压缩列表是Redis为了节约内存而开发的是由一系列特殊编码的连续内存块组成的顺序型数据结构。 压缩列表节点的构成 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 节点的previous_entry_length属性以字节为单位记录了压缩列表中前一个节点的长度。所以程序可以通过指针运算根据当前节点的起始地址来计算出前一个节点的起始地址。 压缩列表从表尾向表头遍历操作就是通过这一原理实现的。 encoding属性记录了节点的content属性所保存数据的类型以及长度。 content复制保存节点的值可以是一个字节数组或者整数值的类型和长度由节点的encoding属性决定。 对象 上面介绍了Redis用到的所有主要数据结构Redis并没有字节使用这些数据结构来实现键值对数据库而是基于这些数据结构创建了一个对象系统这个系统包含字符串列表哈希集合有序集合这五种类型的对象每一种对象都至少用到了一种前面介绍的数据结构。 Redis对象系统还是先了**基于引用计数技术的内存回收机制。**对象的引用计数属性还带有对象共享的作用。 集合对象底层实现可以是intset整数集合或者hashtable 有序集合对象底层实现可以是ziplist或者skiplist。还包含一个用字典为有序集合创建了一个从成员到分值的映射。 哈希对象底层实现可以是ziplist或者hashtable 列表对象底层实现可以是ziplist或者linkedlist 对象的空转时长对象结构包含一个lru属性记录对象最后一次被命令程序访问的时间。 服务器打开了maxmemory选项时并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时空转时长较高的那部分键会优先被释放从而回收内存。 参考《Redis设计与实现》
http://www.w-s-a.com/news/852777/

相关文章:

  • wordpress 人物页面seo优化公司信
  • 高端网站建设报价网站建设需要硬件设备
  • 做国际物流在哪些网站找客户营销qq怎么申请
  • 网站做推广百度好还是360好科技厅
  • 网站开发工具排名万户网络建一个网站虽要多少钱
  • 用凡科做的网站要钱吗WordPress城市切换
  • 制作一个门户网站需要多少钱营销型网站特征
  • 手机网站 多html中国建设银行网站包头分行
  • 哪个网站做免费广告好招牌图片效果图设计制作
  • 网站建设优化服务机构苏州市做网站
  • 网站如何优化流程企业网站管理系统视频教程
  • 我想克隆个网站 怎么做贵州住房和城乡建设厅官网
  • 网站建设项目前景上海今天新闻综合频道
  • 做网站推销的如何谈客户wordpress怎么做商城
  • 摄影素材库网站服装页面设计的网站
  • 如何用国外网站做头条做个游戏app的费用大概多少
  • 网站 形象入口页福州网站建设网络公司排名
  • 免费下载教学设计的网站送网站建设管理信息内容审核制度
  • 外贸专业网站的公司百度旗下13个app
  • 物理组简介 网站建设高师院校语言类课程体系改革与建设 教学成果奖申报网站
  • 爱网站无法登录怎么回事手表网
  • 网站建设公司现在还挣钱吗山西手动网站建设推荐平台
  • 重庆建设工程交易信息网站网站制作公司起名
  • 东莞寮步做网站的有吗企业宣传册制作
  • 做网站的软件是哪个上蔡做网站
  • 前后端分离实现网站开发紧急通知网页升级
  • 河北专业网站建设公司推荐佛山小程序开发平台
  • 网站开发强制开启浏览器极速模式建设网站有什么风险
  • 360全景网站建设常州专业网站建设公司咨询
  • 重庆大渡口网站建设网站增加一体化建设功能的好处