java操作Memcached

2019-03-25 21:27|来源: 网络

1.memcached client for java客户端API:memcached client for java
网址:http://www.whalin.com/memcached
最新版本:java_memcached-release_2.0.1

操作示例:

Java代码
  1. import com.danga.MemCached.*;  

  2. import org.apache.log4j.*;  

  3. public class TestMemcached {  

  4.    public static void main(String[] args) {  

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

  6.        String[] servers = { "192.168.1.20:12111" };  

  7.        SockIOPool pool = SockIOPool.getInstance();  

  8.        pool.setServers(servers);  

  9.        pool.setFailover(true);  

  10.        pool.setInitConn(10);  

  11.        pool.setMinConn(5);  

  12.        pool.setMaxConn(250);  

  13.        pool.setMaintSleep(30);  

  14.        pool.setNagle(false);  

  15.        pool.setSocketTO(3000);  

  16.        pool.setAliveCheck(true);  

  17.        pool.initialize();  

  18.        /*建立MemcachedClient实例*/  

  19.        MemCachedClient memCachedClient = new MemCachedClient();  

  20.        for (int i = 0; i < 10; i++) {  

  21.            /*将对象加入到memcached缓存*/  

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

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

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

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

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

  27.        }  

  28.    }  

  29. }  



2.spymemcached客户端API:spymemcached client
网址:http://code.google.com/p/spymemcached/
最新版本:memcached-2.1.jar

操作示例:
用spymemcached将对象存入缓存
Java代码
  1. import java.net.InetSocketAddress;  

  2. import java.util.concurrent.Future;

  3. import net.spy.memcached.MemcachedClient;

  4. public class MClient {

  5.    public static void main(String[] args){  

  6.        try{  

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

  8.            MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.1.20", 12111));  

  9.            Future<Boolean> b = null;  

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

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

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

  13.                mc.shutdown();  

  14.            }  

  15.        }  

  16.        catch(Exception ex){  

  17.            ex.printStackTrace();  

  18.        }  

  19.    }  

  20. }  



用spymemcached从缓存中取得对象
Java代码
  1. import java.net.InetSocketAddress;  

  2. import java.util.concurrent.Future;

  3. import net.spy.memcached.MemcachedClient;

  4. public class MClient {

  5.    public static void main(String[] args){  

  6.        try{  

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

  8.            MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.1.20", 12111));  

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

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

  11.            mc.shutdown();  

  12.        }  

  13.        catch(Exception ex){  

  14.            ex.printStackTrace();  

  15.        }  

  16.    }  

  17. }  



3.两种API比较
memcached client for java:较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
spymemcached:A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。
由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。


以上是转自:http://lveyo.iteye.com/blog/240146




以下是转自:http://leeqianjun.iteye.com/blog/264010


建立Manager类

  1. package com.alisoft.sme.memcached;  

  2.  

  3. import java.util.Date;  

  4.  

  5. import com.danga.MemCached.MemCachedClient;  

  6. import com.danga.MemCached.SockIOPool;  

  7.  

  8. public class MemCachedManager {  

  9.  

  10.    // 创建全局的唯一实例  

  11.    protected static MemCachedClient mcc = new MemCachedClient();  

  12.  

  13.    protected static MemCachedManager memCachedManager = new MemCachedManager();  

  14.  

  15.    // 设置与缓存服务器的连接池  

  16.    static {  

  17.        // 服务器列表和其权重  

  18.        String[] servers = { "127.0.0.1:11211" };  

  19.        Integer[] weights = { 3 };  

  20.  

  21.        // 获取socke连接池的实例对象  

  22.        SockIOPool pool = SockIOPool.getInstance();  

  23.  

  24.        // 设置服务器信息  

  25.        pool.setServers(servers);  

  26.        pool.setWeights(weights);  

  27.  

  28.        // 设置初始连接数、最小和最大连接数以及最大处理时间  

  29.        pool.setInitConn(5);  

  30.        pool.setMinConn(5);  

  31.        pool.setMaxConn(250);  

  32.        pool.setMaxIdle(1000 * 60 * 60 * 6);  

  33.  

  34.        // 设置主线程的睡眠时间  

  35.        pool.setMaintSleep(30);  

  36.  

  37.        // 设置TCP的参数,连接超时等  

  38.        pool.setNagle(false);  

  39.        pool.setSocketTO(3000);  

  40.        pool.setSocketConnectTO(0);  

  41.  

  42.        // 初始化连接池  

  43.        pool.initialize();  

  44.  

  45.        // 压缩设置,超过指定大小(单位为K)的数据都会被压缩  

  46.        mcc.setCompressEnable(true);  

  47.        mcc.setCompressThreshold(64 * 1024);  

  48.    }  

  49.  

  50.    /**

  51.     * 保护型构造方法,不允许实例化!

  52.     *

  53.     */  

  54.    protected MemCachedManager() {  

  55.  

  56.    }  

  57.  

  58.    /**

  59.     * 获取唯一实例.

  60.     *

  61.     * @return

  62.     */  

  63.    public static MemCachedManager getInstance() {  

  64.        return memCachedManager;  

  65.    }  

  66.  

  67.    /**

  68.     * 添加一个指定的值到缓存中.

  69.     *

  70.     * @param key

  71.     * @param value

  72.     * @return

  73.     */  

  74.    public boolean add(String key, Object value) {  

  75.        return mcc.add(key, value);  

  76.    }  

  77.  

  78.    public boolean add(String key, Object value, Date expiry) {  

  79.        return mcc.add(key, value, expiry);  

  80.    }  

  81.  

  82.    public boolean replace(String key, Object value) {  

  83.        return mcc.replace(key, value);  

  84.    }  

  85.  

  86.    public boolean replace(String key, Object value, Date expiry) {  

  87.        return mcc.replace(key, value, expiry);  

  88.    }  

  89.  

  90.    /**

  91.     * 根据指定的关键字获取对象.

  92.     *

  93.     * @param key

  94.     * @return

  95.     */  

  96.    public Object get(String key) {  

  97.        return mcc.get(key);  

  98.    }  

  99.  

  100.    public static void main(String[] args) {  

  101.        MemCachedManager cache = MemCachedManager.getInstance();  

  102.        cache.add("hello", 234);  

  103.        System.out.print("get value : " + cache.get("hello"));  

  104.    }  

  105. }  


建立数据对象

  1. package com.alisoft.sme.memcached;

  2. import java.io.Serializable;

  3. public class TBean implements Serializable {

  4.    private static final long serialVersionUID = 1945562032261336919L;

  5.    private String name;

  6.    public String getName() {  

  7.        return name;  

  8.    }

  9.    public void setName(String name) {  

  10.        this.name = name;  

  11.    }  

  12. }  

Java代码  收藏代码
  1. <pre class="java" name="code"> </pre>  


创建测试用例

  1. package com.alisoft.sme.memcached.test;

  2. import junit.framework.TestCase;

  3. import org.junit.Test;

  4. import com.alisoft.sme.memcached.MemCachedManager;  

  5. import com.alisoft.sme.memcached.TBean;

  6. public class TestMemcached extends TestCase {

  7.    private static MemCachedManager cache;

  8.    @Test  

  9.    public void testCache() {

  10.        TBean tb = new TBean();  

  11.        tb.setName("E网打进");  

  12.        cache.add("bean", tb);  

  13.          

  14.        TBean tb1 = (TBean) cache.get("bean");  

  15.        System.out.println("name=" + tb1.getName());  

  16.        tb1.setName("E网打进_修改的");  

  17.          

  18.        tb1 = (TBean) cache.get("bean");  

  19.        System.out.println("name=" + tb1.getName());  

  20.    }  

  21.  

  22.    @Override  

  23.    protected void setUp() throws Exception {  

  24.        super.setUp();  

  25.        cache = MemCachedManager.getInstance();  

  26.    }  

  27.  

  28.    @Override  

  29.    protected void tearDown() throws Exception {  

  30.        super.tearDown();  

  31.        cache = null;  

  32.    }

  33. }  


测试结果

  1. [INFO] ++++ serializing for key: bean for class: com.alisoft.sme.memcached.TBean  

  2. [INFO] ++++ memcache cmd (result code): add bean 8 0 93 (NOT_STORED)  

  3. [INFO] ++++ data not stored in cache for key: bean  

  4. [INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean  

  5. name=E网打进  

  6. [INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean  

  7. name=E网打进  

本文链接:java操作Memcached

相关问答

更多
  • https://github.com/gwhalin/Memcached-Java-Client/downloads 这里不是有下么?最新版的
  • 此外,我还讨论过较为常见的基于 服务器的 数据存储,比如 MongoDB 和 CouchDB。每个数据存储都有其优势和劣势,特别是当应用于特定领域时。 本期的 Java 开发 2.0 关注的是 Redis,一种轻量级 键值对数据存储。多数 NoSQL 实现本质上都是键值对,但是 Redis 支持非常丰富的值集,其中包括 字符串、列表、集以及散列。因此,Redis 通常被称为 数据结构服务器。Redis 也以异常快速而闻名,这使得它成为某一特定 类型使用案例的最优选择。 当我们想要了解一种 新事物时,将其同熟 ...
  • 这里就不再逐个讨论了,我将会在一个实际应用程序开发场景中介绍其中的一些。使用Redis 作为一个缓存解决方案 我之前提到过,Redis 可轻易地用作一个缓存解决方案,碰巧我现在正好需要这样一个!在该应用程序示例中,我将 Redis 集成到我基于定位的移动 Web 服务中,称之为 Magnus。 如果您没有关注本系列,那么我会先使用 Play 框架实现 Magnus,从那时起我就已经在各种实现中开发和重构它了。Magnus 是一个简单服务,可以通过 HTTP PUT 请求使用 JSON 文档。这些文档描述了特 ...
  • 首先get(key),如果获取不到缓存,则查询数据库后把结果放入缓存,再次取就行了 Object obj = MemUtil.get(key); if(key == null){ //查询数据库,返回结果B MemUtil.set(key,B); }else{ //正常操作 }
  • Memcached就是在内存中维护一张巨大的hash表,通过自己的一套算法来维 护数据的操作,这个算法比较复杂,这里我们只做简单的介绍,对我们PHP程序员而言,重点掌握如何在项目如何使 Memcached技术. 本章节要求同学们深刻理解Memcached运行原理,并能够正确使用Memcached对网站优化提速。
  • 作为spymemcached的作者,我有点偏见,但我会说这是我的原因如下: 从头开始设计为无阻塞无处不在。 当你要求数据,发出一个集合等等时,有一个小的并发队列插入,你会得到一个未来来阻止结果(有一些方便的常见情况,比如get)。 积极优化 您可以在我的优化页面上阅读更多内容,但我做了整个应用程序优化。 我仍然在微基准测试中做得很好,但是要与其他客户端进行比较,您必须设法实现不切实际的使用模式(例如,等待每个设置操作的响应或构建锁周围的响应,以防止数据包优化)。 痴迷地测试 我保留了一个非常严格的测试套件, ...
  • 这是不可能的, 这是解释原因: 没有.memcached不支持它,它不是一个计划的功能。 这将是一个相对缓慢和阻塞的操作...... UPDATE 常见问题如何列出所有密钥? 使用memcached,您无法列出所有密钥。 有一个调试接口,但这不是一个明智的用法。 It's not possible, here's the explanation why: No. memcached doesn't support that and it's not a planned feature. It would b ...
  • 它在文本协议中不受支持,因为它表达非常非常复杂,没有客户端会支持它,并且它提供的功能很少,你不能从文本协议中做到这一点。 它在二进制协议中得到支持,因为它是二进制操作的一个简单用例。 spymemcached隐式支持它 - 只需做一堆集并且魔术发生: http://dustin.github.com/2009/09/23/spymemcached-optimizations.html It's not supported in the text protocol because it'd be very, ...
  • 我想到了。 我简单地将从MemcachedCleint获得的数据类型化为byte[] ,并将其作为我的Protobuf对象的pasreFrom方法的输入。 I figured it out. I simply typecasted the data I get from MemcachedCleint to byte[] and gave it as input to the pasreFrom method of my Protobuf object.
  • 垃圾收集器不能“太慢”并且内存不足。 在抛出OutOfMemoryError之前,垃圾回收器保证运行。 只有当它无法释放足够的内存时才会抛出错误。 您应该使用分析器来查看是否有内存泄漏,或者您是否只是挂在太多对象上。 之后,您可能需要调整GC以提高性能,例如,请参见: GC调整 The garbage collector can't be "too slow" and run out of memory. Before throwing an OutOfMemoryError, the garbage co ...