1. 程式人生 > >Redis 儲存List物件

Redis 儲存List物件


      如果需要用到Redis儲存List物件,而list又不需要進行操作,可以按照MC的方式進行儲存,不過Jedis之類的客戶端沒有提供API,可以有兩種思路實現:

1.      分別序列化 elements ,然後 set 儲存

2.   序列化List物件,set儲存

這兩種方法都類似MC Object方法儲存,運用這種方式意味著放棄RedisList提供的操作方法。

import net.spy.memcached.compat.CloseUtil;
import net.spy.memcached.compat.log.Logger;
import net.spy.memcached.compat.log.LoggerFactory;
import redis.clients.jedis.Client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Created by IntelliJ IDEA.
 * User: lifeng.xu
 * Date: 12-6-11
 * Time: 上午11:10
 * To change this template use File | Settings | File Templates.
 */
public class JedisTest {

    private static Logger logger = LoggerFactory.getLogger(JedisTest.class);

    /**
     * Jedis Pool for Jedis Resource
     * @return
     */
    public static JedisPool buildJedisPool(){
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxActive(1);
        config.setMinIdle(50);
        config.setMaxIdle(3000);
        config.setMaxWait(5000);
        JedisPool jedisPool = new JedisPool(config,
                "*****", ****);
        return jedisPool;
    }

    /**
     * Test Data
     * @return
     */
    public static List<User> buildTestData(){
        User a = new User();
        a.setName("a");
        User b = new User();
        b.setName("b");
        List<User> list = new ArrayList<User>();
        list.add(a);
        list.add(b);
        return list;
    }

    /**
     * Test for
     */
    public static void testSetElements(){
        List<User> testData = buildTestData();
        Jedis jedis = buildJedisPool().getResource();
        String key = "testSetElements" + new Random(1000).nextInt();
        jedis.set(key.getBytes(), ObjectsTranscoder.serialize(testData));

        //驗證
        byte[] in = jedis.get(key.getBytes());
        List<User> list = ObjectsTranscoder.deserialize(in);
        for(User user : list){
            System.out.println("testSetElements user name is:" + user.getName());
        }
    }

    public static void testSetEnsemble(){
        List<User> testData = buildTestData();
        Jedis jedis = buildJedisPool().getResource();
        String key = "testSetEnsemble" + new Random(1000).nextInt();
        jedis.set(key.getBytes(), ListTranscoder.serialize(testData));

        //驗證
        byte[] in = jedis.get(key.getBytes());
        List<User> list = (List<User>)ListTranscoder.deserialize(in);
        for(User user : list){
            System.out.println("testSetEnsemble user name is:" + user.getName());
        }
    }

    public static void main(String[] args) {
        testSetElements();
        testSetEnsemble();
    }

    public static void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (Exception e) {
                logger.info("Unable to close %s", closeable, e);
            }
        }
    }

    static class User implements Serializable{
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    static class ObjectsTranscoder{
        
        public static byte[] serialize(List<User> value) {
            if (value == null) {
                throw new NullPointerException("Can't serialize null");
            }
            byte[] rv=null;
            ByteArrayOutputStream bos = null;
            ObjectOutputStream os = null;
            try {
                bos = new ByteArrayOutputStream();
                os = new ObjectOutputStream(bos);
                for(User user : value){
                    os.writeObject(user);
                }
                os.writeObject(null);
                os.close();
                bos.close();
                rv = bos.toByteArray();
            } catch (IOException e) {
                throw new IllegalArgumentException("Non-serializable object", e);
            } finally {
                close(os);
                close(bos);
            }
            return rv;
        }

        public static List<User> deserialize(byte[] in) {
            List<User> list = new ArrayList<User>();
            ByteArrayInputStream bis = null;
            ObjectInputStream is = null;
            try {
                if(in != null) {
                    bis=new ByteArrayInputStream(in);
                    is=new ObjectInputStream(bis);
                    while (true) {
                        User user = (User) is.readObject();
                        if(user == null){
                            break;
                        }else{
                            list.add(user);
                        }
                    }
                    is.close();
                    bis.close();
                }
            } catch (IOException e) {
                logger.warn("Caught IOException decoding %d bytes of data",
                        in == null ? 0 : in.length, e);
            } catch (ClassNotFoundException e) {
                logger.warn("Caught CNFE decoding %d bytes of data",
                        in == null ? 0 : in.length, e);
            } finally {
                CloseUtil.close(is);
                CloseUtil.close(bis);
            }
            return list;
        }
    }
    
    static class ListTranscoder{
        public static byte[] serialize(Object value) {
            if (value == null) {
                throw new NullPointerException("Can't serialize null");
            }
            byte[] rv=null;
            ByteArrayOutputStream bos = null;
            ObjectOutputStream os = null;
            try {
                bos = new ByteArrayOutputStream();
                os = new ObjectOutputStream(bos);
                os.writeObject(value);
                os.close();
                bos.close();
                rv = bos.toByteArray();
            } catch (IOException e) {
                throw new IllegalArgumentException("Non-serializable object", e);
            } finally {
                close(os);
                close(bos);
            }
            return rv;
        }

        public static Object deserialize(byte[] in) {
            Object rv=null;
            ByteArrayInputStream bis = null;
            ObjectInputStream is = null;
            try {
                if(in != null) {
                    bis=new ByteArrayInputStream(in);
                    is=new ObjectInputStream(bis);
                    rv=is.readObject();
                    is.close();
                    bis.close();
                }
            } catch (IOException e) {
                logger.warn("Caught IOException decoding %d bytes of data",
                        in == null ? 0 : in.length, e);
            } catch (ClassNotFoundException e) {
                logger.warn("Caught CNFE decoding %d bytes of data",
                        in == null ? 0 : in.length, e);
            } finally {
                CloseUtil.close(is);
                CloseUtil.close(bis);
            }
            return rv;
        }
    }
}

PSRedsi中儲存list沒有封裝對ObjectAPI,是不是也是傾向於只儲存用到的欄位,而不是儲存Object本身呢?Redis是一個In-Mem的產品,會覺得我們應用的方式。




相關推薦

Redis 儲存List物件

      如果需要用到Redis儲存List物件,而list又不需要進行操作,可以按照MC的方式進行儲存,不過Jedis之類的客戶端沒有提供API,可以有兩種思路實現: 1.      分別序列化 elements ,然後 set 儲存 2.   序列化List物件,s

SpringCloud工作筆記070---SpringCloud中使用Redis儲存List型別資料

    JAVA技術交流QQ群:170933152   看看這邊封裝的redis的工具類: src\main\java\cn\gov\majorproj\scadmin\util\CacheUtils.java 注意,就是用

如何使用Redis儲存Java物件

前言 最近幾天有同事在開發跑合微信版的過程中碰到了一個問題。由於微信端需要通過H5的入口進行賬號的繫結,同時需要在會話過期之前定時輪詢保持會話有效。這個時候需要在系統中儲存微信的ApiConfig物件。 由於這部分的開發之前一直是由外包公司在做,他們給出的解決方案就是使用Ecache來將

Redis儲存List

這兩天做排行榜的快取,在對List容器進行序列化時,報reditTemplate未被定義的錯誤.查了一些資料大致瞭解了Springboot中使用redis的一些之前沒用到過得內容. 首先Strin

使用redis儲存Java物件

在Jedis開發中,我們很多時候希望直接把一個物件放到Redis中,然後在需要的時候取出來。Redis的key和value都支援二進位制安全的字串,儲存Java物件不是問題,下面我們看一下如何來實現。 1要儲存的物件 現在寫一個很土的Java Bean,包含兩個欄位,id和

redis儲存list工具類

package com.syzton.sunread.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Closeable; imp

Redis存取List物件的實踐

package redis; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Ra

redislist儲存物件實現

redis用了很久,對五種資料結構的使用很熟悉,但是缺乏對實現的認知。所以趁有時間,仔細學習和梳理了下。List型別的value物件內部是以linkedlist和ziplist承載。當List的元素個數和單個元素的長度較小時,redis會使用ziplist儲存,減少記憶體的佔

RedisList儲存型別

在Redis中,List型別是按照插入的順序排序的字串連結串列。和資料結構中的普通連結串列一樣,可以在其頭部(left)和尾部(right)新增新的元素。在插入元素時,如果該鍵不存在,Redis將為該鍵建立一個新的連結串列。如果連結串列中所有的元素均被移除,那麼該鍵也會從資料庫中刪除。 從元素的插入

redis儲存物件和值

redis主要儲存型別最常用的五種資料型別: String Hash List Set Sorted set redis儲存物件序列化和反序列化 首先來了解一下為什麼要實現序列化 實現序列化介面的原因    當一個類實現了Serializabl

Redis儲存結構之列表(List

訊息佇列  Redis列表只是字串列表,按插入順序排序。您可以向Redis列表的頭部或尾部新增元素。  常用的方法有:lpush、rpush、lpop、rpop、blpop、brpop、lrange BLPOP BRPOP BRPOPLPUSH LINDEX LINSE

Redis 存取 java 物件,用 hash 雜湊命令儲存物件的各個屬性和採用 String 字串命令儲存序列化後的物件之開銷對比

轉自:http://www.jfinal.com/share/460 用一個簡單的User物件做試驗,共有4個屬性,型別分別為整型,整型,字串,字串。 測試程式碼 public class TestRedis { private static final Cache testCach

redis 儲存自定義java物件有幾種方式

最近去面試,碰到面試官提問,如果要把一個自定義的java物件儲存到redis中,除了一般使用json和序列化之外,還有一種,可以配置redis的配置檔案,操作hash型別,直接使用HGETALL (或

java兩個list儲存bean物件,找出其中某一屬性不同的元素

在java中運用List集合儲存物件,如果想找到兩個list中不同的部分,可以用ArrayList的contains方法,遍歷每一個物件,判斷是否是相等的,如下: public stati

Redis | 使用redis儲存物件反序列化異常SerializationFailedException

案例 使用Redis進行物件儲存,在處理業務邏輯的時候,叢Redis獲取物件發現反序列化失敗,丟擲如下異常: Caused by: org.springframework.data.redis.serializer.SerializationExcept

redis儲存物件兩種方式對比

redis儲存物件結構的兩種方式使用redis string結構儲存物件序列化後的資料使用redis hash結構儲存物件,field為欄位名稱測試例子還是大家喜歡的使用者資訊public class

redis 儲存陣列和物件

首先要使用redis必須要安裝redis並開啟 將jedis-2.9.0.jar包加入專案 這是一個最簡單的redis插入和讀取 // 連線本地的 Redis 服務 Jedis jedis = new Jedis("localhost");System.out.print

Redis 儲存物件

/** * 根據userId查詢userName * * @param request * @param userId * @return */ @RequestMapping("/findUserNameByUserId") public St

java鬼混筆記:springboot之redis儲存物件

首先加入springboot-redis依賴:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-da

redislist模擬案例-消息隊列

成功 inf use amp aos 數據 rep ces 是否 redis 數據類型:字符串string、list、set、zset、hash 主要的是list消息隊列 消息隊列的概念:先進先出 <?php//echo phpinfo();ini_set(‘disp