redis之缓存码表

本文介绍了一个简单的Redis缓存码表的方法,旨在减少数据库访问频率。虽然未处理Redis雪崩问题,但实现了动态配置更新及多种键值对格式的访问,并对查重算法进行了优化,利用Map的非重复特性进行查询。
摘要由CSDN通过智能技术生成

前言

本篇是一个简单的将常用的码表缓存进redis的代码, 防止频繁访问数据库.

说明

  1. 由于是小系统内部使用, 没有对redis做防止雪崩的处理.

  2. 加入了页面动态控制:
    在这里插入图片描述

  3. 可随配置项动态更新redis的内容

  4. 提供了6中访问数据的键值对格式

  5. 可同步所有数据, 也可监测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.
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值