redis和Java的整合
1.先要导入 redis 的依赖
2.redis的操作一般放在业务层,所以可以先在Dao 层创建一个redisDao的接口 然后实现这个接口,在这个接口中写入
一些set get del 的方法 注意 如果使用的redis不是集群的redis 那么就要set或get完时关闭redis。
Dao层的接口(单机):
public String set(String key,String value);
public String get(String key);
Dao的实现类(单机):
JedisPool pool = new JedisPool("ip", 端口);
Jedis j = pool.getResource();
public String set(String key,String value){
String str = j.set(key,value);
j.close();
}
如果时集群的Redis
Set<HostAndPort> set = new HashSet<HostAndPort>();
set.add(new HostAndPort("ip", 端口));
set.add(new HostAndPort("ip", 端口));。。。。。。。
JedisCluster cluster = new JedisCluster(set);
public String set(String key,String value){
String str =cluster.set(key,value);
}
在业务层 我们一般处理的数据都是对象,List,Map等类型 ,而在redis里 它的value是String ,hash等类型
所以我们要将数据保存到redis里时,需要将查到的数据转换:
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成pojo对象list
*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
同理 这里我们的工具类也是需要依赖的 jackson-annotations jackson-core jackson-databind 3个依赖
在业务层处理数据
这里用查询做例:
@Override
public String getAllUser() {
try{ //从redis中取值
String json = this.jedisDao.hget("user","all");
if(json!=null && !"".equals(json)){
return json;
}
}catch(Exception e){
e.printStackTrace();
}
List<User> list = dao.findAllUser();
String str = JsonUtils.objectToJson(list);
try{ // 存入redis中
this.jedisDao.hset("user","all",str);
}catch(Exception e){
e.printStackTrace();
}
return str;
}
如果没有查到,执行UserDao中的查询方法,查到后,把数据存入redis中
注意:这里操作redis的代码都放在了try{} catch(){} 中。因为当redis出问题时,不能中断正常的流程!!!
当对数据做了增删改操作时,要同步redis中的数据,这里不需要去修改redis中的数据,
只需要将数据从redis中删除即可!!!
@Override
public void modifyUser(User user) {
jedisDao.hdel("user","all"); // 同步数据,这里没有必要去修改redis中的数据,直接将redis中数据删除
dao.updateUser(user);
}