一、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的盖头来的更多相关文章

  1. Key/Value之王Memcached初探:一、掀起Memcached的盖头来

    一.Memcached是何方神圣? 在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的HttpRuntim ...

  2. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  3. 【转】 Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  4. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作 - Edison Chou

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  5. Memcached初探

    一.Memcached是什么 Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. Memcached基于 ...

  6. [转载]memcached完全剖析--1. memcached的基础

    转载自:http://charlee.li/memcached-001.html 翻译一篇技术评论社的文章,是讲memcached的连载.fcicq同学说这个东西很有用,希望大家喜欢. 发表日:200 ...

  7. Memcached通用类(基于Memcached Client Library)

    分享下自己编写的Memcached通用类.欢迎大家帮忙指点下哈~ 使用的是.NET memcached client library 客户端+Memcached Providers using Sys ...

  8. memcached完全剖析–1. memcached的基础

    系列文章导航: memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删 ...

  9. memcached全面剖析–4. memcached的分布式算法

    memcached的分布式 正如第1次中介绍的那样, memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能. 服务器端仅包括 第2次. 第3次 前坂介绍的内存存储功能,其实现 ...

随机推荐

  1. C语言#自动生成四则运算的编程

    #include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  2. (转)Babel-现在开始使用 ES6

    在 2 月 20 号 ECMAScript 第六版就正式推出了,这门语言一直保持稳定快速的发展而且新功能也在慢慢被现在主流的 JavaScript 引擎所接受.不过要想在浏览器端或者 Node 端直接 ...

  3. 【译】什么导致了Context泄露:Handler&内部类

    思考下面代码 public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Hand ...

  4. 使用protractor操作页面元素

    Protractor是为Angular JS应用量身打造的端到端测试框架.它可以真实的驱动浏览器,自动完成对web应用的测试.Protractor驱动浏览器使用的是WebDriver标准,所以使用起来 ...

  5. flex 阅读器

    遇到很多的困难 首先是 pdf2swf 而后又下载swftools 而后有swfcombine.exe 让制作的swf 文字可选? —— 这应该是很常见的需求啊! 可是我搜索来搜索去都找不到... 搜 ...

  6. WebApi系列~dynamic让你的省了很多临时类

    回到目录 dynamic这个动态类型早在.net3.5时就已经出现了,当时是伴随的Linq一起让我们认识的,但在使用时总觉得有点别扭,因为它是internal的,所以不能跨程序集使用,这对于分层开发的 ...

  7. MVVM架构~knockoutjs系列之级联select

    返回目录 对于下拉列表框的绑定在之前的knockoutjs文章中已经介绍过,今天主要说一下级联的select,事实上,在knockoutjs里,是以数据绑定为中心的,而数据是以面向对象为前提的,而对于 ...

  8. _学生选课数据库SQL语句练习题

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. select Sname,Ssex,t.sclass from STUDENT t 2. 查询教师所有的单位即不重复的De ...

  9. 23.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff。 具体要求如下: (1)Person类中的属性有:姓名name(String类型),地址address(String类型), 电话号码telphone(String类型)和电子邮件地址email(String类型); (2)Employee类中的属性有:办公室office(Stri

    package banking; public class Person { private String name; public String address; public String tel ...

  10. SSIS 对数据排序

    SSIS 对数据排序有两种方式,一种是使用Sort组件,一种是使用sql command的order by clause进行排序. 一,使用Sort组件进行排序 SortType:升序 ascendi ...