redis属于非关系型数据库,通过键值对保存数据,不适合做频繁的更新数据,它可以解决高并发和大量数据访问。
redis是可基于内存的非关系型数据库,同时也可以将数据持久化到磁盘,支持数据库集群+读写分离+主从同步。
redis可存储五种类型数据:String、List、Set、SortedSet、Hash。
redis对是数据的存储只接受byte[]和String,如果保存数据到redis,就必须把对象转换成这两种类型,通常数据量小的情况下选择数组,采用数组节点流+对象流;数据量大的情况下使用json字符串。
我体现的是原生的存储过程
1.数组
1.1创建项目,依赖jedis和Junit
1.2创建实体类
1.3创建工具类BinaryUtils 封装序列化+反序列化方法
public class ByteOfObject {
//对象转换成数组的方法
public static byte[] objToBuf(Object obj){
byte[] value=null;
try {
//创建数组流
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//创建对象输出流
ObjectOutputStream oos = new ObjectOutputStream(bos);
//将对象写入
oos.writeObject(obj);
//获取装着对象的数组
value= bos.toByteArray();
//刷到数组里
oos.flush();
//关闭
oos.close();
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return value;
}
//反序列化方法
public static <T> T BufToObj(byte[] buf,Class<T> type){
T readObject=null;
//反序列化
try {
ByteArrayInputStream bis=new ByteArrayInputStream(buf);
ObjectInputStream oos = new ObjectInputStream(bis);
readObject =(T) oos.readObject();
oos.close();
bis.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return readObject;
}
}
1.4测试
public class Test01 {
@Test
public void testHash(){
Jedis j = new Jedis("192.168.242.98",6379);
j.auth("123456");
//选择库
j.select(3);
Product product = new Product(10, "方便面", "10");
//指定Key
byte[] key=product.getId().toString().getBytes();
//指定值
byte[] value=null;
//序列化返回的数组
value = ByteOfObject.objToBuf(product);
//保存
j.set(key, value);
//key对应的值
byte[] bs = j.get(key);
/*System.out.println(Arrays.toString(bs));*/
//反序列化
Product bufToObj = ByteOfObject.BufToObj(value, Product.class);
System.out.println(bufToObj);
}
}