Redis保存对象的两种方式

Redis保存对象的两种方式

一、序列化(实体需要实现Serializable接口)

  • 序列化就是将一个对象转换为二进制的数据流。这样就可以进行传输,或者保存到文件中。如果一个类的对象要想实现序列化,就必须实现serializable接口。 在此接口中没有任何的方法,此接口只是作为一个标识,表示本类的对象具备了序列化的能力而已。
  • 反序列化:将二进制数据流转换成相应的对象

主要代码如下:

//保存对象(list一样)
Company company1 = new Company();
company1.setCustId(102034L);
company1.setCustName(getSessionUser().getCustName());
String string = jedisClient.set("test123".getBytes(),SerializationUtil.serialize((company1));
//获取对象
byte[] bs = jedisClient.get("test123".getBytes());
Company company =(Company)SerializationUtil.deserialize(bs);

序列化工具类(两个)代码如下:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerializationUtil {
    /**
     * 序列化
     * 
     * @param object
     * @return
     */
    public static byte[] serialize(Object object) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * 反序列化
     * 
     * @param bytes
     * @return
     */
    public static Object deserialize(byte[] bytes) {
        ByteArrayInputStream bais = null;
        try {
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {

        }
        return null;
    }

}


//这个也是可以的 捕获了一些异常
public class ObjectTranscoder {  
    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 {    
            try {  
                 if(os!=null)os.close();  
                 if(bos!=null)bos.close();  
            }catch (Exception e2) {  
             e2.printStackTrace();  
            }    
        }    
        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 (Exception e) {    
            e.printStackTrace();  
         }finally {    
             try {  
                 if(is!=null)is.close();  
                 if(bis!=null)bis.close();  
             } catch (Exception e2) {  
                 e2.printStackTrace();  
             }  
         }  
        return rv;    
    }    
}

二、json字符串

//保存对象(list一样)
Company company1 = new Company();
company1.setCustId(102034L);
company1.setCustName(getSessionUser().getCustName());
String string = jedisClient.set("test123", com.alibaba.fastjson.JSON.toJSONString(company1));
//获取对象
String returnValue = jedisClient.get("test123");
Company company = com.alibaba.fastjson.JSON.parseObject(returnValue,Company.class);
System.out.println(company.getCustName());

用redis的字符串存储java对象的话,后面查询的数据是没法进行分页的,如果要分页可以考虑用redis的list存储

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关系型数据库和NoSQL数据库 什么是NoSQL 大家有没有听说过“NoSQL”呢?近年,这个词极受关注。看到“NoSQL”这个词,大家可能会误以为是“No!SQL”的缩写,并深感愤怒:“SQL怎么会没有必要了呢?”但实际上,它是“Not Only SQL”的缩写。它的意义是:适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。 为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生。 为了更好地了解本书所介绍的NoSQL数据库,对关系型数据库的理解是必不可少的。那么,就让我们先来看一看关系型数据库的历史、分类和特征吧。 关系型数据库简史 1969年,埃德加•弗兰克•科德(Edgar Frank Codd)发表了划时代的论文,首次提出了关系数据模型的概念。但可惜的是,刊登论文的《IBM Research Report》只是IBM公司的内部刊物,因此论文反响平平。1970年,他再次在刊物《Communication of the ACM》上发表了题为“A Relational Model of Data for Large Shared Data banks”(大型共享数据库的关系模型)的论文,终于引起了大家的关注。 科德所提出的关系数据模型的概念成为了现今关系型数据库的基础。当时的关系型数据库由于硬件性能低劣、处理速度过慢而迟迟没有得到实际应用。但之后随着硬件性能的提升,加之使用简单、性能优越等优点,关系型数据库得到了广泛的应用。 通用性及高性能 虽然本书是讲解NoSQL数据库的,但有一个重要的大前提,请大家一定不要误解。这个大前提就是“关系型数据库的性能绝对不低,它具有非常好的通用性和非常高的性能”。毫无疑问,对于绝大多数的应用来说它都是最有效的解决方案。 突出的优势 关系型数据库作为应用广泛的通用型数据库,它的突出优势主要有以下几点: 保持数据的一致性(事务处理) 由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处) 可以进行JOIN等复杂查询 存在很多实际成果和专业技术信息(成熟的技术) 这其中,能够保持数据的一致性是关系型数据库的最大优势。在需要严格保证数据一致性和处理完整性的情况下,用关系型数据库是肯定没有错的。但是有些情况不需要JOIN,对上述关系型数据库的优点也没有什么特别需要,这时似乎也就没有必要拘泥于关系型数据库了。 关系型数据库的不足 不擅长的处理 就像之前提到的那样,关系型数据库的性能非常高。但是它毕竟是一个通用型的数据库,并不能完全适应所有的用途。具体来说它并不擅长以下处理: 大量数据的写入处理 为有数据更新的表做索引或表结构(schema)变更 字段不固定时应用 对简单查询需要快速返回结果的处理 。。。。。。 NoSQL数据库 为了弥补关系型数据库的不足(特别是最近几年),NoSQL数据库出现了。关系型数据库应用广泛,能进行事务处理和JOIN等复杂处理。相对地,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不足之处。 易于数据的分散 如前所述,关系型数据库并不擅长大量数据的写入处理。原本关系型数据库就是以JOIN为前提的,就是说,各个数据之间存在关联是关系型数据库得名的主要原因。为了进行JOIN处理,关系型数据库不得不把数据存储在同一个服务器内,这不利于数据的分散。相反,NoSQL数据库原本就不支持JOIN处理,各个数据都是独立设计的,很容易把数据分散到多个服务器上。由于数据被分散到了多个服务器上,减少了每个服务器上的数据量,即使要进行大量数据的写入操作,处理起来也更加容易。同理,数据的读入操作当然也同样容易。 提升性能和增大规模 下面说一点题外话,如果想要使服务器能够轻松地处理更大量的数据,那么只有两个选择:一是提升性能,二是增大规模。下面我们来整理一下这两者的不同。 首先,提升性能指的就是通过提升现行服务器自身的性能来提高处理能力。这是非常简单的方法,程序方面也不需要进行变更,但需要一些费用。若要购买性能翻倍的服务器,需要花费的资金往往不只是原来的2倍,可能需要多达5到10倍。这种方法虽然简单,但是成本较高。 另一方面,增大规模指的是使用多台廉价的服务器来提高处理能力。它需要对程序进行变更,但由于使用廉价的服务器,可以控制成本。另外,以后只要依葫芦画瓢增加廉价服务器的数量就可以了。 不对大量数据进行处理的话就没有使用的必要吗? NoSQL数据库基本上来说为了“使大量数据的写入处理更加容易(让增加服务器数量更容易)”而设计的。但如果不是对大量数据进行操作的话,NoSQ
### 回答1: Redis 的五种类型分别是:字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted set)。字符串常用于存储简单的键值对数据;列表适用于存储有序的元素;哈希用于存储键值对,方便读取;集合可以存储不重复的元素;有序集合可以将元素按照分值进行排序。 ### 回答2: Redis 的五种数据类型分别是字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)。 1. 字符串(string):适用于存储单个的键值对信息,例如用户的token、计数器等。 2. 哈希(hash):适用于存储多个字段和值的键值对信息,例如用户的详细信息,可以使用用户ID作为键,姓名、年龄、性别等作为字段,对应的信息作为值。 3. 列表(list):适用于存储多个有序元素的列表,可以实现抽奖、消息队列等功能。例如,可以将一系列消息按照插入顺序存储在列表中。 4. 集合(set):适用于存储多个唯一元素的无序集合,可以执行集合操作如并集、交集、差集等。例如,可以存储用户的标签集合,每个标签只能出现一次。 5. 有序集合(sorted set):适用于存储多个有序元素的集合,每个元素都有一个分数值,可以按照分数值进行排序。适用于排行榜、优先级队列等场景。例如,可以存储用户的积分排名,按照积分进行排序。 根据应用场景和需求,选择合适的数据类型可以更加高效地使用Redis。 ### 回答3: Redis 是一种基于内存的高性能键值存储系统,具有五种主要的数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。不同的数据类型有不同的特点和应用场景。 1. 字符串(String):适用于存储一个键对应的值,可以保存任何类型的数据,如整数、浮点数、字符串等。常用于缓存、计数器、分布式锁等场景。 2. 哈希(Hash):适用于存储多个键值对,可以看做是一个字符串键值对的集合。适用于存储对象、用户信息等复杂数据结构,可以实现快速访问指定字段的值。 3. 列表(List):适用于存储有序的字符串元素,可以进行插入和删除操作,支持从两端进行操作。常用于消息队列、最新列表等场景。 4. 集合(Set):适用于存储多个无序、唯一的字符串元素,不允许重复值。集合类似于列表,但具有去重和快速判断某个元素是否存在的特性。适用于好友关系、共同粉丝等场景。 5. 有序集合(Sorted Set):适用于有序存储的字符串元素,每个元素都会关联一个分数。有序集合可以根据分数进行排序,并支持范围操作。常用于排行榜、带权重的任务队列等场景。 根据具体的业务需求和数据特点,可以选择合适的数据类型来存储和操作数据,从而提高系统的性能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值