Redis和Hbase互补取值思路

来源:互联网 发布:中级程序员面试题 编辑:程序博客网 时间:2024/04/30 08:35

1、思路:

用户取数据首先从Redis中取,Redis中没有数据则将Hbase中的数据插入Redis,且在配置文件中设置redis开关redisSwitch,如果redisSwitch=true则是从Redis中取数据,否则直接从Hbase中取数据,在配置文件中设置Redis的域的有效时间effectiveTime=86400,86400s为24小时,若设置为0s则直接失效。


2、实现:
@RequestMapping(value = "consumer/consumerPortrait.json", produces = "application/json; charset=UTF-8")
public void consumerPortraitJson(@RequestParam("cust_num") String cust_num, HttpServletResponse response) throws Exception {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String resultJson ="";
String tableName = "ns_sousuo:tdm_user_label_info_ed";
String rowKey = cust_num;
if (rowKey == null || rowKey == "") {
rowKey = "";
}
Map<String,String>  redisMap = commonTools.readPropertiesFile("ps_redis");
String redisSwitch = redisMap.get("redisSwitch");
if(redisSwitch.equalsIgnoreCase("true")){//从redis获取数据
ShardedJedis jedis = null;
try {
jedis = pool.getResource();
boolean hexist = jedis.hexists(nimitzRowkey, cust_num);
log.info(String.valueOf(hexist));
if(hexist){
log.info("从redis取数据");
resultJson = jedis.hget(nimitzRowkey, cust_num);
}else{
resultJson = cusService.getResultMapFromHbase(tableName, cust_num);
int effectiveTime = Integer.parseInt(redisMap.get("effectiveTime"));
//离线存储至redis
taskExecutorUtil.setRedis(jedis, nimitzRowkey, cust_num, resultJson, effectiveTime);
log.info("从Hbase离线导入redis");
}

} catch (JedisConnectionException e){
log.error("jedis连接异常", e);
}
}else{//从hbase获取数据
resultJson = cusService.getResultMapFromHbase(tableName, rowKey);
log.info("从hbase取数据");
}
response.getWriter().write(resultJson);
}

原创粉丝点击