【转】Key/Value之王Memcached初探:一、掀起Memcached的盖头来
一、Memcached是何方神圣?
在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的HttpRuntime.Cache虽然已经可以实现对页面局部进行缓存,但还是不够灵活,此时Memcached或许是你想要的。
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。经过多年的发展,目前已经有很多知名的互联网应用使用到了Memcached,比如:Wikipedia、Flickr、Youtube、Wordpress等等。
二、为什么要使用Memcached?
上图展示了Memcached的一般性用途:分布式缓存。当浏览器首次请求访问数据时,应用服务器会先从数据库服务器中取得返回给用户,并将其以Key/Value键值对的形式存入Memcached服务器中。当用户第二次访问上次请求的数据时,应用服务器通过在Memcached服务器中查找是否有缓存,如果有则直接从Memcached中读取。由于Memcached服务器是部署在网站机房内网中的,而且数据时存储在服务器的内存空间中的,所以访问速度比数据库的磁盘IO要快一些,也就提高了服务响应速度,并且在高峰时间减轻了数据库服务器的负载压力。
(1)Memcached作为高速运行的分布式缓存服务器,具有以下的特点:
- 协议简单:使用简单的基于文本行的协议,没有使用复杂的XML协议。因此,通过telnet也能在memcached上保存数据、取得数据;
- 基于libevent的事件处理:memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能;
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。
libevent: http://www.monkey.org/~provos/libevent/
- 内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中;
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
NoSQL中比较优秀的一款产品:Redis,比较好地解决了数据持久化的这个问题,重启Redis不会导致数据丢失。
- 不互相通信的分布式:尽管是“分布式”缓存服务器,但服务器端并没有分布式功能,这完全取决于客户端的实现。我们会很惊奇的发现memcached的集群非常easy,简单得甚至只需要在客户端的配置文件中添加服务器IP与端口号;换句话说,我们的应用程序只需要将数据请求给memcached客户端,在memcached客户端中会通过一个分布式算法(一致性Hash算法)从memcached服务器列表中计算一个memcached服务器的地址(如果是读请求,则根据Key在分布式算法中得到缓存有该Key的memcached服务器信息),然后客户端将数据(Key/Value对)传递给计算出来的memcached服务器(如果是读请求,则从计算出来的memcached服务器中读取含有指定Key的数据);
PS:正因为memcached缓存服务器之间互不通信,因而集群规模可以轻易地扩容,具有良好的伸缩性。
(2)Memcached与Redis的对比
①没有必要过多的关心性能,因为二者的性能都已经足够高了。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。(比如瓶颈可能会在网卡)
②如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
③如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
因此,我们可以得出一个结论:在简单的Key/Value应用场景(例如缓存),Memcached拥有更高的读写性能;而在数据持久化和数据同步场景,Redis拥有更加强大的功能和更为丰富的数据类型;
三、Memcached的安装与简单操作
Memcached的安装比较简单,而且支持多平台,包括:最经典的Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X以及我们最熟悉的Windows。这里我们使用我们日常最熟悉的Windows平台来安装Memcached服务,并进行简单的配置和操作。
(1)下载Memcached For Windows
URL:http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip
其对应的源码地址:http://code.jellycan.com/files/memcached-1.2.6-win32-src.zip
(2)在虚拟机中安装Windows Server 2003 Enterprise Edition(非必要步凑,也可以在本机进行),取名为:MemcachedServer。另外,还要给虚拟机中的Windows Server设置好IP地址,确保宿主机和虚拟机能够互相ping通。
(3)将下载的Memcached包拷贝到Windows中的一个指定文件夹中,例如我的Windows Server中的C:/MemcachedServer/
(4)①在Windows中安装Memcached服务:memcached.exe -d install(那么,对应卸载命令为:memcached.exe -d uninstall)
②安装完成后即可在Windows服务列表中查看到Memcached Server的服务,一般来说我们要将其设为开机启动项:在属性中设置启动类型为自动即可
③安装好服务之后,就可以启动Memcached服务了,这里有两种方式来启动:一是直接在Windows服务列表里选中Memcached服务点击启动;二是在命令行中输入:memcached -d start(对应的停止服务命令为:memcached -d stop)
(5)检测Memcached服务是否成功启动:
①使用telnet命令连接到登录台:telnet 服务器IP地址 11211(11211是默认的Memcached服务端口号),我这里输入:telnet 192.168.80.10 11211(192.168.80.10是我的Windows Server虚拟机的IP地址)
②打印当前Memcache服务器状态:stats
可以看到,通过stats命令列出了一系列的Memcached服务状态信息,那么这些信息又代表什么意思呢?我们可以通过下图来知道:
(6)初步学习Memcached的数据读写命令操作:
①添加或更改命令:set KeyName 额外信息 存活时间 存储字节数 [回车] 具体存储的数据块
这里额外信息为0,代表无;存活时间为0,代表永久;而具体的数据块也就是我们所说的Key/Value中的Value;
PS:这里也可以使用add KeyName 额外信息 存活时间 存储字节数 [回车] 具体存储的数据块。不过set显然更为强大,它会判断keyname是否存在,不存在则新增,存在则修改;
②读取命令:get KeyName,这里我们刚刚添加了一个key1的数据,所以我们使用:get key1便获取了key1这个key的缓存数据信息;
③更新命令:replace KeyName 额外信息 存活时间 存储字节数 [回车] 具体存储的数据块
④删除命令:delete KeyName
四、学习小结
本篇我们初步了解了什么是Memcached,下载并安装了Memcached,并且将其设为Windows自启动服务,通过telnet连接到Memcached登录台使用命令进行数据读写操作。总体来说,Memcached是一个高性能的Key/Value缓存系统,通过构建Memcached集群,能够适应大型网站的分布式缓存服务需要。下一篇,我们将在.Net中连接并操作Memcached,最后以一个综合案例来体现Memcached作为分布式缓存的重要作用。
最后,如果亲觉得我的文章不错或者对你有用,麻烦帮我点个“推荐”,让我更有动力继续写下去,谢谢!
参考文献
(1)传智播客马伦,《Memcached公开课》,http://bbs.itcast.cn/thread-14836-1-1.html
(2)charlee,《Memcached完全剖析》,http://kb.cnblogs.com/page/42731/
(3)张钊,《Memcached介绍》,http://blog.csdn.net/zz198808/article/details/8032571
(4)toxic,《memcached》,http://www.cnblogs.com/lost-1987/articles/3069460.html
转自:http://www.cnblogs.com/edisonchou/p/3855517.html
【转】Key/Value之王Memcached初探:一、掀起Memcached的盖头来的更多相关文章
- Key/Value之王Memcached初探:一、掀起Memcached的盖头来
一.Memcached是何方神圣? 在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的HttpRuntim ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- 【转】 Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作 - Edison Chou
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Memcached初探
一.Memcached是什么 Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached基于 ...
- [转载]memcached完全剖析--1. memcached的基础
转载自:http://charlee.li/memcached-001.html 翻译一篇技术评论社的文章,是讲memcached的连载.fcicq同学说这个东西很有用,希望大家喜欢. 发表日:200 ...
- Memcached通用类(基于Memcached Client Library)
分享下自己编写的Memcached通用类.欢迎大家帮忙指点下哈~ 使用的是.NET memcached client library 客户端+Memcached Providers using Sys ...
- memcached完全剖析–1. memcached的基础
系列文章导航: memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删 ...
- memcached全面剖析–4. memcached的分布式算法
memcached的分布式 正如第1次中介绍的那样, memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能. 服务器端仅包括 第2次. 第3次 前坂介绍的内存存储功能,其实现 ...
随机推荐
- objective-c(代码块)
objective-c代码块(block)对写惯C语言的人非常熟悉,就类似一个函数指针,指向一个代码段的首地址: 给出简单例子如下: int main(int argc, const char * a ...
- js模版引擎handlebars.js实用教程——each-循环中使用this
返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 在js中对时间类型格式化字符串
Date.prototype.toString = function (format) { if (format == null) { format = "yyyy-MM-dd HH:mm: ...
- Azure China (4) 管理Azure China Storage Account
<Windows Azure Platform 系列文章目录> Update 2015-05-10 强烈建议使用AzCopy工具,AzCopy命令行工具,是经过优化的.高性能Azure S ...
- Java线程:创建与启动
Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 R ...
- Atititi.名字 姓名 name 起名naming spec 的构成结构规范v2 qc2.docx
Atititi.名字 姓名 name 起名naming spec 的构成结构规范v2 qc2.docx 1.1. 职业名 官职等 amir 阿米尔 放前面1 1.2. 本名1 1.3. 父名,祖名,一 ...
- Atitit 迭代法 “二分法”和“牛顿迭代法 attilax总结
Atitit 迭代法 "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1. ...
- Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
Atitit 图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...