Redis存储Object 和 list<object>

Redis 存储支持的类型没有object ,虽然有支持list,但是只支持List<String>

有两种方法可以实现存储对象和泛型

1.用序列化和反序列化

2.json

序列化工具类,实现序列化和反序列话对象和list集合

package com;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * 序列化工具类
 * @author caspar
 *
 */
public class SerializeUtil {

	/**
	 * 序列化
	 * @param object
	 * @return
	 */
	public static byte[] serialize(Object object) {
		if (object == null) {
			return null;
		}
		ObjectOutputStream oos = null;
		ByteArrayOutputStream baos = null;
		byte[] bytes = null;
		try {
			// 序列化
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			oos.writeObject(object);
			bytes = baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(oos);
			close(baos);
		}
		return bytes;
	}

	/**
	 * 反序列化
	 *
	 * @param bytes
	 * @return
	 */
	public static Object unserialize(byte[] bytes) {
		if (bytes == null) {
			return null;
		}
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			// 反序列化
			bais = new ByteArrayInputStream(bytes);
			ois = new ObjectInputStream(bais);
			return ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(bais);
			close(ois);
		}
		return null;
	}

	/**
	 * 序列化 list 集合
	 *
	 * @param list
	 * @return
	 */
	public static byte[] serializeList(List<?> list) {

		if (CommonUtil.isEmptyList(list)) {
			return null;
		}
		ObjectOutputStream oos = null;
		ByteArrayOutputStream baos = null;
		byte[] bytes = null;
		try {
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			for (Object obj : list) {
				oos.writeObject(obj);
			}
			bytes = baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(oos);
			close(baos);
		}
		return bytes;
	}

	/**
	 * 反序列化 list 集合
	 *
	 * @param lb
	 * @return
	 */
	public static List<?> unserializeList(byte[] bytes) {
		if (bytes == null) {
			return null;
		}

		List<Object> list = new ArrayList<Object>();
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			// 反序列化
			bais = new ByteArrayInputStream(bytes);
			ois = new ObjectInputStream(bais);
			while (bais.available() > 0) {
				Object obj = (Object) ois.readObject();
				if (obj == null) {
					break;
				}
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(bais);
			close(ois);
		}
		return list;
	}

	/**
	 * 关闭io流对象
	 *
	 * @param closeable
	 */
	public static void close(Closeable closeable) {
		if (closeable != null) {
			try {
				closeable.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

redis工具类的部分方法,实现设置/获取对象和泛型值

 /**
     * 设置对象
     * @param key
     * @param obj
     */
    public static void setObject(String key ,Object obj){
    	try {
    		obj = obj == null ? new Object():obj;
    		getJedis().set(key.getBytes(), SerializeUtil.serialize(obj));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

    /**
     * 获取对象
     * @param key
     * @return Object
     */
	public static Object getObject(String key){
		if(getJedis() == null || !getJedis().exists(key)){
			return null;
		}
		byte[] data = getJedis().get(key.getBytes());
		return (Object)SerializeUtil.unserialize(data);
	}

	/**
     * 设置List集合
     * @param key
     * @param list
     */
    public static void setList(String key ,List<?> list){
    	try {

    		if(CommonUtil.isNotEmptyList(list)){
    			getJedis().set(key.getBytes(), SerializeUtil.serializeList(list));
    		}else{//如果list为空,则设置一个空
    			getJedis().set(key.getBytes(), "".getBytes());
    		}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

    /**
     * 获取List集合
     * @param key
     * @return
     */
	public static List<?> getList(String key){
		if(getJedis() == null || !getJedis().exists(key)){
			return null;
		}
		byte[] data = getJedis().get(key.getBytes());
		return SerializeUtil.unserializeList(data);
	}

测试main方法

public static void main(String[] args) {
    	//object
    	setObject("100",new Person("caspar",25));

    	Person p = (Person)getObject("100");
    	System.out.println(p.getName()+"----"+p.getAge());

    	//list
    	List<Person> list = new ArrayList<Person>();
    	list.add(new Person("唐马儒",39));
    	list.add(new Person("大便熊",33));
    	list.add(new Person("小萝莉",14));

    	setList("list001", list);
    	List<Person> resultList = (List<Person>) getList("list001");
    	for (Person person : resultList) {
			System.out.println(person.getName()+"----"+person.getAge());
		}
	}

输出结果

caspar----25

唐马儒----39

大便熊----33

小萝莉----14

正常情况下效率也挺高,但是如果再高并发的情况下,序列化和反序列化消耗太多,redis不支持存储object和泛型,是有理由的。

建议使用json来存储

把object和list<?> 转成json的字符串格式再set到redis里面,取得时候再把json转换为需要的对象,这样简单快捷,推荐使用

时间: 2024-10-04 17:04:04

Redis存储Object 和 list<object>的相关文章

Redis 存储图片 [base64/url/path]vs[object]

一.base64图片编解码 基本流程:从网络获取下载一张图片,然后base64编码,再base64解码,存到本地E盘根目录下. import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLE

redis存储对象与对象序列化详解

redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis存储对象序列化和反序列化 首先来了解一下为什么要实现序列化 为什么要实现序列化接口 当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以. 把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象.甚至可以将该

[转] Redis 存储List对象

如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现: 1.      分别序列化 elements ,然后 set 存储 2.    序列化List对象,set存储 这两种方法都类似MC的 Object方法存储,运用这种方式意味着放弃Redis对List提供的操作方法. import net.spy.memcached.compat.CloseUtil; import net.spy.mem

Object obj=new Object()的内存引用

Object obj=new Object(); 一句很简单的代码,但是这里却设计Java栈,Java堆,java方法去三个最重要的内存区域之间的关联. 假设这句代码出现在方法体中. 1.Object obj将反映到Java栈的本地变量表,这是一个本地变量的定义.是一个引用类型. 2.new Object()将会反映在Java堆中.存储了Object类型的所有实例数据值(次内存是不固定大小的,因为谁也无法确定这是对象的大小). 3.程序运行,类型信息已经加载到内存里,这些数据就在Java方法区中

Redis 存储字符串和对象

1 测试类 import redis.clients.RedisClinet; import redis.clients.SerializeUtil; import redis.clients.jedis.Jedis; public class Test { /** * Administrator * @param args */ public static void main(String[] args) { // 操作单独的文本串 Jedis redis= new Jedis( "10.2.

【JS】☆★之详解[Object HTMLDivElement]和[Object Object]

[JS]☆★之详解[Object HTMLDivElement]和[Object Object] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

webmagic自定义存储(mysql、redis存储)

在很多时候,我们使用webmagic爬取网站的时候,爬取的数据希望存储在mysql.redis中.因此需要对其扩展,实行自定义PipeLine.首先我们了解一下webmagic 的四个基本组件 一. WebMagic的四个组件 1.Downloader Downloader负责从互联网上下载页面,以便后续处理.WebMagic默认使用了HttpClient作为下载工具. 2.PageProcessor PageProcessor负责解析页面,抽取有用信息,以及发现新的链接.WebMagic使用J

Redis存储Session

net Core 使用Redis存储Session 前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一,很多人直接说不要用,也有很多人在用,这个也没有绝对的这义,个人认为只要不影什么且又可以方便实现的东西是可以用的,现在不对可不可用做表态,我们只关心实现. 类库引用 这个相对于之前的.net是方便了不少,需要在project.json中的depend

遍历对象属性(for in、Object.keys、Object.getOwnProperty)

js中几种遍历对象的方法,包括for in.Object.keys.Object.getOwnProperty,它们在使用场景方面各有不同. for in 主要用于遍历对象的可枚举属性,包括自有属性.继承自原型的属性 var obj = {"name":"Poly", "career":"it"} Object.defineProperty(obj, "age", {value:"forever