简单来说就是用一条查询拿出存储在redis中的value -> map对应的key的值:
redis是key-value的数据的Nosql数据库,这个例子的redis某一个key的value就是上述的map,不使用fieldKey的话只能是先将整个map的值拿出来,再取对应的key的值,这样造成了资源和性能的浪费,使用field可以很好解决这个问题,以下分为原有逻辑以及改进之后的逻辑:
public String getDispatchcmdBybusTID(String busTIDAndDate) {
String cmdStatus = "";
Map<Object,Object> dispatchcmdMap = redisUtil.getCacheMap(dispatchcmdCache_key);
if(!Tools.isNullOrEmpty(dispatchcmdMap)){
cmdStatus = (String) dispatchcmdMap.get(busTIDAndDate);
}
return cmdStatus;
}
/**
* 获得缓存的Map
* @param key
* @return
*/
public Map<Object, Object> getCacheIntegerMap(String key){
Map<Object, Object> map = redisTemplate.opsForHash().entries(key);
return map;
}
以下为改进写法:
//这种写法就可以省去了把整个map拿出来再做取值的繁琐过程
public String getDispatchcmdBybusTID(String busTID) {
String cmdStatus = String.valueOf(redisUtil.getFieldVal(dispatchcmdCache_key,busTID));
return cmdStatus;
}
/**
* 通过field获取值
* @param hashKey
* @param fieldKey
* @return
*/
public Object getFieldVal(String hashKey,String fieldKey){
Object object = redisTemplate.opsForHash().get(hashKey, fieldKey);
return object;
}
上述方法是读操作,以下为写操作,为什么这样写道理同上
//同样是拿了所有的值,再put进map后写入
public String putDispatchcmdBybusTID(String busTID,String cmdStatus) {
Map<Object,Object> dispatchcmdMap = redisUtil.getCacheMap(dispatchcmdCache_key);
if(Tools.isNullOrEmpty(dispatchcmdMap)){
dispatchcmdMap = new HashMap<Object,Object>();
}
dispatchcmdMap.put(busTID, cmdStatus);
redisUtil.setCacheMap(dispatchcmdCache_key, dispatchcmdMap, 0, 0);
return cmdStatus;
}
/**
* 缓存Map
* @param key
* @param dataMap
* @param minute 缓存时间
* @param type 0:不需要, 1:需要且为默认 2:需要且过期时间为minute
* @return
*/
public int setCacheMap(String key,Map<Object, Object> dataMap, long minute, int type) {
if(null != dataMap) {
HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
hashOperations.putAll(key,dataMap);
//设置过期时间
if(type != 0){
try {
if(type == 1){
minute = MaximumTimeOfDay.getDiffTimeOfDay(System.currentTimeMillis());
}
if(minute > 0)expire(key, minute, TimeUnit.MILLISECONDS, false);
} catch (Exception e) {
systemLog.error("【error】setCacheMap", e);
}
}
} else{
return 0;
}
return dataMap.size();
}
//直接将值插入对应的HashMap就好了
public String putDispatchcmdBybusTID(String busTID,String cmdStatus) {
redisUtil.hashSet(dispatchcmdCache_key, busTID, cmdStatus);
return cmdStatus;
}
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key
* @param item
* @param value
*/
public void hashSet(String key,String item,Object value) {
redisTemplate.opsForHash().put(key, item, value);
}