0 0

memcache 是如何存储java对象的?5

刚用memcached,我知道memcached因为使用的是文本协议,所以value通常是使用字符串存储,提供的java client实际上是直接存入java对象的,目前我遇到的问题是:我有个类似memcached的缓存,但是提供的接口仅支持字符串存储,因此我想问问 ,我怎么把我的java对象转成需要的串存入,像memcached一样,求大牛解答~
2012年9月06日 09:16

5个答案 按时间排序 按投票排序

1 0

你用 一个 json 工具包 序列化对象 ,读取出来的时候 反序列化为 对象,就OK 了 !

  目前序列化的 工具很多:  fastjson,jackson gson ,等, 推荐使用 阿里的 fastjson!

http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2424946

2012年9月06日 09:25
0 0

根据我们项目的实践,用jsckson将对象序列化为json后存入memcache最快!!
java自己的序列化效率不高。

2012年9月06日 22:34
0 0


/**
 * 序列化工具
 * 
 * @author Jeremiah Xu
 * 
 */
public final class SerializationUtil {
    /**
     * 序列化一个对象为字节数组
     * 
     * @param obj
     * @return
     * @throws Exception
     */
    public final static byte[] serialize(Serializable obj) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        serialize(obj, baos);
        byte[] b = baos.toByteArray();
        baos.close();
        return b;
    }

    /**
     * 将对象序列化到一个指定文件中。
     * 
     * @param obj
     * @param filePath
     */
    public final static void serialize(Serializable obj, String filePath) throws Exception {
        serialize(obj, new FileOutputStream(filePath));
    }

    /**
     * 将对象序列化到一个指定输出流中。
     * 
     * @param obj
     * @param output
     * @throws Exception
     */
    public final static void serialize(Serializable obj, OutputStream output) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(output);
        oos.writeObject(obj);
        oos.close();
    }

    /**
     * 将指定字节数组反序列化为一个对象。
     * 
     * @param b
     * @return
     * @throws Exception
     */
    public final static Serializable deserialize(byte[] b) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream(b);
        Serializable obj = deserialize(bais);
        bais.close();
        return obj;
    }

    /**
     * 将指定序列化文件反序列化为一个对象。
     * 
     * @param filePath
     * @return
     * @throws Exception
     */
    public final static Serializable deserialize(String filePath) throws Exception {
        return deserialize(new FileInputStream(filePath));
    }

    /**
     * 将指定序列化输入流反序列化为一个对象。
     * 
     * @param input
     * @return
     * @throws Exception
     */
    public final static Serializable deserialize(InputStream input) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(input);
        Serializable obj = (Serializable) ois.readObject();
        ois.close();
        return obj;
    }

    /**
     * 将一个Map中的key和value全部序列化,并生成一个新的Map。被序列化的Map中的key和value必须都是Serializable的。
     * 
     * @param m
     * @return
     * @throws Exception
     */
    public final static Map<byte[], byte[]> serialize(Map<?, ?> m) throws Exception {
        if (m == null || m.isEmpty()) {
            throw new NullPointerException("map is null or empty.");
        }
        Map<byte[], byte[]> newMap = new HashMap<byte[], byte[]>();
        for (Object obj : m.keySet()) {
            byte[] key = serialize((Serializable) obj);
            byte[] value = serialize((Serializable) m.get(obj));
            newMap.put(key, value);
        }
        return newMap;
    }

    /**
     * 将已序列化过内部元素的Map反序列化。
     * 
     * @param m
     * @return
     * @throws Exception
     */
    public final static Map<?, ?> deserialize(Map<byte[], byte[]> m) throws Exception {
        if (m == null || m.isEmpty()) {
            throw new NullPointerException("map is null or empty.");
        }
        Map<Object, Object> newMap = new HashMap<Object, Object>();
        for (byte[] obj : m.keySet()) {
            Object key = deserialize(obj);
            Object value = deserialize(m.get(obj));
            newMap.put(key, value);
        }
        return newMap;
    }

    /**
     * 将指定List中所有元素序列化,并生成新的List,被序列化的List中元素必须是Serializable的。
     * 
     * @param l
     * @return
     * @throws Exception
     */
    public final static List<byte[]> serialize(List<?> l) throws Exception {
        if (l == null || l.size() == 0) {
            throw new NullPointerException("list is null or empty.");
        }
        List<byte[]> newList = new ArrayList<byte[]>();
        for (Object obj : l) {
            byte[] e = serialize((Serializable) obj);
            newList.add(e);
        }
        return newList;
    }

    /**
     * 将内部元素已经序列化的List反序列化。
     * 
     * @param l
     * @return
     * @throws Exception
     */
    public final static List<?> deserialize(List<byte[]> l) throws Exception {
        if (l == null || l.size() == 0) {
            throw new NullPointerException("list is null or empty.");
        }
        List<Object> newList = new ArrayList<Object>();
        for (byte[] obj : l) {
            Object e = deserialize(obj);
            newList.add(e);
        }
        return newList;
    }

    /**
     * 将指定Set的所有元素序列化,并生成新的Set,被序列化的Set的元素必须是Serializable的。
     * 
     * @param s
     * @return
     * @throws Exception
     */
    public final static Set<byte[]> serialize(Set<?> s) throws Exception {
        if (s == null || s.size() == 0) {
            throw new NullPointerException("set is null or empty.");
        }
        Set<byte[]> newSet = new HashSet<byte[]>();
        for (Object obj : s) {
            byte[] e = serialize((Serializable) obj);
            newSet.add(e);
        }
        return newSet;
    }

    /**
     * 将内部元素已经序列化的Set反序列化。
     * 
     * @param s
     * @return
     * @throws Exception
     */
    public final static Set<?> deserialize(Set<byte[]> s) throws Exception {
        if (s == null || s.size() == 0) {
            throw new NullPointerException("set is null or empty.");
        }
        Set<Object> newSet = new HashSet<Object>();
        for (byte[] obj : s) {
            Object e = deserialize(obj);
            newSet.add(e);
        }
        return newSet;
    }

2012年9月06日 11:55
0 0

先将对象序列化为字节数组,再用BASE64编码为字符串;
反序列化时,先用BASE64解码为字节数组;
序列化过程中还可以做压缩,以缩短最终的窜长度。

public static <T extends Serializable> byte[] serialize(
			T obj, boolean compressed) throws IOException {
		ByteArrayOutputStream buf = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		try {
			if (compressed)
				oos = new ObjectOutputStream(new GZIPOutputStream(buf));
			else
				oos = new ObjectOutputStream(buf);
			oos.writeObject(obj);
			oos.flush();
		} finally {
			if (oos != null)
				oos.close();
		}
		return buf.toByteArray();
	}
	
	public static <T extends Serializable> T deserialize(byte[] data,
			boolean compressed) throws IOException, ClassNotFoundException {
		ByteArrayInputStream in = new ByteArrayInputStream(data);
		ObjectInputStream ois = null;
		try {
			if (compressed)
				ois = new ObjectInputStream(new GZIPInputStream(in));
			else
				ois = new ObjectInputStream(in);
			return (T) ois.readObject();
		} finally {
			IOUtils.close(ois);
		}
	}

2012年9月06日 11:35
0 0

建议的做法是先将对象序列化,然后保存到memcached中,读出来以后再反序列化。

2012年9月06日 09:46

相关推荐

    memcache实现java客户端

    因此,需要使用序列化技术(如JSON或Java序列化)将对象转换为字节流,再存储到Memcache。反之,读取时反序列化回原对象。 10. **最佳实践**:为了提高效率,应尽可能使用短生命周期的缓存,并确保数据的及时更新。...

    Java开发中的Memcache原理及实现

    Memcached是一款高性能、分布式内存对象缓存系统,用于减轻数据库负载,提高网站或应用程序的响应速度。在Java环境中,我们可以借助各种客户端库来与Memcached进行交互。下面将详细介绍Memcached的工作原理以及在...

    memcache学习文档 for java demo

    Memcache 学习文档 for Java Demo Memcache 是一套分布式的高速缓存系统,由 LiveJournal 的 Brad Fitzpatrick 开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站...

    memCache源码java客户端

    **memCache源码分析——Java客户端** memCache是一款高性能、分布式的内存对象缓存系统,常用于减轻数据库的负载,提升应用性能。它的主要特点是基于内存存储,操作速度快,无持久化机制,适用于缓存非关键数据。在...

    java memcache使用例子

    本篇文章将围绕"Java Memcache使用例子"这一主题,详细介绍如何在Java中使用Memcached。 首先,确保您已经在本地正确安装了Memcached。通常,Memcached可以在Linux、macOS和Windows等操作系统上运行。你可以通过...

    java版memcache缓存管理与开发

    例如,在以用户为中心的网站中,可以按照用户ID的前缀来决定数据存储在哪一台Memcache服务器上,如1开头的用户数据保存在第一台服务器上,2开头的用户数据保存在第二台上,以此类推。这种策略有助于均衡负载并提升...

    memcache也spring,hibernate的配置

    标题中的“memcache也spring,hibernate的配置”指的是如何在Java开发环境中,结合Memcached缓存系统、Spring框架和Hibernate持久化框架进行集成配置。Memcached是一种高性能的分布式内存对象缓存系统,用于加速动态...

    MemCache对象缓存应用

    **标题:“MemCache对象缓存应用”** **一、MemCache简介** MemCache是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高应用程序的性能。它通过将数据存储在内存中,实现快速...

    Java Memcache JDK1.4

    使用这个库时,开发者可以将常用的数据对象存储在Memcache中,以减少数据库的访问,从而提升应用性能。 `一对多查询.rar` 文件可能包含了一个示例或者教程,解释如何处理Java Memcache中的复杂查询,尤其是涉及到多...

    java实现memcache服务器的示例代码

    Memcache 是一个高性能的分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的 hash 表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后...

    CentOS 安装 Memcache 服务器. java 做客户端.

    在IT领域,Memcache是一种广泛使用的高性能分布式内存对象缓存系统,它能够减轻数据库的负担,提高网站或应用的响应速度。本主题将探讨如何在CentOS操作系统上安装Memcache服务器,并利用Java作为客户端与之交互。...

    java的memcache的服务器以及引用jar包河测试案例

    Java中的Memcached是一种高效、分布式的内存对象缓存系统,常用于减轻数据库的负载,提高应用程序的性能。Memcached在Web应用中广泛使用,能够存储临时数据,减少对数据库的直接访问,从而加快响应速度。 首先,让...

    memcache学习资料(包含memcache和java_memcache相应的jar)

    **Memcached**是一种高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用于减轻数据库的负载,通过将数据存储在内存中,快速响应用户的请求。Memcached使用键值对存储数据,支持多语言接口,包括Java。 **...

    memcache与redis的比较

    Redis有多种数据类型,每种数据类型都有其特定的应用场景:String类型可以用于存储字符串,Hash类型可以用于存储对象,List类型可以用于存储列表等。memcache的简单key-value存储限制了它的应用场景。 数据操作 ...

    JAVA的memcache服务器安装以及相关最新jar包

    "JAVA的memcache服务器安装以及相关最新jar包" 这个标题指出我们要探讨的是在Java环境中如何安装并使用Memcached服务器,同时提到了与Java接口相关的最新jar包。Memcached是一个高性能、分布式内存对象缓存系统,常...

    Java开发中的Memcache原理及实现(带书签)

    Memcache,全称Memcached,是一个高性能的分布式内存对象缓存系统,它最初是为LiveJournal网站设计的,目的是为了减轻数据库服务器的负担。Memcache可以应用于任何需要缓存的场景,比如网页服务器或应用程序服务器等...

    java memcache 使用

    总结,Java中使用Memcached主要涉及选择合适的客户端库,配置连接,以及利用提供的API进行数据的存储、检索和删除操作。通过深入研究源码和使用辅助工具,可以更好地理解和优化Memcached在项目中的应用。

    【汇总】Memcache

    Memcache 是一个高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于缓解数据库的负载压力。它通过将数据存储在内存中,以便快速访问,从而提高应用程序的响应速度。在本文中,我们将深入探讨Memcache的...

    memcache Java

    Memcache是一个高性能、分布式内存对象缓存系统,用于减少数据库负载,提高应用程序的性能。在Java中,我们可以使用第三方库来实现对Memcache的访问。 首先,要理解Memcache的工作原理。它通过将数据存储在内存中来...

Global site tag (gtag.js) - Google Analytics