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.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; } } }
PS:Redsi中儲存list沒有封裝對Object的API,是不是也是傾向於只儲存用到的欄位,而不是儲存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
redis的list儲存物件實現
redis用了很久,對五種資料結構的使用很熟悉,但是缺乏對實現的認知。所以趁有時間,仔細學習和梳理了下。List型別的value物件內部是以linkedlist和ziplist承載。當List的元素個數和單個元素的長度較小時,redis會使用ziplist儲存,減少記憶體的佔
Redis中List儲存型別
在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
redis中list模擬案例-消息隊列
成功 inf use amp aos 數據 rep ces 是否 redis 數據類型:字符串string、list、set、zset、hash 主要的是list消息隊列 消息隊列的概念:先進先出 <?php//echo phpinfo();ini_set(‘disp