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,一经查实,立即删除!

相关文章

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/…

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

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

四个好看的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…

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

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

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

javascript/HTML5课题&#xff1a;javascript开发读心术游戏PS:大爆料&#xff01;javascript解密读心术游戏背后故事知识点&#xff1a;读心术原理算法独家揭秘&#xff0c;HTML5最新选择器&#xff0c;原生javascript动态DOM生成&#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;女生总是回…

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

裸的线段树...因为数组开小了而一直RE..浪费了好多时间..--------------------------------------------------------------------------#include<cstdio>#include<algorithm>#include<cstring>#include<cctype>#include<iostream>#define rep(i…

如何利用循环代替递归以防止栈溢出(译)

摘要&#xff1a;我们经常会用到递归函数&#xff0c;但是如果递归深度太大时&#xff0c;往往导致栈溢出。而递归深度往往不太容易把握&#xff0c;所以比较安全一点的做法就是&#xff1a;用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程&#xff0c;相当精彩…

python环境搭建_Python开发环境搭建安装开发软件

0.学习路径示意图各位小伙伴大家好&#xff0c;这次楼主分享的是Ubuntu上安装开发软件。包含以下这几个软件&#xff1a;PycharmAnaconda3GitVim远程登录软件RangerPS&#xff1a;因为以下安装包都是以root身份安装的因此&#xff0c;要使用它们必须以root身份登录su # 以root…

2023首届溪口冬笋节开幕 掀起溪口竹笋产业新浪潮

今年冬至&#xff0c;龙游县溪口镇迎来阵势浩大的“新气象”。 2023年12月22日&#xff0c;由龙游县溪口镇人民政府主办&#xff0c;“美好冬至 竹梦未来”首届溪口冬笋节于溪口老街正式开幕&#xff0c;展开为期一周的竹笋产业文化、经济活动宣传&#xff0c;龙游县领导、及社…

android 蓝牙通讯编程 备忘

1.启动App后: 判断->蓝牙是否打开&#xff08;所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统)&#xff0c;根据Activity返回进场操作 打开成功,启动代码中的蓝牙通讯Service 用户点back或失败 退出App 2.蓝牙…

java 程序执行后 强制gc_GC 设计与停顿

(给ImportNew加星标&#xff0c;提高Java技能)编译&#xff1a;唐尤华链接&#xff1a;shipilev.net/jvm/anatomy-quarks/3-gc-design-and-pauses/1. 写在前面“[JVM 解剖公园][1]”是一个持续更新的系列迷你博客&#xff0c;阅读每篇文章一般需要5到10分钟。限于篇幅&#xff…

【ASP.NET Web API2】初识Web API

Web Api 是什么&#xff1f; MSDN&#xff1a;ASP.NET Web API 是一种框架&#xff0c;用于轻松构建可以访问多种客户端&#xff08;包括浏览器和移动设备&#xff09;的 HTTP 服务 百度百科&#xff1a;Web API是网络应用程序接口。 个人理解&#xff1a;Web API 是提供给多种…

三星s8怎么分屏操作_三星手机该怎么玩?了解完这几点用机技巧,可以轻车熟路了!...

其实对于三星这个手机品牌&#xff0c;我还是很佩服的。虽然近些年来&#xff0c;三星在国内的市场份额日渐变少&#xff0c;但是在国内的影响力依然尚存。毕竟三星手机在某些方面还是很有优势的&#xff0c;特别是旗舰系列机型深受消费者喜爱。接下来&#xff0c;笔者就跟大家…

二维数组的指针复习

最近一次的考试都是指针&#xff0c;真是给我深深上了一课&#xff0c;所以我特此复习一下指针方面的知识。二维数组的指针 int a[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 下面通过一个表来做详细的说明&#xff1a; 访问二维数组&#xff0c;有两种方法&#xff0c;一…

称重的问题

给你8颗小石头和一架托盘天平。有7颗石头的重量是一样的&#xff0c;另外一颗比其他石头略重&#xff1b;除此之外&#xff0c;这些石头完全没有分别。你不得假设那颗重头到底比其他的石头重了多少。请问&#xff1a;最少要称量几次&#xff0c;你才能把那颗较重的石头找出来&a…

TIF图像文件的读取(c++代码)

一 TIF图像介绍 TIFF是最复杂的一种位图文件格式。TIFF是基于标记的文件格式&#xff0c;它广泛地应用于对图像质量要求较高的图像的存储与转换。由于它的结构灵活和包容性大&#xff0c;它已成为图像文件格式的一种标准&#xff0c;绝大多数图像系统都支持这种格式。 TIFF 是一…