ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis中如何存储java对象

2019-08-12 17:51:46  阅读:237  来源: 互联网

标签:存储 序列化 java bytes redis seckill jedis return null


根据redis的存储原理,Redis的key和value都支持二进制安全的字符串

1.利用序列化和反序列化的方式

存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用redis存储java对象了

a.利用jdk自带的序列化机制,但效率不高

步骤:创建一个序列化和反序列化的工具类

public class SerializeUtil {  
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;  
}  
public static Object unserialize(byte[] bytes) {  
ByteArrayInputStream bais = null;  
try {  
//反序列化  
bais = new ByteArrayInputStream(bytes);  
ObjectInputStream ois = new ObjectInputStream(bais);  
return ois.readObject();  
} catch (Exception e) {  
}  
return null;  
}  
}

b.利用谷歌的序列化依赖,高效,使用于秒杀等业务场景

<!--prostuff序列化依赖 -->
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>

@Slf4j
public class RedisDao {

    private final JedisPool jedisPool;
    private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);

    public RedisDao(String ip, int port) {
        jedisPool = new JedisPool(ip, port);
    }

    public Seckill getSeckill(Long seckillId) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String key = "seckill:" + seckillId;
            byte[] bytes = jedis.get(key.getBytes());
            if (bytes != null) {
                Seckill seckill = schema.newMessage();
                ProtostuffIOUtil.mergeFrom(bytes, seckill, schema);
                return seckill;
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }

    public String putSeckill(Seckill seckill) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String key = "seckill:" + seckill.getSeckillId();
            byte[] bytes = ProtostuffIOUtil.toByteArray(seckill, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
            Integer timeout = 60 * 60;
            String result = jedis.setex(key.getBytes(), timeout, bytes);
            return result;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }

        return null;
    }


}

 

方法2:将java对象转换为json字符串,利用json与java对象之间可以相互转换的方式进行存值和取值

标签:存储,序列化,java,bytes,redis,seckill,jedis,return,null
来源: https://www.cnblogs.com/panbingqi/p/11341601.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有