protostuff使用


之前使用redis存儲pojo時從未想過實例化,只是轉成hashes處理起來不方便取的時候也麻煩,用了序列化方便多了!


import com.dyuproject.protostuff.LinkedBuffer;

import com.dyuproject.protostuff.ProtostuffIOUtil;

import com.dyuproject.protostuff.runtime.RuntimeSchema;

import com.netease.seckill.entity.Seckill;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;


public class RedisTest {


private Logger logger = LoggerFactory.getLogger(this.getClass());

private JedisPool jedisPool;

private int port;

private String ip;

public RedisDao(String ip, int port) {

logger.info("---------------------------------ip:{},port:{}",ip,port);

this.port = port;

this.ip = ip;

}


//Serialize function

private RuntimeSchema<User> schema = RuntimeSchema.createFrom(User.class);


public User getUser(int id) {

jedisPool = new JedisPool(ip, port);

//redis operate

try {

Jedis jedis = jedisPool.getResource();

try {

String key = "User:" + id;

//由於redis內部沒有實現序列化方法,而且jdk自帶的implaments Serializable比較慢,會影響併發,因此需要使用第三方序列化方法.

byte[] bytes = jedis.get(key.getBytes());

if(null != bytes){

User user = schema.newMessage();

ProtostuffIOUtil.mergeFrom(bytes,user,schema);

//reSerialize

return user;

}

} finally {

jedisPool.close();

}

} catch (Exception e) {

logger.error(e.getMessage(),e);

}


return null;

}


public String putUser(User user) {

jedisPool = new JedisPool(ip, port);

//set Object(user) ->Serialize -> byte[]

try{

Jedis jedis = jedisPool.getResource();

try{

String key = "User:"+user.getId();

byte[] bytes = ProtostuffIOUtil.toByteArray(user, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));

//time out  cache

int timeout = 60*60;

String result = jedis.setex(key.getBytes(),timeout,bytes);

return result;

}finally {

jedisPool.close();

}

}catch (Exception e){

logger.error(e.getMessage(),e);

}

return null;

}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章