数据库专题(五) ——Memcached技术

数据库专题(五)——Memcached技术

(原创内容,转载请注明来源,谢谢)

一、Slab分配算法保存数据

Memcached默认只能用1MB的存储空间,其在分配存储采用Slab算法,把1MB的固定大小内存划分成n块,称为一个slab页,每次向系统申请一个slab,并把其分为若干小块,称为chunk,分配给用户使用。

memcache设置每个chunk的大小共有40种,第一个chunk是80B,第二个开始每个是前面一个的1.25倍。但是为了更好利用空间,当chunk大小不是8的倍数时,会采用size+8-size%8,即通过略微增加chunk的值,使其保持在8的倍数。

当用户调用memcache存储数据时,slab会自动查找当前的trunk中,空闲的trunk且最接近待存储数据大小的值。

如下图所示:(来自网络)

二、删除机制

1、延时删除

当存储在memcache的数据过期时,不会被马上删除,而是每次在调用到key进行查找时,会先判断其过期时间,如果比当前时间早,再进行删除。

这样做的好处是节省cpu使用率,不用实时的去扫描存储的所有数据来判断是否要删除。

2、LRU算法淘汰数据

每次申请数据存储在memcache,都需要malloc一个地址空间。当memcache数据满,地址空间申请失败,则会触发删除数据的代码。删除旧数据采用的是LRU算法,即删除队列中队尾数据中三小时内没有被访问的数据。(3小时是在memcache的源码中写的)

每次访问memcache的key,被访问的key会被移到队列的头部,这样就保证尾部的都是较久没有被访问的数据。

三、多线程

1、并发

memcache使用多路复用I/O模型,即非阻塞的方式进行连接,先准备好的连接先执行。避免I/O被未准备好的进程阻塞。

memcache支持多线程,开启memcache服务器时,通过-t参数指定线程数量。通常数量设定为cpu内核数量,这避免系统的线程调度,保证每个内核有一个线程。

2、进程职责

在memcache内部,线程分为主线程和工作线程。如下图所示(来自网络)

主线程(mainthread)负责接收客户端的连接,并把连接分配给工作线程进行处理。工作线程(worker thread)处理客户端的连接请求。

主线程主要负责侦听客户端的连接(通过调用accept函数),其分配连接时(通过调用dispatch_conn_new函数),采用的是轮询的方式,每次把一个连接放到某个worker的队列中。

工作线程接收到主线程的信号后,会把队列上的客户端连接注册到libevent进行侦听(因此安装memcache服务器的前置条件是安装libevent),其侦听到客户端的读写事件后,调用相关的回掉函数进行处理(调用thread_libevent_process函数)。thread_libevent_process主要是从管道读取一个字节的数据,然后从队列中取得一个连接,并调用conn_new函数把链接注册到libevent进行侦听。

四、分布式memcache方案

当一台memcache服务器不足以满足要求,则需要布置多太服务器。因此,需要确定把数据保存在哪一台服务器上。可以采用普通Hash分布或一致性Hash分布。

1、普通Hash

functionmHash($key){
$md5 = substr(md5($key), 0, 8);
$seed = 31;
$hash = 0;
for($i=0;$i<8;$i++){
$hash =$hash*$seed+ord($md5($i));
$i++;
}
return $hash*0x7FFFFFFF;
}

即通过md5把key处理成32位字符串,取前八位,再进过hash处理成整数并返回,然后映射到一台memcache服务器。当有n台服务器时,则mHash($key)%n,根据结果分配到相应的服务器。

取数据时采用同样的key,同样的mHash,则可以获取到相应的数据。

2、一致性Hash

当服务器的数量是变动的时候,采用上述普通哈希则无法解决问题。

一致性哈希如下图所示:(来自网络)

一致性哈希共4个步骤:

1)将32位整数(0~232-1)模拟成一个圆环,0是头,232-1是结尾。

2)通过普通哈希(上述的mHash)把key处理成整数,即可以在第一步骤的环中找到相应的位置。

3)把memcache群映射到环上,用mhash函数处理memcache服务器使用的ip地址,以便把服务器也映射到环上。

4)把第二步的数据映射到第三步的服务器上。方法是沿圆环顺时针方向的key出发,直到遇到映射在上面的第一个服务器为止。

一致性哈希当发生移除服务器和新增服务器时,会有以下操作:

1)移除服务器

移除服务器时,假设移除server2,其顺时针下一个服务器是server3,则只需要把映射到server2的数据,相应的映射到server3上。

2)新增服务器

新增服务器时,假设新增server3,插入到server1和server2(顺时针靠前)之间,则只需要把映射到server2的数据中,数据位置在server3逆时针位置且在server1顺时针之前的数据,保存到server3上即可。

——written by linhxx 2017.08.09

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

Jmeter常用获取数据的几种方式

还没用过聊天机器人?给我发消息试试。 Jmeter在互联网测试中应用非常多,可以用来做接口测试或者性能测试,算是非常不错的一个工具。今天我们来聊聊Jmeter获...

2138
来自专栏哲学驱动设计

Rafy 领域实体框架 - 树型实体功能(自关联表)

在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解。 场景 在开发数据库应用程序时,往往会遇到自关联表的场景。例如,分类信息...

2048
来自专栏vue学习

33、vuex初探(一)

看完以后应该是有点懵逼的,所以这就是这篇文章存在的意义了:就是让你不那么懵逼;总归理论与实践相结合才能真正弄明白一个东西,所以我们简单实践一下。

1476
来自专栏C/C++基础

Linux命令(25)——cp命令

cp命令主要用于复制文件或目录,可以将一个或多个源文件或者目录复制到指定的目的文件或目录,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现...

1132
来自专栏王小雷

Python之pandas数据加载、存储

Python之pandas数据加载、存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 ...

2397
来自专栏玄魂工作室

安全杂谈——linux通配符绕过文件名黑名单

linux shell下可以通过正则匹配来匹配相应的程序并且执行。 在linux下输入man 7 glob命令可以查看相关的内容。值得注意的就这些,学过正则的一...

902
来自专栏州的先生

Python爬虫实战入门一:工具准备

1712
来自专栏日常分享

RabbitMQ基本模式

   最近用到了一些RabbitMQ的东西,看了官方的Get Started,以此为模板总结一下。

2382
来自专栏Spark学习技巧

Mapreduce shuffle详解

Mapreduce shuffle详解 Mapreduce确保每个reducer的的输入都是按键排序的。系统执行排序的过程(即将map输出作为输入 传给redu...

3903
来自专栏电光石火

ThinkPHP导出CSV、Excel

如题,我们在实际中EXCEL的导出比导入用的多,这里给大家分享一个导出CSV EXCEL导出,简单,方便。 首先我们在Thinkphp/Library...

2678

扫码关注云+社区