之前使用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;
}
}