项目中引入了Redis。虽然Jfinal整合了Redis,但是使用自身的序列化机制效率并不是很高,目前比较好的序列化机制是google的Protostuff,所以这里采用Protostuff编写一个Redis工具类。代码如下:
public class RedisDao {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final JedisPool jedisPoll;
public RedisDao(String ip, int port){
jedisPoll = new JedisPool(ip, port);
}
//以Users为例
private RuntimeSchema<Users> schema = RuntimeSchema.createFrom(Users.class);
//获取对象缓存
public Object get(String usersId) {
// redis操作
try {
Jedis jedis = jedisPoll.getResource();
try {
//java自带序列化机制效率不高,采用google protostuff实现自身序列化机制
String key = "userId:"+ usersId;
//实现序列化机制,对象必须为pojo类型
byte[] bytes = jedis.get(key.getBytes());
if(bytes != null){
Users users = schema.newMessage();
ProtostuffIOUtil.mergeFrom(bytes, users, schema);
return users;
}
} finally {
jedis.close();
}
} catch (Exception e) {
// TODO: handle exception
logger.error(e.getMessage(), e);
}
return null;
}
//将对象放入缓存
public Object set(Users users){
try {
Jedis jedis = jedisPoll.getResource();
try {
String key = "userId:"+ users.getAccid();
byte[] bytes = ProtostuffIOUtil.toByteArray(users, schema,
LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
//超时缓存
int timeout = 60*60;
//返回结果
String result = jedis.setex(key.getBytes(), timeout, bytes);
return result;
} finally {
jedis.close();
}
}catch (Exception e) {
// TODO: handle exception
logger.error(e.getMessage(), e);
}
return null;
}
}
初始化代码如下:
RedisDao redisDao = new RedisDao("localhost", 6379);