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

来源:互联网 发布:比较骚的网络女主播 编辑:程序博客网 时间:2024/06/01 07:29

一、Memcached是何方神圣?

Memcached

数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的HttpRuntime.Cache虽然已经可以实现对页面局部进行缓存,但还是不够灵活,此时Memcached或许是你想要的。

Memcached 是一个 高性能的分布式内存对象缓存系统 ,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。经过多年的发展,目前已经有很多知名的互联网应用使用到了Memcached,比如:Wikipedia、Flickr、Youtube、Wordpress等等。

二、为什么要使用Memcached?

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客户端中会通过一个分布式算法从memcached服务器列表中计算一个memcached服务器的地址(如果是读请求,则根据Key在分布式算法中得到缓存有该Key的memcached服务器信息);

memcachedcluster

(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、FressBSD、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

0 0