ItGo.me - 专注IT技术分享

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

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

时间:2016-08-28来源:网友分享 点击:

一、base64图片编解码

  基本流程:从网络获取下载一张图片,然后base64编码,再base64解码,存到本地E盘根目录下。
  
  

import java.awt.image.BufferedImage;import .ByteArrayOutputStream;import .File;import .FileOutputStream;import .IOException;import .MalformedURLException;import .URL;import javax.imageio.ImageIO;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;@SuppressWarnings("restriction")public class Base64ImageUtils {/*** 将网络图片进行Base64位编码** @param imageUrl*            图片的url路径,如http://.....xx.jpg* @return*/public static String encodeImgageToBase64(URL imageUrl) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理ByteArrayOutputStream outputStream = null;try {BufferedImage bufferedImage = ImageIO.read(imageUrl);outputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "jpg", outputStream);} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串}/*** 将本地图片进行Base64位编码** @param imageFile*            图片的url路径,如F:/.....xx.jpg* @return*/public static String encodeImgageToBase64(File imageFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理ByteArrayOutputStream outputStream = null;try {BufferedImage bufferedImage = ImageIO.read(imageFile);outputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "jpg", outputStream);} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串}/*** 将Base64位编码的图片进行解码,并保存到指定目录** @param base64*            base64编码的图片信息* @return*/public static void decodeBase64ToImage(String base64, String path,String imgName) {BASE64Decoder decoder = new BASE64Decoder();try {FileOutputStream write = new FileOutputStream(new File(path+ imgName));byte[] decoderBytes = decoder.decodeBuffer(base64);write.write(decoderBytes);write.close();} catch (IOException e) {e.printStackTrace();}}public static void main(String [] args){URL url = null;try {url = new URL("");} catch (MalformedURLException e) {e.printStackTrace();}String encoderStr = Base64ImageUtils.encodeImgageToBase64(url);System.out.println(encoderStr);Base64ImageUtils.decodeBase64ToImage(encoderStr, "E:/", "football.jpg");}}

控制台输出的base64编码后的结果:

查看E盘根目录:


二、Redis对象object存储

  Redis存储对象数据的时候,要进行对象的序列化与反序列化操作。
  

package RedisObject;import .Serializable;public class Person implements Serializable {private static final long serialVersionUID = 1L;private int id;private String name;public Person() {}public Person(int id, String name) {super();= id;this.name = name;}public int getId() {return id;}public void setId(int id) {= id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
package RedisObject;import .ByteArrayInputStream;import .ByteArrayOutputStream;import .ObjectInputStream;import .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中来存储图片:
  

  1. 图片转化成String字符串
    (1)我们可以在Redis存储图片的base64编码或者解码,以KV格式,K为普通字符串,V为图片的base64编码,get(K)后再base64解码就可以了;
    (2)我们也可以在Redis中存储图片的网络url或者本地的path路径,具体实现可以使图片本身存储到磁盘中,然后在Redis中以图片的网络url或者本地的path路径为value(V)值存储。
  2. 图片转化成object对象
    直接在Redis中存储图片对象,使用Java的序列化/反序列化机制进行处理实现。

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

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


CentOS下的Redis启动脚本

这是一个Shell脚本,用于管理Redis进程(启动,停止,重启),如果你在使用Redis,这个脚本可供参考。标签: 代码片段 (1) 1. [代码] [Shell/批处理]代码 跳至 #!/bin/sh## redis - this script starts and sto...

ledisdb: 用go实现,类似redis的高性能nosql数据库

ledisdb是一个参考ssdb,采用go实现,底层基于leveldb,类似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持。 详细介绍 代码地址标签: 代码片段 (1) 1. [代码] ledisdb使用 跳至...

Windows下Redis的安装使用

0.前言 因为是初次使用,所以是在windows下进行安装和使用,参考了几篇博客,下面整理一下 1.安装Redis 官方网站: 官方下载:可以根据需要下载不同版本 windows版: github的资源可以ZIP直接下载...

一、base64图片编解码 基本流程:从网络获取下载一张图片,然后base64编码,再base64解码,存到本地E盘根目录下。 import java.awt.image.BufferedImage;import .ByteArrayOutputStream;import .File;import .FileOutputStr
------分隔线----------------------------