MemCache学习笔记

来源:互联网 发布:centos 不支持chrome 编辑:程序博客网 时间:2024/06/05 19:45

简介

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。Memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作

特征

memcached作为高速运行的分布式缓存服务器,具有以下的特点。

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

存储方式

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


适合什么场合

随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

memcached不是万能的,它也不是适用在所有场合。

Memcached 是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用, memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。测试数据中显示, memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用 memcached是非常不划算的。

Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的, memcached可以大大降低数据库压力,使系统执行效率提升。另外,memcached也经常作为服务器之间数据共享的储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。

需要注意的是,memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以 memcached不能用来持久保存数据。很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。

LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memcached作为缓存工具。memcached可以大规模网站应用发挥巨大的作用。

工作原理

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站更快的运行速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。

memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。


安装

  • install libevent
    $ wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz$ tar xzvf libevent-2.0.12-stable.tar.gz$ cd libevent-2.0.12$ ./configure$ make$ sudo make install

    或者

    $ sudo yum install libevent libevent-devel
  • install memcache
    $ wget http://www.danga.com/memcached/dist/memcached-1.4.5.tar.gz$ tar zxf memcached-1.4.5.tar.gz$ cd memcached-1.2.5$ ./configure$ make$ sudo make install

    或者

    $ sudo yum install memcached

Now memcached is installed. You can test it:

$ memcached -m 512 -u nobody -vv

First, you start up the memcached daemon on as many spare machines as you have. The daemon has no configuration file, just a few command line options, only 3 or 4 of which you'll likely use:

$ memcached -p 11211 -u nobody -m 512 -vv

memcache服务端使用

$ memcached -d -m 2048 -l 10.0.25.8 -p 11211  -u nobody
  • -d 以守护程序(daemon)方式运行 memcached;
  • -m 设置 memcached 可以使用的内存大小,单位为 M;
  • -l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
  • -p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
  • -u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。

Java客户端访问

memcached-2.3.1.jar

import net.spy.memcached.MemcachedClient;import java.io.IOException;import java.io.Serializable;import java.net.InetSocketAddress;//spymemcached也自带了几个例子,大家可以看看//http://code.google.com/p/spymemcached/wiki/Examplesclass User implements Serializable{ //必须将对象序列化才能保存public String userName;public String password;}public class MemcachedTest {public static void main(String[] args) throws IOException {MemcachedClient c = new MemcachedClient(new InetSocketAddress("10.0.25.8", 11211));//存取一个简单的Integer// Store a value (async) for one hourc.set("someKey", 3600, new Integer(4));// Retrieve a value (synchronously).Object myObject = c.get("someKey");Integer result = (Integer) myObject;System.out.println(result);//存取一个序列化的对象System.out.println("存之前的时间:" + System.currentTimeMillis());User user1 = new User();user1.userName = "ZhangSan";user1.password = "alongpasswordhere";c.set("user1", 3600, user1);System.out.println("取之前的时间:" + System.currentTimeMillis());User myUser1 = (User)(c.get("user1"));System.out.println(myUser1.userName + " " + myUser1.password);System.out.println("取之后的时间:" + System.currentTimeMillis());c.shutdown();}}

执行的测试结果:

4存之前的时间:1310259282865取之前的时间:1310259282872ZhangSan alongpasswordhere取之后的时间:1310259282877

注意

如果连接不上,多半是防火墙的原因

关闭防火墙$ /etc/init.d/iptables stop

安装问题

  • checking build system type... Invalid configuration `x86_64-unknown-linux-': machine `x86_64-unknown-linux' not recognized
    $ yum install gcc$ yum install gcc-c++$ yum install automake14


基于内存缓存的业界解决方案

  • MemCache Story:http://toblender.com/tag/memcached/
  • Discuz!的Memcache缓存实现:http://www.ccvita.com/261.html
  • Twitter版的开源Memcached:http://www.csdn.net/article/2012-09-09/2809748
  • 淘宝Tair:http://www.oschina.net/p/tair

基于内存缓存的真实案例

验证工程

  • 基于Maven的Demo项目
    • 项目源代码:cache-demo.zip
    • 项目依赖:alisoft-xplatform-asf-cache-2.5.1.jar
    • 注意alisoft-xplatform-asf-cache-2.5.1.jar是一个外部以来jar,所以用maven需要先下载到本地后,在本地安装此jar到本地库
      mvn install:install-file -Dfile=alisoft-xplatform-asf-cache-2.5.1.jar -DgroupId=alisoft-xplatform-asf-cache -DartifactId=alisoft-xplatform-asf-cache -Dversion=2.5.1 -Dpackaging=jar
  • 性能测试
    • 测试准备:开启memcached服务
      memcached -d -m 2048 -l 10.0.25.8 -p 33000  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33001  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33002  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33003  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33004  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33005  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33006  -u nobody -vvmemcached -d -m 2048 -l 10.0.25.8 -p 33007  -u nobody -vv
    • cache-demo中包涵了压力测试以及其他性能测试代码


原创粉丝点击