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

2015-07-24 09:23:37 · 作者: · 浏览: 4
yOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeUtil { /** * 序列化 * * @param object * @return */ public static byte[] serialize(Object object) { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray(); return bytes; } catch (Exception e) { } return null; } /** * 反序列化 * * @param bytes * @return */ public static Object unserialize(byte[] bytes) { ByteArrayInputStream bais = null; try { bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { } return null; } }
package RedisObject; import redis.clients.jedis.Jedis; public class PersonRedisTest { private static Jedis jedis = null; /** * 初始化Jedis对象 * * @throws Exception */ public PersonRedisTest() { jedis = new Jedis("127.0.0.1", 6379); } /** * 序列化写对象, 将Person对象写入Redis中 * */ public void setObject() { jedis.set("person:100".getBytes(), SerializeUtil.serialize(new Person(100, "zhangsan"))); jedis.set("person:101".getBytes(), SerializeUtil.serialize(new Person(101, "bruce"))); } /** * 反序列化取对象, 用Jedis获取对象 * */ public void getObject() { byte[] data100 = jedis.get(("person:100").getBytes()); Person person100 = (Person) SerializeUtil.unserialize(data100); System.out.println(String.format("person:100->id=%s,name=%s", person100.getId(), person100.getName())); byte[] data101 = jedis.get(("person:101").getBytes()); Person person101 = (Person) SerializeUtil.unserialize(data101); System.out.println(String.format("person:101->id=%s,name=%s", person101.getId(), person101.getName())); } public static void main(String[] args) { PersonRedisTest rt = new PersonRedisTest(); rt.setObject(); rt.getObject(); } } 

运行main函数结果:
这里写图片描述

查看Redis存储的数据:
这里写图片描述

三、Redis存储图片

  在《Redis入门指南》一书的P22(第22页)中,有这么一段话:
  “字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。”
  Redis 是一个数据结构类型的服务器,不是单纯的 key-value 存储。 Redis 里面的键是二进制安全的(二进制安全是指数据在传输过程中保证数据的安全性,包括加密等),因此键的内容不应该包含空格或者换行符。比如 ”hello world” 和 ”hello world\n” 是错误的。
  那么怎么在Redis中存储图片呢?说白了,图片就是一组二进制数据,直接存储二进制数据肯定是不行的,要实现Redis存储二进制数据,那么就得事先实行转化。
  在一、二中已经写了图片base64编解码和redis存储对象的过程。那么我们就可以这样子在Redis中来存储图片:
  

图片转化成String字符串
(1)我们可以在Redis存储图片的base64编码或者解码,以KV格式,K为普通字符串,V为图片的base64编码,get(K)后再base64解码就可以了;
(2)我们也可以在Redis中存储图片的网络url或者本地的path路径,具体实现可以使图片本身存储到磁盘中,然后在Redis中以图片的网络url或者本地的path路径为value(V)值存储。

图片转化成object对象
直接在Redis中存储图片对象,使用Java的序列化/反序列化机制进行处理实现。