Redis 儲存圖片 [base64/url/path]vs[object],

來源:互聯網
上載者:User

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.MalformedURLException;import java.net.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("http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/9.jpg");        } 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 java.io.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();        this.id = id;        this.name = name;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
package RedisObject;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;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中來儲存圖片:
  

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.