`

分布式缓存系统Memcached

阅读更多

 

 

 

一、Memcache简介

Memcache是danga.com的一个项目,最早是为LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。

在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。 Memcached就是这样一种高性能的、分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

为什么会有Memcache和memcached两种名称?

其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。

Memcache官方网站:http://www.danga.com/memcached,或http://memcached.org/

二、Memcached能缓存什么

通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

三、Memcached快么

非常快!Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态),使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为0.。

Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及Memcache失效时对数据库的访问速度。

四、Memcached的特点

Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

五、Memcached工作原理

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

与许多cache工具类似,Memcached的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的ip与其对应的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式。使用libevent作为事件通知实现。多个Server可以协同工作,但这些Server之间是没有任何通讯联系的,每个Server只是对自己的数据进行管理。Client端通过指定Server端的ip地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过hash进行转换,根据hash值把value传递到对应的具体的某个Server上。当需要获取对象数据时,也根据key进行。首先对key进行hash,通过获得的值可以确定它被保存在了哪台Server上,然后再向该Server发出请求。Client端只需要知道保存hash(key)的值在哪台服务器上就可以了。

其实说到底,memcached的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。

六、Memcached的安装

1、如果是LINUX系统,可以到官方网址http://memcached.org/进行下载,安装教程网上一大堆,这里不再叙述。

2、如果是WINDOWS系统,就到http://code.jellycan.com/memcached/下载稳定版,写这篇文档时,最新版本是memcached 1.2.6,下载win32 binary版本,具体的下载地址是:http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip

下载后解压到某个盘下面,比如在c:\memcached,然后打开命令提示符(cmd)窗口,输入下述命令:

  1. c:\memcached\memcached.exe -d install   //安装Memcached 
  2. c:\memcached\memcached.exe -d start  //启动Memcached 

 

 


修改memcache的内存大小,可以在注册表里找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/memcached Server,修改ImagePath的值为

  1. "C:/memcached/memcached.exe" -d runservice -m 512 

 

 


注意:Windows版本一般用作开发调试只用,不建议在产品环境中使用。

七、在Java中使用Memcached

本测试实例源码及相关类库下载:http://dl.dbank.com/c0bmxg9ezr

https://github.com/gwhalin/Memcached-Java-Client页面下载memcached java client,得到java_memcached-release_2.5.3.jar文件,将其添加到项目的classpath中。

下面就利用利用memcached java client来建立一个简单的应用一个简单的应用。

① 建立MemCachedManager类
package sunchis;  
  
import java.util.Date;  
  
import com.danga.MemCached.MemCachedClient;  
import com.danga.MemCached.SockIOPool;  
  
@SuppressWarnings("deprecation")  
public class MemCachedManager {  
    // 创建全局的唯一实例    
    protected static MemCachedClient mcc = new MemCachedClient();  
    protected static MemCachedManager memCachedManager = new MemCachedManager();  
      
    // 设置与缓存服务器的连接池  
    static {    
        // 服务器列表和其权重    
        String[] servers = { "127.0.0.1:11211" };    
        Integer[] weights = { 3 };    
          
        // 获取socke连接池的实例对象    
        SockIOPool pool = SockIOPool.getInstance();    
          
        // 设置服务器信息    
        pool.setServers(servers);    
        pool.setWeights(weights);    
          
        // 设置初始连接数、最小和最大连接数以及最大处理时间    
        pool.setInitConn(5);    
        pool.setMinConn(5);    
        pool.setMaxConn(250);    
        pool.setMaxIdle(1000 * 60 * 60 * 6);    
          
        // 设置主线程的睡眠时间    
        pool.setMaintSleep(30);    
          
        // 设置TCP的参数,连接超时等    
        pool.setNagle(false);    
        pool.setSocketTO(3000);    
        pool.setSocketConnectTO(0);    
          
        // 初始化连接池    
        pool.initialize();    
          
        // 压缩设置,超过指定大小(单位为K)的数据都会被压缩    
        mcc.setCompressEnable(true);    
        mcc.setCompressThreshold(64 * 1024);    
    }  
      
    /**   
     * 保护型构造方法,不允许实例化! */    
    protected MemCachedManager() {    
    }  
      
    /**   
     * 获取唯一实例 */    
    public static MemCachedManager getInstance() {    
        return memCachedManager;    
    }  
      
    /**   
     * 添加一个指定的值到缓存中.   
     * @param key   
     * @param value   
     * @return */    
    public boolean add(String key, Object value) {    
        return mcc.add(key, value);    
    }    
      
    public boolean add(String key, Object value, Date expiry) {    
        return mcc.add(key, value, expiry);    
    }    
      
    public boolean replace(String key, Object value) {    
        return mcc.replace(key, value);    
    }    
      
    public boolean replace(String key, Object value, Date expiry) {    
        return mcc.replace(key, value, expiry);    
    }  
      
    /**   
     * 根据指定的关键字获取对象.   
     * @param key   
     * @return */    
    public Object get(String key) {    
        return mcc.get(key);    
    }  
      
    public static void main(String[] args) {    
        MemCachedManager cache = MemCachedManager.getInstance();    
        cache.add("hello", 234);    
        System.out.print("get value : " + cache.get("hello"));    
    }   
} 

 

② 建立数据模型TBean.java
 import java.io.Serializable;  
@SuppressWarnings("serial") 
public class TBean implements Serializable {     
private String name;      
public String getName() {
        return name;     
  }     
 public void setName(String name) {        
        this.name = name;    
  } 
} 

 

③ 建立测试类TestMemcached.java
package sunchis;  
import org.junit.Test; 
import junit.framework.TestCase; 
 public class TestMemcached extends TestCase {     
private static MemCachedManager cache;         
 @Test       
public void testCache() {
           TBean tb = new TBean();
           tb.setName("三知开发网");
           cache.add("bean", tb); 
           TBean tb1 = (TBean) cache.get("bean"); 
           System.out.println("name=" + tb1.getName());       
           tb1.setName("www.sunchis.com"); 
           tb1 = (TBean) cache.get("bean");
           System.out.println("name=" + tb1.getName());
     }          
@Override
       protected void setUp() throws Exception {
           super.setUp(); 
          cache = MemCachedManager.getInstance();
       }
          @Override
       protected void tearDown() throws Exception {
           super.tearDown(); 
          cache = null; 
      }
  } 
 

 

④ 测试结果

//第一次运行结果 
name=三知开发网 
name=www.sunchis.com  
//第二次运行结果 
name=www.sunchis.com 
name=www.sunchis.com 

 

分享到:
评论

相关推荐

    分布式缓存系统Memcached学习心得.zip

    分布式缓存系统在现代Web开发中扮演...总的来说,分布式缓存系统Memcached是现代Web应用中不可或缺的工具。通过深入学习和实践,我们可以充分利用其优势,优化应用性能,减轻数据库压力,从而提供更高效、稳定的服务。

    分布式缓存系统Memcached简介及开发环境搭建

    分布式缓存系统是现代Web应用中提升性能的关键技术之一,Memcached作为其中的代表,以其高性能、简单易用的特点被广泛采用。Memcached是一个开源的、基于内存的分布式缓存解决方案,主要目的是减少对数据库的访问,...

    C#/.net分布式缓存系统Memcached 实例

    Memcached是一个高性能的分布式的内存对象缓存系统.它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力...

    分布式缓存系统Memcached在Asp.net下的应用

    运行程序后,第一次加载数据,会将数据存入缓存;点击“加载数据”按钮,这个时候,数据是从缓存中读取的。 如果要测试是否为缓存,将“"select top 100 * from UM_Function order by FuncID";”中的“order by ...

    分布式缓存客户端MemcachedProviders最新下载

    Memcached是一种广泛使用的开源高性能、分布式内存对象缓存系统,它可以存储数据并提供高速访问,减轻数据库负载,从而提升整体系统性能。MemcachedProviders则是针对Memcached的一种客户端实现,为开发者提供了更...

    分布式缓存服务器memcacaed的源代码

    分布式缓存服务器Memcached是互联网应用中广泛使用的内存对象缓存系统,用于减轻数据库的负载,提高应用程序的性能。Memcached的设计目标是简单且高效,它通过在内存中存储数据来提供快速的数据访问。让我们深入了解...

    Memcached分布式缓存系统的应用.pdf

    Memcached作为一种流行的分布式缓存系统,通过在内存中缓存数据和对象,显著提高了Web应用的响应速度和性能。分布式缓存通过将缓存数据分布在多个服务器节点上,能够实现负载均衡、容错、以及数据一致性,这些特性...

    Memcached分布式缓存学习.doc

    Memcached 分布式缓存学习 ...Memcached 是一个高性能的分布式缓存系统,能够提高网站的速度和性能,减轻数据库的负载。但是,Memcached 也存在一些缺点,例如数据丢失和客户端需要实现分布式算法。

    分布式缓存Memcached实例

    Memcached是一款由Danga Interactive公司设计并开发的高效、分布式内存对象缓存系统。它的主要目标是减轻数据库的负担,提高动态应用程序的响应速度,通过将数据存储在内存中,使得频繁访问的数据可以更快地被获取,...

    Memcached分布式缓存

    Memcached作为一款高性能的分布式缓存系统,在现代互联网应用中扮演着至关重要的角色。通过深入理解其基本概念、内存管理机制、分布式算法以及应用场景,可以帮助开发者更好地利用该技术来提高应用性能。随着技术的...

    Memcached分布式缓存入门

    Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。这个“Memcached分布式缓存入门”资料将引导初学者深入理解Memcached的核心概念、工作原理以及...

    Memcached分布式缓存简介

    Memcached是一种高性能的分布式内存对象缓存系统,主要用于动态Web应用程序,以缓解数据库负载。它通过将数据和对象存储在内存中,减少对数据库的直接访问,从而提高动态、数据库驱动网站的速度。对于.NET开发者来说...

    第八章 企业项目开发--分布式缓存memcached1

    总的来说,分布式缓存Memcached是提升大型分布式系统性能和可扩展性的关键组件,选择合适的Java客户端库并合理配置,可以有效地解决本地缓存的局限性,为企业的高并发、大数据量场景提供稳定、高效的缓存服务。

    Java系统分布式缓存PPT

    常见的分布式缓存系统如Redis、Memcached等,它们支持键值对存储,提供了高并发、低延迟的数据访问能力。此外,本章可能还会涉及一致性哈希算法,它是分布式缓存中解决数据分片和负载均衡的关键技术。 “分布式缓存...

    .NET分布式缓存Memcached从入门到实战源码下载

    Memcached是一款轻量级、高性能的分布式内存对象缓存系统,广泛应用于Web应用中。本文将深入探讨.NET环境下使用Memcached作为分布式缓存的实践,基于提供的源码进行分析。 首先,`ABenNet.Knowledge.Memcached.sln`...

    30_分布式缓存相关面试题的回答技巧总结.zip

    常见的分布式缓存系统有Redis、Memcached、Hazelcast等。 2. **为什么要使用分布式缓存?** 主要原因包括:提高性能(缓存热数据,减少对数据库的直接访问)、增加可扩展性(水平扩展缓存节点)和提供高可用性...

    分布式缓存实现(附源码)

    常见的分布式缓存系统有Redis、Memcached、Hazelcast等,而本项目可能是基于这些系统之一或自研的一种实现。 在C#中实现分布式缓存,通常会用到如StackExchange.Redis、MemcachedClientLibrary等第三方库。...

    20120102 net下memcached 分布式缓存系统应用

    "20120102 net下memcached 分布式缓存系统应用" 这个标题表明这是一个关于在.NET环境中使用Memcached作为分布式缓存系统的实践教程或参考资料。时间戳“20120102”可能指的是资料的创建日期,暗示了这是较早时期的...

Global site tag (gtag.js) - Google Analytics