Java开发中的Memcache原理及实现

简介: 七、            Memcached 客户端程序 Memcached的java客户端已经存在三种了: ?  官方提供的基于传统阻塞io由Greg Whalin维护的客户端 ?  Dustin Sallings实现的基于java nio的Spymemcached ?  XMemcached 1. 三种API比较 1)      memcached client for j

七、            Memcached 客户端程序

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

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

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

?  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();

       }

    }

}

相关文章
|
12天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
42 4
|
11天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
26 1
|
12天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
40 2
|
12天前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
4天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
26 8
|
2天前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
15 5
|
3天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
6天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
8天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
11天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。