Memcached 工作原理

http://hzp.iteye.com/blog/1872664

Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。

Memcached有两个核心组件组成:服务端(ms)和客户端(mc),在一个memcached的查询中,mc先通过计算key的hash值来 确定kv对所处在的ms位置。当ms确定后,客户端就会发送一个查询请求给对应的ms,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以 memcached交互带给网络的影响是最小化的。

举例说明:考虑以下这个场景,有三个mc分别是X,Y,Z,还有三个ms分别是A,B,C:

设置kv对
X想设置key=”foo”,value=”seattle”
X拿到ms列表,并对key做hash转化,根据hash值确定kv对所存的ms位置
B被选中了
X连接上B,B收到请求,把(key=”foo”,value=”seattle”)存了起来

获取kv对
Z想得到key=”foo”的value
Z用相同的hash算法算出hash值,并确定key=”foo”的值存在B上
Z连接上B,并从B那边得到value=”seattle”
其他任何从X,Y,Z的想得到key=”foo”的值的请求都会发向B

 

 

Memcached服务器(ms)

内存分配

默认情况下,ms是用一个内置的叫“块分配器”的组件来分配内存的。舍弃c++标准的malloc/free的内存分配,而采用块分配器的主要目的 是为了避免内存碎片,否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的)。用了块分配器,ms会轮流的对内存进行大块的分配,并 不断重用。当然由于块的大小各不相同,当数据大小和块大小不太相符的情况下,还是有可能导致内存的浪费。

同时,ms对key和data都有相应的限制,key的长度不能超过250字节,data也不能超过块大小的限制 --- 1MB。
因为 mc所使用的hash算法,并不会考虑到每个ms的内存大小。理论上mc会分配概率上等量的kv对给每个ms,这样如果每个ms的内存都不太一样,那可能 会导致内存使用率的降低。所以一种替代的解决方案是,根据每个ms的内存大小,找出他们的最大公约数,然后在每个ms上开n个容量=最大公约数的 instance,这样就等于拥有了多个容量大小一样的子ms,从而提供整体的内存使用率。

缓存策略

当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用),以及每个kv对的有效时限。Kv对存储有效时限是在mc端由app设置并作为参数传给ms的。

同时ms采用是偷懒替代法,ms不会开额外的进程来实时监测过时的kv对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。

 

Memcached客户端(mc)

Memcached客户端有各种语言的版本供大家使用,包括java,c,php,.net等等。
大家可以根据自己项目的需要,选择合适的客户端来集成。

 

缓存式的Web应用程序架构
有了缓存的支持,我们可以在传统的app层和db层之间加入cache层, 每个app服务器都可以绑定一个mc,每次数据的读取都可以从ms中取得,如果没有,再从db层读取。而当数据要进行更新时,除了要发送update的 sql给db层,同时也要将更新的数据发给mc,让mc去更新ms中的数据。

假设今后我们的数据库可以和ms进行通讯了,那可以将更新的任务统一交给db层,每次数据库更新数据的同时会自动去更新ms中的数据,这样就可以进一步减少app层的逻辑复杂度。如下图:

不过每次我们如果没有从cache读到数据,都不得不麻烦数据库。为了最小化数据库的负载压力,我们可以部署数据库复写,用slave数据库来完成读取操作,而master数据库永远只负责三件事:1.更新数据;2.同步slave数据库;3.更新cache。如下图:

以上这些缓存式web架构在实际应用中被证明是能有效并能极大地降低数据库的负载同时又能提高web的运行性能。当然这些架构还可以根据具体的应用环境进行变种,以达到不同硬件条件下性能的最优化。

 

参考
[1]. Memcached website: http://danga.com/memcached/
[2]. Memcached API Page: http://danga.com/memcached/apis.bml
[3]. memcached_engine: http://tangent.org/506/memcache_engine.html


转载于:https://www.cnblogs.com/bluejoe/p/5115843.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11系列学习之七---------初始化列表

一、前言C的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同。反正在学习C过程中已经被折磨惯了,今天再来看看重温下那…

c# streamReader转XmlDocument读取节点

http获得web(url)请求,先是获得数据流streamreader,之后将String数据流转换为xmldocument,之后xmlnode读取节点。 // get the responseWebResponse webResponse webRequest.GetResponse();if (webResponse null){ re…

ad中电容用什么封装_用什么来降低噪声?只要几个电容器就可以,简单有效!...

使用电容器降低噪声噪声分很多种,性质也是多种多样的。所以,噪声对策(即降低噪声的方法)也多种多样。在这里主要谈开关电源相关的噪声,因此,请理解为DC电压中电压电平较低、频率较高的噪声。另外,除电容外,…

C#委托的介绍(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Delegate至少0个参数,至多32个参数,可以无返回值&#xff0…

版本1.8.1Go安装以及语法高亮配置

注意点:普通用户和root用户高亮要设置两遍①下载go安装包 https://golang.org/doc/ 最新的版本:go1.8.1.linux-amd64.tar.gz ②进入主目录:$:su ~赋给普通用户root权限,以便执行tar命令:$:su root 把压缩包解压到/usr/…

求二叉树中节点的最大距离

struct node{ Node Left; Node Right; int MaxLeft;//左子树到该节点的最长距离 int MaxRight;//右子树到该节点的最长距离 char chValue; }; void FindMaxLen(Node T) { int tmpMax 0; if (NULL T) { return; } if (NULL T->Left) { T->MaxLeft 0; } if (NULL T-&g…

flutter 自定义键盘_入门级机械键盘选购对比

个人觉得键盘这种东西,手感是最重要的,毕竟键盘是要拿用的,不是拿来供的。不管键盘再怎么好看、酷炫,只要你用起来不舒服、不习惯,那对你而言,就不会是一把好键盘。那么,影响手感的因素主要有哪…

腾讯2016校招试题----------格雷码的实现

问题:产生n位元的所有格雷码。格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。…

关于A/D方面的小结

(转载)AD精度与分辨率 最近做了一块板子,当然考虑到元器件的选型了,由于指标中要求精度比较高,所以对于AD的选型很慎重。 很多人对于精度和分辨率的概念不清楚,这里我做一下总结,希望大家不要…

常用表的字段

F:\study\表的设计 一:网站设置有哪些内容: 1>title 表题 2>logo 3>keyword 关键字 4>status 是否开启 5>Internet 备案号 6>url 网址 7>tel 联系电话 8>brief …

四个好看的CSS样式表格

1. 单像素边框CSS表格 这是一个非经常常使用的表格样式。 源码&#xff1a; <!-- CSS goes in the document HEAD or added to your external stylesheet --> <style type"text/css"> table.gridtable { font-family: verdana,arial,sans-serif; font-si…

C# COM ArcgisEngine 多线程相关

这段时间做ArcgisEngine&#xff0c;因为在做图形交叉分析时&#xff0c;计算数据分多个线程分别计算不同的图形&#xff0c;发现计算错误。后来初步了接了是由于所有的ArcObjects组件都被标记为单线程单元&#xff08;STA参考VS帮助文档&#xff09;。每个STA都限制在一个线程…

loading initial ramdisk 卡住_驿站晨读 | 一城市多家快递“卡住了”!有快递网点直接建议:换别家吧......

编辑&#xff1a;驿站老鬼 主播&#xff1a;若晨‍▎美团回应“外卖小哥致电取餐被打成颅脑损伤”10月15日晚&#xff0c;成都温江区某小区内发生一起顾客殴打外卖员事件&#xff0c;导致外卖员冯某东轻度颅脑损伤以及右膝外侧半月板撕裂。据了解&#xff0c;事件起因是顾客要…

CVTE2016校招试题摘选

今年的题分两部分&#xff0c;时间为晚上7:00-9:30,题目分不定项选择与两道编程题。 下面是我自己抄下来的一部分题&#xff0c;尽飨读者。 1.堆排序属于下面哪种排序方法&#xff1f; A、选择排序 B、插入排序、C、交换排序 D、归并排序 答案&#xff1a; A 2. 用RSA算法…

高手的经验 硬件

一个硬件高手的设计经验分享(ZT)大字体 楼主 一&#xff1a;成本节约现象一&#xff1a;这些拉高/拉低的电阻用多大的阻值关系不大&#xff0c;就选个整数5K吧点评&#xff1a;市场上不存在5K的阻值&#xff0c;最接近的是 4.99K&#xff08;精度1%&#xff09;&#xff0c;其…

JavaScript大神用代码带你揭秘吉普赛古老神秘读心术

javascript/HTML5课题&#xff1a;javascript开发读心术游戏PS:大爆料&#xff01;javascript解密读心术游戏背后故事知识点&#xff1a;读心术原理算法独家揭秘&#xff0c;HTML5最新选择器&#xff0c;原生javascript动态DOM生成&#xff0c;判断与循环讲解&#xff0c;函数封…

Firefox火狐Flash插件卡死问题完美解决方法(转载)

http://www.ihacksoft.com/firefox-flash-protectedmode.html 其实这个问题以前就出现过&#xff0c;而最近该问题又出现在最新的 Windows 8.1 系统中。由于从Flash Player 11.3开始&#xff0c;新版本引入了安全沙箱技术&#xff0c;而它一直就是火狐无法正常运行的主要原因。…

.NET Framework 4.5 五个很棒的特性

转自http://news.cnblogs.com/n/192958/ 英文原文&#xff1a;Five Great .NET Framework 4.5 Features 简介 自 .NET 4.5 发布已经过了差不多 1 年了。但是随着最近微软大多数的发布&#xff0c;与 .NET 开发者交流的问题显示&#xff0c;开发者仅知道一到两个特性&#xff0c…

group by很多字段是不是会很慢_女生回复我总很慢,怎么办?

原标题&#xff1a;女生回复我总很慢&#xff0c;怎么办&#xff1f;Hello&#xff0c;大家好&#xff0c;我是情圣老司机。有一种问题&#xff0c;可能属于年轻人才会遇到的问题年轻的兄弟总想控制一切&#xff0c;一切都掌控在自己手上包括今天这个主题&#xff1a;女生总是回…

大众点评网2016校招试题选录

大众点评网的校招题还真有特点&#xff0c;分四部分&#xff0c;第一部分是行测的数字规律类题目&#xff0c;第二部分是行测的图形规律题&#xff0c;第三部分是C、Java的基础选择题&#xff0c;第四部分是四个编程题。 题目都有时间限制&#xff0c;第一二部分皆是普通的行测…