如果需要用到redis存儲(chǔ)List對(duì)象,而list又不需要進(jìn)行操作,可以按照MC的方式進(jìn)行存儲(chǔ),不過(guò)Jedis之類(lèi)的客戶(hù)端沒(méi)有提供API,可以有兩種思路實(shí)現(xiàn):
1.? ??分別序列化?elements ,然后?set?存儲(chǔ)
2.????序列化List對(duì)象,set存儲(chǔ)
這兩種方法都類(lèi)似MC的?Object方法存儲(chǔ),運(yùn)用這種方式意味著放棄Redis對(duì)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)); ????????//驗(yàn)證 ????????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)); ????????//驗(yàn)證 ????????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; ????????} ????} }</user></user></user></user></user></user></user></user></user></user></user></user>
PS:Redsi中存儲(chǔ)list沒(méi)有封裝對(duì)Object的API,是不是也是傾向于只存儲(chǔ)用到的字段,而不是存儲(chǔ)Object本身呢?Redis是一個(gè)In-Mem的產(chǎn)品,會(huì)覺(jué)得我們應(yīng)用的方式。
更多Redis相關(guān)技術(shù)文章,請(qǐng)?jiān)L問(wèn)Redis教程欄目進(jìn)行學(xué)習(xí)!
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END