`
xp9802
  • 浏览: 1205035 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

memcached——分布式内存对象缓存系统

 
阅读更多

memcached是什么?

  memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、 hatena、 Facebook、 Vox、LiveJournal等众多服务中 提高Web应用扩展性的重要因素。

  许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。

  这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。

 

图1 一般情况下memcached的用途

  其实也不是很复杂,就是用软件搭建起来的数据库缓存系统

 

memcached的特征

 memcached作为高速运行的分布式缓存服务器,具有以下的特点。
 协议简单
 基于libevent的事件处理
 内置内存存储方式
 memcached不互相通信的分布式

协议简单
  memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。下面是例子。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3     (保存命令)
bar               (数据)
STORED            (结果)
get foo           (取得命令)
VALUE foo 0 3     (数据)
bar               (数据)

  协议文档位于memcached的源代码内,也可以参考以下的URL。

http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

 

基于libevent的事件处理

  libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。 关于事件处理这里就不再详细介绍,可以参考Dan Kegel的The C10K Problem。

libevent: http://www.monkey.org/~provos/libevent/

The C10K Problem: http://www.kegel.com/c10k.html

 

内置内存存储方式

  为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。 关于内存存储的详细信息,本连载的第二讲以后前坂会进行介绍,请届时参考。

 

memcached不互相通信的分布式

  memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。本连载也将介绍memcached的分布式。

图2 memcached的分布式

接下来简单介绍一下memcached的使用方法。

 

安装memcached

memcached的安装比较简单,这里稍加说明。

memcached支持许多平台。
Linux
FreeBSD
Solaris (memcached 1.2.5以上版本)
Mac OS X
  另外也能安装在Windows上。这里使用Fedora Core 8进行说明。

 

memcached的安装

  运行memcached需要本文开头介绍的libevent库。Fedora 8中有现成的rpm包, 通过yum命令安装即可。

$ sudo yum install libevent libevent-devel

  memcached的源代码可以从memcached网站上下载。本文执笔时的最新版本为1.2.5。 Fedora 8虽然也包含了memcached的rpm,但版本比较老。因为源代码安装并不困难, 这里就不使用rpm了。

  下载memcached:http://www.danga.com/memcached/download.bml

memcached安装与一般应用程序相同,configure、make、make install就行了。

$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz
$ tar zxf memcached-1.2.5.tar.gz
$ cd memcached-1.2.5
$ ./configure
$ make
$ sudo make install
默认情况下memcached安装到/usr/local/bin下。

 

memcached的启动

从终端输入以下命令,启动memcached。

$ /usr/local/bin/memcached -p 11211 -m 64m -vv
slab class   1: chunk size     88 perslab 11915
slab class   2: chunk size    112 perslab  9362
slab class   3: chunk size    144 perslab  7281
中间省略
slab class  38: chunk size 391224 perslab     2
slab class  39: chunk size 489032 perslab     2
<23 server listening
<24 send buffer was 110592, now 268435456
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)

  这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211 最大内存使用量为64M。调试信息的内容大部分是关于存储的信息, 下次连载时具体说明。

  作为daemon后台启动时,只需

$ /usr/local/bin/memcached -p 11211 -m 64m -d

  这里使用的memcached启动选项的内容如下。

参数说明

-p使用的TCP端口。默认为11211

-m最大内存大小。默认为64M

-vv用very vrebose模式启动,调试信息和错误输出到控制台

-d作为daemon在后台启动

上面四个是常用的启动选项,其他还有很多,通过

$ /usr/local/bin/memcached -h
命令可以显示。许多选项可以改变memcached的各种行为, 推荐读一读。

 

用客户端连接

  许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。 仅仅memcached网站上列出的语言就有

Perl、PHP、Python、Ruby、C#、C/C++、Lua等等。

memcached客户端API:http://www.danga.com/memcached/apis.bml

这里介绍通过mixi正在使用的Perl库链接memcached的方法。

使用Cache::Memcached

Perl的memcached客户端有

Cache::Memcached

Cache::Memcached::Fast

Cache::Memcached::libmemcached

  等几个CPAN模块。这里介绍的Cache::Memcached是memcached的作者Brad Fitzpatric的作品, 应该算是memcached的客户端中应用最为广泛的模块了。

Cache::Memcached - search.cpan.org: http://search.cpan.org/dist/Cache-Memcached/

使用Cache::Memcached连接memcached

下面的源代码为通过Cache::Memcached连接刚才启动的memcached的例子。

#!/usr/bin/perl

use strict;

use warnings;

use Cache::Memcached;

my $key = "foo";

my $value = "bar";

my $expires = 3600; # 1 hour

my $memcached = Cache::Memcached->new({

    servers => ["127.0.0.1:11211"],

    compress_threshold => 10_000

});

$memcached->add($key, $value, $expires);

my $ret = $memcached->get($key);

print "$ret\n";

在这里,为Cache::Memcached指定了memcached服务器的IP地址和一个选项,以生成实例。 Cache::Memcached常用的选项如下所示。

选项说明

servers用数组指定memcached服务器和端口

compress_threshold数据压缩时使用的值

namespace指定添加到键的前缀

另外,Cache::Memcached通过Storable模块可以将Perl的复杂数据序列化之后再保存, 因此散列、数组、对象等都可以直接保存到memcached中。

 

保存数据

向memcached保存数据的方法有

add

replace

set

它们的使用方法都相同:

my $add = $memcached->add( '键', '值', '期限' );

my $replace = $memcached->replace( '键', '值', '期限' );

my $set = $memcached->set( '键', '值', '期限' );

向memcached保存数据时可以指定期限(秒)。不指定期限时,memcached按照LRU算法保存数据。 这三个方法的区别如下:

选项说明

add仅当存储空间中不存在键相同的数据时才保存

replace仅当存储空间中存在键相同的数据时才保存

set与add和replace不同,无论何时都保存

获取数据

获取数据可以使用get和get_multi方法。

my $val = $memcached->get('键');

my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');

  一次取得多条数据时使用get_multi。get_multi可以非同步地同时取得多个键值, 其速度要比循环调用get快数十倍。

删除数据

删除数据使用delete方法,不过它有个独特的功能。

$memcached->delete('键', '阻塞时间(秒)');

  删除第一个参数指定的键的数据。第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。 此功能可以用于防止缓存数据的不完整。但是要注意,set函数忽视该阻塞,照常保存数据

增一和减一操作

可以将memcached上特定的键值作为计数器使用。

my $ret = $memcached->incr('键');

$memcached->add('键', 0) unless defined $ret;

  增一和减一是原子操作,但未设置初始值时,不会自动赋成0。因此, 应当进行错误检查,必要时加入初始化操作。而且,服务器端也不会对 超过2 32时的行为进行检查。

 

总结

  这次简单介绍了memcached,以及它的安装方法、Perl客户端Cache::Memcached的用法。 只要知道,memcached的使用方法十分简单就足够了。

  下次由前坂来说明memcached的内部结构。了解memcached的内部构造, 就能知道如何使用memcached才能使Web应用的速度更上一层楼。 

 

More

理解memcached的内存存储:http://tech.idv2.com/2008/07/11/memcached-002/
memcached的删除机制和发展方向:http://tech.idv2.com/2008/07/16/memcached-003/

分享到:
评论

相关推荐

    分布式缓存系统Memcached

     Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及...

    数据挖掘化功大法(17)——分布式缓存.docx

    在【数据挖掘化功大法(17)——分布式缓存】中,作者提到了一种常见的分布式缓存架构,通常涉及到HTTP服务器、应用服务器和后端数据库。用户首先通过HTTP服务器请求数据,应用服务器处理请求并调用数据库。在首次...

    memcached完全剖析ehcache memcached redis 缓存技术总结

    1. **Memcached** - 是一个分布式内存对象缓存系统,用于减轻数据库负载,通过将数据存储在内存中来加速动态Web应用。它支持多语言,提供简单的键值对存储,适合短期存储非结构化数据。 2. **Ehcache** - 是一个...

    我们是怎么支撑双11万亿流量的—— 阿里分布式缓存(Tair)技术分享_姜志锋@阿里巴巴.pdf

    Tair 是阿里巴巴集团自研的大规模分布式缓存系统,诞生于 2010 年 4 月,旨在满足缓存需求。2012 年 6 月,LDB 持久化产品满足了持久化存储需求。2012 年 10 月,RDB 缓存产品满足了复杂数据结构的存储需求。2013 年...

    memcached-笔记资料

    【标签】"memcached"明确指出了讨论的主题,这是一个广泛应用于Web开发中的开源分布式内存对象缓存系统。 【压缩包子文件的文件名称列表】: 1. "一致性哈希对缓存命中率的影响实验报告.doc":这份文档可能详细介绍...

    21-08-16_Nop_4.40.3(013_内存缓存和分布式缓存的定义实现).rar

    在这一版本中,我们特别关注的是内存缓存和分布式缓存的实现,这两项技术是提升系统性能、优化数据读取的关键。 内存缓存,顾名思义,是指将常用数据存储在应用程序的内存中,以便快速访问。在nopCommerce中,它被...

    win7 32位 memcached工具

    Memcached是一款高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提高网站或应用的响应速度。它通过存储数据到内存中来快速访问,而非每次请求都去查询数据库。 【描述】"memcached 32位,附带php5.4.7的的...

    Memcached缓存机制 用好Cache,优化应用

    Memcached是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于缓解数据库的负载,提高数据访问速度。它通过将数据存储在内存中,使得数据访问几乎达到内存的速度,从而极大地提升了应用的响应性能。 ...

    go语言分布式书籍合集

    分布式缓存是为了解决大数据量下的快速访问问题,常见的有Redis、Memcached等。《分布式缓存-原理、架构及Go语言实现》这本书可能涉及以下内容: 1. **缓存基础理论**:缓存的命中率、缓存淘汰策略(如LRU、LFU等)...

    基于内存的K-V数据平台(Memcached)

    Memcached是一款高性能、分布式内存对象缓存系统,主要用于加速动态Web应用,通过将数据存储在内存中,减少数据库的访问次数,从而提高应用性能。它是一个轻量级的服务,设计简单且易于部署,支持多种编程语言的...

    PHP缓存与静态化——PHP缓存与静态化

    Memcached是广泛使用的分布式内存对象缓存系统,适用于动态Web应用。它可以存储键值对,将数据存储在内存中,快速响应后续的查询。在大型数据库项目中,Memcached能有效缓解数据库压力,提高整体系统的吞吐量。 **...

    memcached-win32.exe

    Memcached是一款开源、高性能、分布式内存对象缓存系统,主要用于减少数据库负载,提升Web应用的性能。在Windows环境下,它通常以可执行文件“memcached-win32.exe”的形式存在,以适应32位操作系统。 **Memcached...

    memcached-win64-1.4.4-14.zip

    Memcached 是一个高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用来减轻数据库负载,提高数据访问速度。Memcached的设计理念是简单而快速,通过在内存中存储键值对来提供高速的数据访问。这里我们关注的...

    神级memcached源代码分析文档_1.4.0代码分析

    Memcached,这个被广泛应用于众多知名互联网公司的分布式内存对象缓存系统,其源代码分析对于提升系统性能和理解其实现原理至关重要。本文将围绕以下几个核心部分进行深入剖析: 一、Memcached的架构设计 ...

Global site tag (gtag.js) - Google Analytics