设为首页 收藏本站
查看: 1102|回复: 0

[经验分享] Redis 存储List对象

[复制链接]

尚未签到

发表于 2015-11-12 13:21:16 | 显示全部楼层 |阅读模式
  

      如果需要用到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(&quot;a&quot;);
User b = new User();
b.setName(&quot;b&quot;);
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 = &quot;testSetElements&quot; + 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(&quot;testSetElements user name is:&quot; + user.getName());
}
}
public static void testSetEnsemble(){
List<User> testData = buildTestData();
Jedis jedis = buildJedisPool().getResource();
String key = &quot;testSetEnsemble&quot; + 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(&quot;testSetEnsemble user name is:&quot; + 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(&quot;Unable to close %s&quot;, 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(&quot;Can't serialize null&quot;);
}
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(&quot;Non-serializable object&quot;, 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(&quot;Caught IOException decoding %d bytes of data&quot;,
in == null ? 0 : in.length, e);
} catch (ClassNotFoundException e) {
logger.warn(&quot;Caught CNFE decoding %d bytes of data&quot;,
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(&quot;Can't serialize null&quot;);
}
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(&quot;Non-serializable object&quot;, 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(&quot;Caught IOException decoding %d bytes of data&quot;,
in == null ? 0 : in.length, e);
} catch (ClassNotFoundException e) {
logger.warn(&quot;Caught CNFE decoding %d bytes of data&quot;,
in == null ? 0 : in.length, e);
} finally {
CloseUtil.close(is);
CloseUtil.close(bis);
}
return rv;
}
}
}

  
  
  PSRedsi中存储list没有封装对ObjectAPI,是不是也是倾向于只存储用到的字段,而不是存储Object本身呢?Redis是一个In-Mem的产品,会觉得我们应用的方式。


  







版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138353-1-1.html 上篇帖子: REDIS 学习网页记录 下篇帖子: Java Redis Jedis--学习笔记代码片断--序列化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表