Redis为何这么快——数据存储角度
杜绝缓冲区溢出:行使C字符串的操纵时,假如字符串长度增进(如strcat操纵)而健忘从头分派内存,很轻易造成缓冲区的溢出;而SDS因为记录了长度,响应的操纵在也许造成缓冲区溢出时会自动从头分派内存,杜绝了缓冲区溢出。 四、List List工具的底层实现是quicklist(快速列表,是ziplist 压缩列表 和linkedlist 双端链表 的组合)。Redis中的列表支持两头插入和弹出,并可以得到指定位置(或范畴)的元素,可以充当数组、行列、栈等。
4.1 linkedlist(双端链表) 此布局较量像Java的LinkedList,有乐趣可以阅读一下源码。 从图中可以看出Redis的linkedlist双端链表有以下特征:节点带有prev、next指针、head指针和tail指针,获取前置节点、后置节点、表头节点和表尾节点的伟大度都是O(1)。len属性获取节点数目也为O(1)。 与双端链表对比,压缩列表可以节减内存空间,可是举办修改或增删操纵时,伟大度较高;因此当节点数目较少时,可以行使压缩列表;可是节点数目多时,照旧行使双端链表划算。 4.2 ziplist(压缩列表) 当一个列表键只包括少量列表项,且是小整数值或长度较量短的字符串时,那么redis就行使ziplist(压缩列表)来做列表键的底层实现。 ziplist是Redis为了节省内存而开拓的,是由一系列非凡编码的持续内存块(而不是像双端链表一样每个节点是指针)构成的次序型数据布局;详细布局相比拟力伟大,有乐趣读者可以看 Redis 哈希布局内存模子分解。在新版本中list链表行使 quicklist 取代了 ziplist和 linkedlist: quickList 是 zipList 和 linkedList 的殽杂体。它将 linkedList 按段切分,每一段行使 zipList 来紧凑存储,多个 zipList 之间行使双向指针串接起来。由于链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 体系的指针是 8 个字节),其它每个节点的内存都是单独分派,会加剧内存的碎片化,影响内存打点服从。 quicklist 默认的压缩深度是 0,也就是不压缩。为了支持快速的 push/pop 操纵,quicklist 的首尾两个 ziplist 不压缩,此时深度就是 1。为了进一步节省空间,Redis 还会对 ziplist 举办压缩存储,行使 LZF 算法压缩。 五、Hash Hash工具的底层实现可所以ziplist(压缩列表)可能hashtable(字典可能也叫哈希表)。 Hash工具只有同时满意下面两个前提时,才会行使ziplist(压缩列表):1.哈希中元素数目小于512个;2.哈希中全部键值对的键和值字符串长度都小于64字节。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |