`

memcached入门例子

阅读更多
最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是memcached。

    Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。

    上网baidu了很多东西,几乎都差不多,而且基于java的说的很少,所有只有在研究了各个其他语言类的应用后再来尝试在java上进行简单的操作应用。先从memcached上进行说明,memcached的最新版是采用c语言进行开发和设计的,据说旧版的是采用perl语言开发的,而且它是一个应用软件来的,是作为缓存服务器的服务器端运行在服务器上的,需要使用特定的语言编写客户端与其进行通信来进行数据的缓存和获取。通常我们是把memcached安装运行在web服务器上,然后通过对需要的数据进行缓存,据我目前所知,所有数据的缓存设置和存取操作,以及数据的更新后替换操作全部需要程序来进行,而不是自动进行的(自动不知道能不能成功,呵呵)。下面从一个实际的例子来应用memcached。
首先到http://danga.com/memcached/下载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分别解压后即可!首先是安装运行memcached服务器,我们将memcached-1.2.1-win32.zip解压后,进入其目录,然后运行如下命令:

c:>memcached.exe -d install
c:>memcached.exe -127.0.0.1 -m 32 -d start


    第一行是安装memcached成为服务,这样才能正常运行,否则运行失败!第一行是启动memcached的,作为测试我们就简单的只分配32M内存了,然后监听本机端口和以守护进行运行。执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。好了,我们的服务器已经正常运行了, 下面我们就来写java的客户端连接程序。

我们将java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_1.6.jar文件复制到java项目的lib目录下,然后我们来编写代码,比如我提供的一个应用类如下:
package utils.cache;

import java.util.Date;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class MemCached {
	// 创建全局的唯一实例
    protected static MemCachedClient mcc = new MemCachedClient();
   
    protected static MemCached memCached = new MemCached();
    
 // 设置与缓存服务器的连接池
    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);
    }
   
    /**保护型构造方法,不允许实例化!
     * @类名:MemCached.java
     * @描述:TODO
     * @
     */
    protected MemCached()
    {
       
    }
   
    /**
     * @方法功能说明:获取唯一实例
     * @修改者名字:马铁利
     * @修改时间:Feb 10, 2012 2:11:20 PM
     * @修改内容:
     * @参数:@return
     * @return:MemCached
     * @throws
     */
    public static MemCached getInstance()
    {
        return memCached;
    }
    
   
    /**
     * @方法功能说明:添加一个指定的值到缓存中.
     * @修改者名字:马铁利
     * @修改时间:Feb 10, 2012 2:07:17 PM
     * @修改内容:
     * @参数:@param key
     * @参数:@param value
     * @参数:@return
     * @return:boolean
     * @throws
     */
    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);
    }
  
    /**
     * @方法功能说明:替换
     * @修改者名字:马铁利
     * @修改时间:Feb 10, 2012 2:06:51 PM
     * @修改内容:
     * @参数:@param key
     * @参数:@param value
     * @参数:@return
     * @return:boolean
     * @throws
     */
    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);
    }
    
    /**
     * @方法功能说明:删除缓存中的值
     * @修改者名字:马铁利
     * @修改时间:Feb 10, 2012 2:09:07 PM
     * @修改内容:
     * @参数:@param key
     * @参数:@return
     * @return:boolean
     * @throws
     */
    public boolean delete(String key){
    	return mcc.delete(key);
    }
    
    /**
     * @方法功能说明:根据指定的关键字获取对象.
     * @修改者名字:马铁利
     * @修改时间:Feb 10, 2012 2:08:48 PM
     * @修改内容:
     * @参数:@param key
     * @参数:@return
     * @return:Object
     * @throws
     */
    public Object get(String key)
    {
        return mcc.get(key);
    }
    
}

在下载的jar中包含源码,可以自己关联下,然后读下相关源码。
测试类

package utils.test;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import utils.cache.MemCached;
import utils.pojo.Student;

public class Test {
	public static void main(String[] args) {
		MemCached mc = MemCached.getInstance();

		
		//测试缓存基本数据
		mc.add("hello", "马铁利的第一个memcached");
		
		System.out.println(mc.get("hello"));
		
		mc.delete("hello");
		
		mc.add("hello", "马铁利的第二个memcached");
	
		System.out.println(mc.get("hello"));
		
		mc.add("h", "121212", new Date());//奇怪,为什么加上日期后放不到缓存中去呢?调试一下放进去了,结果注释掉本行的时候,获得不到缓存中的值?
		
		System.out.println(mc.get("h"));
		
		//测试缓存pojo(注:pojo类必须要序列化)
		
		Student s =new Student();
		s.setName("matieli");
		s.setAge(25);
		
		mc.add("matieli", s);
		System.out.println("pojo存储!");
		
		Student s1=(Student)mc.get("matieli");
		
		System.out.println("matieli对象的名字:"+s1.getName());
		System.out.println("matieli对象的年龄:"+s1.getAge());
		
		//测试缓存List<pojo>
		
		mc.delete("list");//memcache的add方法不像list map 一样,要想修改值,使用replace或delete 
		
		Student tom =new Student();
		tom.setName("Tom");
		tom.setAge(56);
		Student jack =new Student();
		jack.setName("jack");
		jack.setAge(54);
		List<Student> list =new ArrayList<Student>();
		list.add(jack);
		list.add(tom);
		
		mc.add("list", list);
		
		List<Student> list1=(List<Student>)mc.get("list");
		for (Student stu : list1) {
			System.out.println(stu.getName());
			System.out.println(stu.getAge());
			System.out.println("-------------");
		}
		
	}
}


pojo实体类
package utils.pojo;

public class Student implements java.io.Serializable {
	
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

以上是我在windows下对memcached的一点小学习和实践,在以后的项目开发过程中将会更深入的学习和应用这一缓存工具,也希望和有兴趣的同行一起讨论学习该工具的使用~~


修改端口:

可以直接修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server\下的ImagePath为
"x:\xxx\memcached.exe" -p 端口 -m 内存 -d runservice
分享到:
评论
1 楼 angel243fly 2012-02-11  
thanks,很好的入门例子,转走了。

相关推荐

    php下Memcached入门实例解析

    **PHP下的Memcached入门实例解析** Memcached是一种高性能的分布式内存对象缓存系统,它可以用于存储数据,以减少对数据库的直接访问,从而提高应用程序的响应速度。在PHP环境中,Memcached是常用的缓存解决方案之...

    memcached实例

    在这个例子中,我们首先创建了一个连接到本地 Memcached 服务器的客户端,然后设置了键为 "test_key",值为 "Hello, Memcached!" 的缓存条目。最后,我们通过键获取并打印了缓存值。 ### 四、清除缓存 要删除特定...

    Memcached入门(附安装包及测试代码)

    **Memcached入门** Memcached是一款高性能的分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。本文将详细介绍Memcached的基础知识,并提供安装包和测试代码,帮助初学者...

    memcached入门文档

    【Memcached 入门文档】 Memcached 是一个广泛使用的开源软件,它被设计为一个高性能的分布式内存对象缓存系统,特别适用于动态Web应用程序。它的主要目标是减轻数据库的负载,通过将数据和对象存储在内存中,以...

    Memcached快速入门资料

    通过阅读《Memcached快速入门资料@www.java1234.com.pdf》文档,您可以更深入地了解如何在Java项目中集成和使用Memcached,包括实例代码、最佳实践和常见问题解答。这份资料将帮助开发者快速上手,提高项目性能。

    Memcached 入门介绍(安装与配置)

    在这个例子中,`MemCachedClient`实例用于执行缓存操作,而`SockIOPool`负责管理到Memcached服务器的连接池。注意,实际应用中你需要根据你的服务器配置和应用需求调整连接池参数。 **工作原理** Memcached的工作...

    Memcache入门到精通[张振华.Jack]

    Memcached介绍、应用场景、运行机制 Memcached安装 Memcached启动,参数 ...Memcached的Java客户端实例 Memcached的客户端分布式原理 Memcached的服务器端运行原理 Memcached的过期机制 Memcached同比 QA

    Getting started with memcached

    ### Memcached入门详解 #### 一、Memcached简介与应用场景 **Memcached**是一种高性能、分布式内存对象缓存系统,用于通过减少数据库负载来加速动态Web应用的速度。它通过在内存中缓存数据来减少对数据库服务器的...

    memcached详细安装

    4. **非互相通信的分布式**:尽管 Memcached 被称为分布式缓存服务器,但实际上各个 Memcached 实例之间不会互相通信来共享信息。如何实现分布式则完全依赖于客户端的实现。 #### 三、Memcached 的安装与配置 ####...

    MemCached开发java客户端的使用

    这是MemCached的java客户端连接使用的例子,里面包含了MemCached的增删改查操作,对字符串 list set map 对象的操作等。看就会就入门了,

    memcached和java关联的一些网上例子

    标题“memcached和java关联的一些网上例子”表明了本文将探讨如何在Java编程环境中集成和使用memcached,一个流行的分布式内存对象缓存系统。这个标题适用于初学者,意味着我们将讨论基本的概念、配置以及通过Java...

    memcached for win32

    - 分片技术(sharding)可以将大量数据分散到多个memcached实例,以提升并发处理能力。 **7. 监控与维护** - 可以使用第三方工具(如`memcached-top` 或 `mcstat`)监控memcached的运行状态,如内存使用、命中率等...

    Memcached客户端手册

    ## 一、Memcached简介与使用入门 ### 1.1 Memcached概述 Memcached是一种高性能的分布式内存对象缓存系统,用于减轻数据库负载,加速动态Web应用,提高网站访问速度。其通过缓存数据库查询结果减少数据库访问次数...

    Nhibernate从入门到精通_初学实例

    **Nhibernate从入门到精通 - 初学实例** Nhibernate 是一款流行的开源对象关系映射(ORM)框架,它为.NET开发者提供了一种高效、灵活的方式来管理数据库操作。ORM框架允许程序员使用面向对象的方式处理数据库,减少...

    oscache缓存技术入门实例

    在这个例子中,我们创建了一个名为“exampleCache”的缓存,最大内存元素数量为1000,缓存项在120秒后变为非活动状态,120秒后过期,并采用LRU策略处理内存溢出。 四、osCache使用示例 1. 添加依赖:在你的项目中...

    易语言-Memcached协议客户端模块

    总的来说,这个易语言Memcached协议客户端模块为我们提供了一个学习和参考的实例,展示了如何在易语言环境下实现与分布式缓存系统的交互,对于提升易语言开发者在网络编程和缓存技术方面的技能非常有帮助。...

    NHibernate入门实例

    【NHibernate入门实例】 NHibernate 是一款开源的.NET ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库,而无需关心底层的SQL语句。在ASP.NET Web应用程序中,NHibernate能极大地提高开发效率,...

    PHP入门之PHP教程100例.rar

    【PHP入门之PHP教程100例.rar】这个压缩包是一个专门为初学者设计的PHP学习资源,包含了100个实例,旨在帮助新手快速掌握PHP编程基础。PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别...

Global site tag (gtag.js) - Google Analytics