zoukankan      html  css  js  c++  java
  • Java开发中的Memcache原理及实现

    转载于http://blog.csdn.net/xzknet/article/details/44066141

    http://www.runoob.com/memcached/java-memcached.html 菜鸟教程-简单操作

     Memcached 客户端程序

    Memcached的java客户端已经存在三种了:

    1  官方提供的基于传统阻塞io由Greg Whalin维护的客户端

    2  Dustin Sallings实现的基于java nio的Spymemcached

    3  XMemcached


    1. 三种API比较 
    1)      memcached client for java

    较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。


    2)      spymemcached

    A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。


    3)      xmemcached

    XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。


    2.  建议

    由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。

    XMemcached也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性 能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与Spring框架和Hibernate-memcached的集 成、客户端连接池、可扩展性好等。

    下面给出这三种客户端的示例程序。


    3.  示例程序 
    1)      memcached client for java

    从前面介绍的Java环境的Memcached客户端程序项目网址里,下载最新版的客户端程 序包:java_memcached-release_2.5.1.zip,解压后,文件夹里找到java_memcached- release_2.5.1.jar,这个就是客户端的JAR包。将此JAR包添加到项目的构建路径里,则项目中,就可以使用Memcached了。

    示例代码如下:

    package temp;

    import com.danga.MemCached.*;

    import org.apache.log4j.*;

    public class CacheTest {

        public static void main(String[] args) {

           /**

            * 初始化SockIOPool,管理memcached的连接池

            * */

           String[] servers = { "10.11.15.222:10000" };

           SockIOPool pool = SockIOPool.getInstance();

           pool.setServers(servers);

           pool.setFailover(true);

           pool.setInitConn(10);

           pool.setMinConn(5);

           pool.setMaxConn(250);

           pool.setMaintSleep(30);

           pool.setNagle(false);

           pool.setSocketTO(3000);

           pool.setAliveCheck(true);

           pool.initialize();

           /**

            * 建立MemcachedClient实例

            * */

           MemCachedClient memCachedClient = new MemCachedClient();

           for (int i = 0; i < 1000; i++) {

               /**

                * 将对象加入到memcached缓存

                * */

               boolean success = memCachedClient.set("" + i, "Hello!");

               /**

                * 从memcached缓存中按key值取对象

                * */

               String result = (String) memCachedClient.get("" + i);

               System.out.println(String.format("set( %d ): %s", i, success));

               System.out.println(String.format("get( %d ): %s", i, result));

           }

        }

    }


    2)      spymemcached

    spymemcached当前版本是2.5版本,官方网址是:http://code.google.com/p/spymemcached/。可以从地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar 下载最新版本来使用。

    示例代码如下:

    package temp;

    import java.net.InetSocketAddress;

    import java.util.concurrent.Future;

    import net.spy.memcached.MemcachedClient;

    public class TestSpyMemcache {

        public static void main(String[] args) {

           // 保存对象

           try {

               /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

               MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));

               Future<Boolean> b = null;

               /* 将key值,过期时间(秒)和要缓存的对象set到memcached中 */

               b = mc.set("neea:testDaF:ksIdno", 900, "someObject");

               if (b.get().booleanValue() == true) {

                  mc.shutdown();

               }

           } catch (Exception ex) {

               ex.printStackTrace();

           }

           // 取得对象

            try {

               /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

               MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));

               /* 按照key值从memcached中查找缓存,不存在则返回null */

               Object b = mc.get("neea:testDaF:ksIdno");

               System.out.println(b.toString());

               mc.shutdown();

           } catch (Exception ex) {

               ex.printStackTrace();

           }

        }

    }


    3)      xmemcached

    Xmemcached的官方网址是:http://code.google.com/p/xmemcached/,可以从其官网上下载最新版本的1.2.4来使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz 。

    示例代码如下:

    package temp;

    import java.io.IOException;

    import java.util.concurrent.TimeoutException;

    import net.rubyeye.xmemcached.utils.AddrUtil;

    import net.rubyeye.xmemcached.MemcachedClient;

    import net.rubyeye.xmemcached.MemcachedClientBuilder;

    import net.rubyeye.xmemcached.XMemcachedClientBuilder;

    import net.rubyeye.xmemcached.exception.MemcachedException;

    public class TestXMemcache {

        public static void main(String[] args) {

           MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil

                  .getAddresses("10.11.15.222:10000"));

           MemcachedClient memcachedClient;

           try {

               memcachedClient = builder.build();

               memcachedClient.set("hello", 0, "Hello,xmemcached");

               String value = memcachedClient.get("hello");

               System.out.println("hello=" + value);

               memcachedClient.delete("hello");

               value = memcachedClient.get("hello");

               System.out.println("hello=" + value);

               // close memcached client

               memcachedClient.shutdown();

           } catch (MemcachedException e) {

               System.err.println("MemcachedClient operation fail");

               e.printStackTrace();

           } catch (TimeoutException e) {

               System.err.println("MemcachedClient operation timeout");

               e.printStackTrace();

           } catch (InterruptedException e) {

               // ignore

           }catch (IOException e) {

               System.err.println("Shutdown MemcachedClient fail");

               e.printStackTrace();

           }

        }

    }

  • 相关阅读:
    电商平台开发笔记5.nuxt项目中深度选择器解决el-input高度设置无效
    电商平台开发笔记4.css选择器之~波浪号使用
    电商平台开发笔记3.nuxt全局css的引入
    电商平台开发笔记2.Nuxt增加对less支持,解决This relative module was not found报错
    电商平台开发笔记1.Nuxt项目创建+Eslint代码保存自动格式化
    vue-cli 4.x 发布前的一些优化
    VueCli 4.x npm run build后主页空白的原因及解决方案
    VSCode 保存时自动ESlint格式化
    git 常用操作笔记
    VSCode下手动构建webpack项目
  • 原文地址:https://www.cnblogs.com/xxj-bigshow/p/8031404.html
Copyright © 2011-2022 走看看