小编给大家分享一下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;
public class JedisTest {
private static Logger logger = LoggerFactory.getLogger(JedisTest.class);
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;
}
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;
}
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存储对象的方法的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!