前言
本篇是一个简单的将常用的码表缓存进redis的代码, 防止频繁访问数据库.
说明
-
由于是小系统内部使用, 没有对redis做防止雪崩的处理.
-
加入了页面动态控制:
-
可随配置项动态更新redis的内容
-
提供了6中访问数据的键值对格式
-
可同步所有数据, 也可监测redis和数据库的差异数据. 均对代码做了优化处理. 其中查重数据的算法值得推荐一下, 利用map的key非重复做的查询
相关代码:
/**
* 两个list取不同
*/
private static StringBuffer getDiffrent(List<String> listRedis, List<String> listSql) {
Map<String,Integer> map = new HashMap<String,Integer>(listRedis.size()+listSql.size());
StringBuffer diff = new StringBuffer();
for (String string : listSql) {
map.put(string, 1);
}
for (String string : listRedis) {
Integer cc = map.get(string);
if (cc != null) {
map.put(string, ++cc);
continue;
}
diff.append("redis- ").append(string).append("</br>");
}
for(Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
diff.append("sql- ").append(entry.getKey()).append("</br>");
}
}
return diff;
}
所有代码
/**
* VMasterUtils
*/
public class VMasterUtils {
private static final Logger logger = Logger.getLogger(VMasterUtils.class);
public static final String Master_PREFIX = "ccrv:md:";
public static final String ListByKey_PREFIX = "ccrv:md:ListByKey:";
public static final String IdValByKeyPy_PREFIX = "ccrv:md:IdValByKeyPy:";
public static final String IdByKeyPy_PREFIX = "ccrv:md:IdByKeyPy:";
public static final String IdByKeyVal_PREFIX = "ccrv:md:IdByKeyVal:";
public static final String PyByKeyVal_PREFIX = "ccrv:md:PyByKeyVal:";
public static final String ValById_PREFIX = "ccrv:md:ValById:";
private static IVMasterService getVMasterService() {
return (IVMasterService) Action.ctx.getBean("vMasterService");
}
/**
* 2 -> 3 + 5
* 1.通过 select_key 查找列表 master_detail_id, master_value, py
*/
public static List getListByKey(String selectKey) {
if (isInvalid(selectKey)) {
return new ArrayList();
}
List redisResult = new ArrayList();
try {
redisResult = RedisUtil.getList(ListByKey_PREFIX + selectKey);
if (redisResult == null || redisResult.size() == 0) {
throw new Exception(selectKey + " redis_no_data ");
}
return redisResult;
} catch (Exception e) {
saveErrorLog(" getListByKey: " + e.getMessage());
redisResult = getListByKeyFromSql(selectKey, new Boolean[]{
true});
return redisResult == null ? new ArrayList() : redisResult;
}
}
public static List getListByKeyFromSql(String selectKey, Boolean[] setRedis) {
List list = new ArrayList();
try {
IVMasterService vMasterService = getVMasterService();
Map<String, Object> mapParam = new HashMap<String, Object>();
mapParam.put("selectKey", selectKey);
mapParam.put("selectKeyChanged", true);
IdentityBean identityBean = new IdentityBean();
List listFromSql = vMasterService.selectListByKey(identityBean, mapParam);
if (listFromSql != null && listFromSql.size() > 0) {
String value = ClobToString((Clob) ((Map) listFromSql.get(0)).get("CONCATVALUE"));
list = new Gson().fromJson(value, list.getClass());
if (setRedis[0]) {
setRedis[0] = saveOneToRedis(ListByKey_PREFIX, selectKey, value);
}
return list;
} else {
saveErrorLog(selectKey + " sql_no_data ");
setRedis[0] = false;
return new ArrayList();
}
} catch (Exception e) {
saveErrorLog(" getListByKeyFromSql: " + e.getMessage());
setRedis[0] = false;
return list;
}
}
/**
* 2 + 4 -> 3 + 5
* 2.通过 select_key, py(非空) 查找 master_detail_id, master_value, py
*/
public static List getIdValByKeyPy(String selectKey, String py) {
if (isInvalid(selectKey, py)) {
return new ArrayList();
}
List redisResult = new ArrayList();
try {
redisResult = RedisUtil.getList(IdValByKeyPy_PREFIX + selectKey + ":" + py);
if (redisResult == null || redisResult.size() == 0) {
throw new Exception(selectKey + ":" + py + " redis_no_data ");
}
return redisResult;
} catch (Exception e) {
saveErrorLog(" getIdValByKeyPy: " + e.getMessage());
redisResult = getIdValByKeyPyFromSql(selectKey, py, new Boolean[]{
true});
return redisResult == null ? new ArrayList() : redisResult;
}
}
public static List getIdValByKeyPyFromSql(String selectKey, String py, Boolean[] setRedis) {
List list = new ArrayList();
try {
IVMasterService vMasterService = getVMasterService();
Map<String, Object> mapParam = new HashMap<String, Object>();
mapParam.put("selectKey", selectKey);
mapParam.put("selectKeyChanged", true);
mapParam.put("py", py);
mapParam.put("pyChanged", true);
IdentityBean identityBean = new IdentityBean();
List listFromSql = vMasterService.selectIdValByKeyPy(identityBean, mapParam);
if (listFromSql != null && listFromSql.size() > 0) {
String value = (String) ((Map) listFromSql.get(0)).get("CONCATVALUE");
list = new Gson().fromJson(value, list.getClass());
if (setRedis[0]) {
setRedis[0] = saveOneToRedis(IdValByKeyPy_PREFIX, selectKey + ":" + py, value);
}
return list;
} else {
saveErrorLog(selectKey + ":" + py + " sql_no_data ");
setRedis[0] = false;
return new ArrayList();
}
} catch (Exception e) {
saveErrorLog(" getIdValByKeyPyFromSql: " + e.getMessage());
setRedis[0] = false;
return list;
}
}
/**
* 2 + 4 -> 3
* 3.通过 select_key, py(非空) 查找 master_detail_id
*/
public static String getIdByKeyPy(String selectKey, String py) {
if (isInvalid(selectKey, py)) {
return "";
}
String redisResult = "";
try {
redisResult = RedisUtil.get(IdByKeyPy_PREFIX + selectKey + ":" + py);
if (redisResult == null || redisResult.equals("null") || redisResult.equals("")) {
throw new Exception(selectKey + ":" + py + " redis_no_data ");
}
return redisResult;
} catch (Exception e) {
saveErrorLog(" getIdByKeyPy: " + e.getMessage());
redisResult = getIdByKeyPyFromSql(selectKey, py, new Boolean[]{
true});
return redisResult == null ? "" : redisResult;
}
}
public static String getIdByKeyPyFromSql(String selectKey, String py, Boolean[] setRedis) {
String value = "";
try {
IVMasterService vMasterService = getVMasterService();
Map<String, Object> mapParam = new HashMap<String, Object>();
mapParam.put("selectKey", selectKey);
mapParam.put("selectKeyChanged", true);
mapParam.put("py", py);
mapParam.put("pyChanged", true);
IdentityBean identityBean = new IdentityBean();
List listFromSql = vMasterService.