常州网站制作包括哪些网站开发工程师简历
news/
2025/9/23 18:05:11/
文章来源:
常州网站制作包括哪些,网站开发工程师简历,开发建设网站需要什么人才,淄博网站推广公司那些我们在进行 Mc 架构剖析时#xff0c;除了学习 Mc 的系统架构、网络模型、状态机外#xff0c;还对 Mc 的 slab 分配、Hashtable、LRU 有了简单的了解。本节课#xff0c;将进一步深入学习这些知识点。
接下来#xff0c;进入 Memcached 进阶的学习。会讲解 Mc 是如何进行…我们在进行 Mc 架构剖析时除了学习 Mc 的系统架构、网络模型、状态机外还对 Mc 的 slab 分配、Hashtable、LRU 有了简单的了解。本节课将进一步深入学习这些知识点。
接下来进入 Memcached 进阶的学习。会讲解 Mc 是如何进行 key 定位如何淘汰回收过期失效 key 的还将分析 Mc 的内存管理 slab 机制以及 Mc 进行数据存储维护的关键机理最后还会对 Mc 进行完整的协议分析并以 Java 语言为例介绍 Mc 常用的 client以及如何进行调优及改进。
key 定位
哈希表
Mc 将数据存储在 Item 中然后这些 Item 会被 slabclass 的 4 个 LRU 管理。这些 LRU 都是通过双向链表实现数据记录的。双向链表在进行增加、删除、修改位置时都非常高效但其获取定位 key 的性能非常低下只能通过链表遍历来实现。因此Mc 还通过 Hashtable也就是哈希表来记录管理这些 Item通过对 key 进行哈希计算从而快速定位和读取这些 key/value 所在的 Item如下图所示。 哈希表也称散列表可以通过把 key 映射到哈希表中的一个位置来快速访问记录定位 key 的时间复杂度只有 O(1)。Mc 的哈希表实际是一个一维指针数组数组的每个位置称作一个 bucket即一个桶。性能考虑的需要Mc 的哈希表的长度设置为 2 的 N 次方。Mc 启动时默认会构建一个拥有 6.4万 个桶的哈希表随着新 key 的不断插入哈希表中的元素超过阀值后会对哈希表进行扩容最大可以构建 2 的 32 次方个桶的哈希表也就是说 Mc 哈希表经过多次扩容后最多只能有不超过 43亿 个桶。
哈希表设计
对于哈希表设计有 2 个关键点一个是哈希算法一个是哈希冲突解决方案。Mc 使用的哈希算法有 2 种分别是 Murmur3 Hash 和 Jenkins Hash。Mc 当前版本默认使用 Murmur3 Hash 算法。不同的 key 通过 Hash 计算被定位到了相同的桶这就是哈希冲突。Mc 是通过对每个桶启用一个单向链表来解决哈希冲突问题的。
定位 key
Memcached 定位 key 时首先根据 key 采用 Murmur3 或者 Jenkins 算法进行哈希计算得到一个 32 位的无符号整型输出存储到变量 hv 中。因为哈希表一般没有 2^32 那么大所以需要将 key 的哈希值映射到哈希表的范围内。Mc 采用最简单的取模算法作为映射函数即采用 hv%hashsize 进行计算。由于普通的取模运算比较耗时所以 Mc 将哈希表的长度设置为 2 的 n 次方采用位运算进行优化即采用 hvhashmask 来计算。hashmask 即 2 的 n 次方 减 1。
定位到 key 所在的桶的位置后如果是插入一个新数据则将数据 Item 采用头部插入法插入桶的单向链表中。如果是查找则轮询对应哈希桶中的那个单向链表依次比对 key 字符串key 相同则找到数据 Item。 如果哈希表桶中元素太多这个链表轮询耗时会比较长所以在哈希表中元素达到桶数的 1.5 倍之后Mc 会对哈希表进行 2 倍扩容。由于哈希表最多只有 43 亿左右个桶所以性能考虑单个 Mc 节点最多存储 65亿 个 key/value。如果要存更多 key则需要修改 Mc 源码将最大哈希即 HASHPOWER_MAX 进行调大设置。
哈希表扩容
当 Mc 的哈希表中Item 数量大于 1.5 倍的哈希桶数量后Mc 就对哈希表进行扩容处理。如下图所示Mc 的哈希扩容是通过哈希维护线程进行处理的。准备开始扩容时哈希维护线程会首先将所有 IO 工作线程和辅助线程进行暂停其中辅助线程包括 LRU 维护线程、slab 维护线程、LRU 爬虫线程。待这些线程暂停后哈希维护线程会将当前的主哈希表设为旧哈希表然后将新的主哈希表扩容之前的 2 倍容量。然后工作线程及辅助线程继续工作同时哈希维护线程开始逐步将 Item 元素从旧哈希表迁移到主哈希表。 Mc 在启动时会根据设置的工作线程数来构建 一个 Item 锁哈希表线程越多构建的锁哈希表越大对于 4 个线程锁哈希表有 4096 个桶对于 10 个线程锁哈希表会有 8192 个桶Item 锁哈希表最多有 32k 个桶1k 是 1024即最多即 32768 个桶。Mc 的锁哈希表中每个桶对应一个 Item 锁所以 Mc 最多只有 32768 个 Item 锁。
Mc 哈希表在读取、变更以及扩容迁移过程中先将 key hash 定位到 Item 锁哈希表的锁桶然后对 Item 锁进行加锁然后再进行实际操作。实际上除了在哈希表在其他任何时候只要涉及到在对 Item 的操作都会根据 Item 中的 key进行 Item 哈希锁桶加锁以避免 Item 被同时读写而产生脏数据。Mc 默认有 4096 个锁桶所以对 key 加锁时冲突的概率较小而且 Mc 全部是内存操作操作速度很快即便申请时锁被占用也会很快被释放。
Mc 哈希表在扩容时哈希表维护线程每次按 桶链表纬度 迁移即一次迁移一个桶里单向链表的所有 Item 元素。在扩容过程中如果要查找或插入 key会参照迁移位置选择哈希表。如果 key 对应的哈希桶在迁移位置之前则到新的主哈希表进行查询或插入否则到旧哈希表进行查询和插入。待全部扩容迁移完毕所有的处理就会全部在新的主哈希表进行。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913411.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!