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

泰州住房和城乡建设网站易语言做网站客户端

泰州住房和城乡建设网站,易语言做网站客户端,设计网站过程,莆田网站制作计划列表 文章目录 列表压缩列表-ziplistziplist 定义级联更新 快速列表-quicklistquicklistNode 定义quicklist 定义quicklist常用操作其他操作quicklist 相对于普通链表优点quick应用场景在redis 中使用quicklist 列表数据类型可以存储一组按插入顺序排序的字符串#xff0c;他很…列表 文章目录 列表压缩列表-ziplistziplist 定义级联更新 快速列表-quicklistquicklistNode 定义quicklist 定义quicklist常用操作其他操作quicklist 相对于普通链表优点quick应用场景在redis 中使用quicklist 列表数据类型可以存储一组按插入顺序排序的字符串他很灵活支持两端插入、弹出数据可以充当栈和队列的角色。 压缩列表-ziplist 链表和数组都可以实现列表类型Redis 使用的是链表结构下面是一种常见的链表实现方式 typedef struct listNode {struct listNode *prev; //上一个数据节点struct listNode *next; //下一个数据节void *value; //数据内容 } listNode;typedef struct list {listNode *head;listNode *tail;void *(*dup)(void *ptr);void (*free)(void *ptr);int (*match)(void *ptr, void *key);unsigned long len; } list;Redis 内部使用该链表来保存运行数据比如主服务器下的所有从服务器的信息。 但Redis 并不使用该链表来保存用户列表的数据因为他对内存管理不够友好原因如下 链表的每个节点都占用一块独立的内存导致了内存碎片古过多。链表节点中前后节点指针占用过多的额外内存。 那数组就可以完美的解决这两个问题 ziplist就是一个类似数组的紧凑型链表他会申请一整块的内存在这个内存上存放所有的数据 这就是ziplist的设计思想。 ziplist 定义 ziplist 的总体布局如下 … zlbytesziplist的长度。 4字节zltailziplist头部到末尾元素的长度通过zltail字段可以很方便获取末尾元素的地址。4字节zllen元素的个数最大可以存放65535个元素。2字节zlend结束标志值固定为0xFF。entry: ziplist 中保存的节点 1字节 节点布局 entry-data : 该节点元素即节点存储的数据 prevlen: 记录前驱节点的长度该属性的长度为1字节或者5字节 如果前一个元素长度小于254则该属性占用1byte否则第一个字节固定为254剩余4byte存放前一个元素的长度不为255的原因是255和结尾标志重复 enconding:表示编码类型有以下几种 字符串编码字符串类型有1、2、5三种编码长度前两位表示编码类型剩余位表示字符串长度 00|aaaaaa存储长度小于等于63byte的字符串。 01|aaaaaa bbbbbbbb存储长度小于等于16383byte的字符串。 10|...... bbbbbbbb cccccccc dddddddd eeeeeeee存储长度小于等于4294967295byte的字符串.固定为0。整型编码 1100 0000表示16位有符号整数entry-data占用2byte。 1101 0000表示32位有符号整数entry-data占用4byte。 1110 0000表示64位有符号整数entry-data占用8byte。 1111 0000表示24位有符号整数entry-data占用3byte。 1111 1110表示8位有符号整数entry-data占用1byte。 1111 0001 - 1111 1101没有entry-data部分依次表示整数0-12。级联更新 级联更新是指因为插入、删除、更新等操作导致后续连续多个元素出现更新的现象。核心原因是ziplist的每个元素存放着上一个元素的长度。最差情况下后面所有元素都得更新但是这种情况很少见。 快速列表-quicklist quicklist 的设计思想很简单将一个ziplist 拆分成多个短的ziplist ,避免插入或者删除元素时会导致大量内存拷贝 **quicklist 其实就是简单的双链表但每个双链表节点中保存一个 ziplist**然后每个 ziplist 中存一批 list 中的数据 (具体 ziplist 大小可配置)这样既可以避免大量链表指针带来的内存消耗也可以避免 ziplist 更新导致的大量性能损耗将大的 ziplist 化整为零。 quicklistNode 定义 typedef struct quicklistNode {struct quicklistNode *prev;struct quicklistNode *next;unsigned char *zl; // quicklist节点对应的ziplist -指向了一个 ziplist 结构unsigned int sz; // ziplist的字节数 unsigned int count : 16; // ziplist的元素数量unsigned int encoding : 2; // 数据类型2表示节点已压缩1表示节点未压缩unsigned int container : 2; // 目前固定为2 表示使用ziplist 存储数据unsigned int recompress : 1; // 1表示暂时解压后续需要时再将其解压- 表示该节点是否需要重新压缩。unsigned int attempted_compress : 1; // 节点无法压缩太小了 unsigned int extra : 10; // 预留暂未使用 } quicklistNode;quicklist 定义 当链表很长时中间节点的访问频率较低这时Redis 会将中间节点进行压缩更进一步的节省内存空间–采用LZF压缩 //压缩后的节点定义 typedef struct quicklistLZF {size_t sz; // 压缩后的ziplist大小char compressed[];//存放压缩后的ziplist字节数组 } quicklistLZF;typedef struct quicklist {quicklistNode *head; /* 头结点 */quicklistNode *tail; /* 尾结点 */unsigned long count; /* 在所有的ziplist中的entry总数 */unsigned long len; /* quicklist节点总数 */int fill : QL_FILL_BITS; /* 16位每个节点的最大容量 */unsigned int compress : QL_COMP_BITS; /* 16位quicklist的压缩深度0表示所有节点都不压缩否则就表示从两端开始有多 少个节点不压缩 */unsigned int bookmark_count: QL_BM_BITS; /*4位bookmarks数组的大小bookmarks是一个可选字段用来quicklist重新 分配内存空间时使用不使用时不占用空间*/quicklistBookmark bookmarks []; } quicklist;其中fill 和 compress 是两个重要的字段它们决定了 quicklist 的内存和性能特性。 fill 表示每个 quicklistNode 节点的最大容量不同的数值有不同的含义默认是 -2当然也可以配置为其他数值具体数值含义如下 fill含义-1每个 quicklistNode 节点的 ziplist 所占字节数不能超过 4kb。-2每个 quicklistNode 节点的 ziplist 所占字节数不能超过 8kb。 默认配置建议配置-3每个 quicklistNode 节点的 ziplist 所占字节数不能超过 16kb。-4每个 quicklistNode 节点的 ziplist 所占字节数不能超过 32kb。-5每个 quicklistNode 节点的 ziplist 所占字节数不能超过 64kb。任意正数表示ziplist 结构所最多包含的 entry 个数最大为 215215。 compress 表示 quicklist 的压缩深度0 表示所有节点都不压缩否则就表示从两端开始有多少个节点不压缩。例如compress 为 1 表示从两端开始有 1 个节点不做 LZF 压缩。LZF 是种无损压缩算法。Redis 为了节省内存空间会将 quicklist 的节点用 LZF 压缩后存储但这里不是全部压缩可以配置 compress 的值。 quicklist常用操作 创建 quicklist *quicklistCreate(void); // 创建quicklist quicklist *quicklistNew(int fill, int compress); // 用一些指定参数创建一个新的quicklist void quicklistSetCompressDepth(quicklist *quicklist, int depth); // 设置压缩深度头插和尾插 void quicklistPushHead(quicklist *quicklist, void *value, size_t sz); // 头插 void quicklistPushTail(quicklist *quicklist, void *value, size_t sz); // 尾插头删和尾删 int quicklistPop(quicklist *quicklist, int where, unsigned char **data, size_t *sz, long long *slong); // 头删或尾删查找 ​ 查找操作需要遍历整个 quicklist对每个 ziplist 进行查找。如果找到了匹配的元素就返回一个 quicklistEntry 结构体表示该元素在哪个 ziplist 中以及在 ziplist 中的位置。 typedef struct quicklistEntry {const quicklist *quicklist; //指向所属的quicklist的指针quicklistNode *node; //指向所属的quicklistNode节点的指针unsigned char *zi; //指向当前ziplist结构的指针unsigned char *value; //查找到的元素如果是字符串则存在value字段long long longval; //查找到的元素如果是整数则存在longval字段 size_t sz; //保存当前元素的长度int offset; //保存查找到的元素距离压缩列表头部/尾部隔了多少个节点 } quicklistEntry;int quicklistIndex(const quicklist *quicklist, const long long idx, quicklistEntry *entry); // 根据索引查找元素 void quicklistRewind(const quicklist *quicklist, quicklistIter **iter); // 创建一个从头开始的迭代器 void quicklistRewindTail(const quicklist *quicklist, quicklistIter **iter); // 创建一个从尾开始的迭代器 int quicklistNext(quicklistIter *iter, quicklistEntry *node); // 迭代器获取下一个元素 void quicklistReleaseIterator(quicklistIter *iter); // 释放迭代器删除 ​ 删除操作需要先找到要删除的元素在哪个 ziplist 中然后调用 ziplist 的删除函数删除该元素。如果删除后导致 ziplist 空了就把整 个 ziplist 节点从链表中删除 void quicklistDelEntry(quicklistIter *iter, quicklistEntry *entry); // 删除迭代器指向的元素 int quicklistDelRange(quicklist *quicklist, const long start, const long stop); // 删除指定范围内的元素其他操作 除了上面介绍的操作quicklist 还有一些其它的操作例如 quicklistRotate(quicklist *quicklist); // 将尾部的元素移动到头部 quicklistDup(quicklist *orig); // 复制一个 quicklist quicklistRelease(quicklist *quicklist); // 释放一个 quicklist quicklistCompare(unsigned char *p1, unsigned char *p2, int p2_len); // 比较两个元素是否相等quicklist 相对于普通链表优点 节省内存空间因为每个节点是一个压缩列表可以存储多个元素并且可以根据配置进行 LZF 压缩。降低更新复杂度因为每次插入或删除元素时只需要更新对应的压缩列表而不需要重新分配整个链表的内存空间。提高查询效率因为每个节点有一个计数器可以快速定位到目标元素所在的压缩列表而不需要遍历整个链表。 quick应用场景 quicklist 的应用场景主要是在需要使用 list 类型的数据结构时例如 存储有序的数据如时间线、消息队列、日志等。实现栈或队列的功能如 LIFO 或 FIFO 的数据结构。实现发布订阅模式如使用 BLPOP 或 BRPOP 命令阻塞地弹出元素。实现阻塞队列如使用 LPUSH 和 RPOP 命令实现生产者消费者模式 在redis 中使用quicklist 在 Redis 中使用 quicklist 的方法很简单只需要使用 list 类型的命令 如 lpush, rpush, lpop, rpop 等就可以自动创建和操作 quicklist。 Redis 会根据配置文件中的参数如 list-max-ziplist-size, list-compress-depth 等来决定 quicklist 的结构和压缩策略。 你不需要关心 quicklist 的内部实现细节只需要按照 list 的语义来使用即可。
http://www.dnsts.com.cn/news/130608.html

相关文章:

  • 山东住房和建设厅网站首页网站中文域名怎么做
  • qq教程网站源码wordpress 优化 插件
  • 加快信用网站建设虚拟主机怎么弄网站
  • 免费文档模板网站网站方案策划书18000字
  • 盐都建设局网站怎么验证网站
  • 深圳住房和城乡建设部网站中国核工业第五建设有限公司海南
  • 做网站过程冷色网站
  • 检察机关门户网站建设自查报告企业介绍网页制作
  • 松江区做网站的公司网站快速建设
  • 数据管理系统网站模板网址访问
  • 网站建设淘宝客模板下载线上代运营公司
  • 甘肃做网站的公司有哪些常州网约车哪个平台最好
  • 投资 公司 网站模板做网站如何引流
  • 购物02网站google doc wordpress
  • 简述网站建设的标准创意网站设计团队
  • 建设个电商平台网站需要多少钱招商网站建设解决方案
  • 如何用wordpress建站做医学期刊杂志网站
  • 网站建设哪家学校好黄石网站制作
  • 网站关键词如何布局宣传彩页设计制作
  • 高性能网站建设进阶项目推广方式有哪些
  • 商河网站建设某大学网络设计方案
  • 怎样制定一个网站建设方案室内设计培训学费多少
  • 网站改版 html做网站设计的网站
  • 阿里巴巴公司网站建设众筹网站怎么做推广方案
  • 免费建网站平台教做自己的网站难不难
  • 青岛做网站的信息技术公司wordpress创建登录页面模板
  • 网站设计的基本步骤推广文案范例
  • 网站的后台管理找施工员在哪个网站上找
  • 网站建设怎么找客户资源贵州贵州省住房和城乡建设厅网站
  • 大区直播间网站开发制作网络规划设计师视频网盘