在我们日常开发过程中经常用到缓存,像一些简单的数据不经常改变,而且数据模型较为单一,我们可以直接调用Redis的方法即可进行缓存。
但是。不是所有的查询接口都是简单的,也有很多复杂的参数以及携带分页的。这类数据我们如何通过Redis进行缓存呢?
这里博主仅分享自已的方法,大家有更好的方法意见可以分享到评论区!
这里我采用的方法是:根据方法名字+参数名生成对应的key进行缓存
因为我们大多数参数都是中文的,为了防止放入Redis中乱码,我们需要把它先转为拼音。大家可以参考 Java汉字转拼音(解决方案) ,并在项目中引用该jar包以及方法。再进行后续的编码工作。
写好上面的转换方法后我们编写一下key的生成规则 根据方法名字+参数名(拼音)生成对应的key。
/** * 根据方法名字+参数名生成对应的key * * @param map * @param method * @return */ public static String createRediskey(Map<String, Object> map, String method) { String cacheKey; cacheKey = method; for (String key : map.keySet()) { if (null != map.get(key)) { //如果value不为空则拼接缓存名称 try { if (isChinese(map.get(key).toString())){ //如果为汉字true cacheKey = cacheKey + changeChinesePinyin(map.get(key).toString()).get("fullPinyin"); }else { cacheKey = cacheKey + map.get(key).toString(); } } catch (BadHanyuPinyinOutputFormatCombination e) { throw new RuntimeException(e); } } } return cacheKey; } /** * 为了防止除了汉字之外的字符出现我们通过正则过滤一下 * @param str * @return */ public static boolean isChinese(String str) { String regEx = "[\u4e00-\u9fa5]"; Pattern pat = Pattern.compile(regEx); Matcher matcher = pat.matcher(str); boolean flg = false; if (matcher.find()) flg = true; return flg; }
接下来我们直接再方法接口中调用该方法生成对应的key并进行缓存即可。
- parameterMap 对应的是我们接口的参数有多少个参数对应put多少次
- method 是我们的方法名字
/** * 首页公告接口 * @return */ @GetMapping("/indexArticle") @RequiresAuthentication @ApiImplicitParams({@ApiImplicitParam(name = TOKEN_TAG, value = TOKEN_TAG, paramType = "header")}) public Object indexArticle(String secondColumn , @RequestParam(value="current", required = false,defaultValue = "1") Integer current , @RequestParam(value="number", required = false,defaultValue = "10") Integer number){ Map parameterMap =new HashMap(); parameterMap.put("current",current); parameterMap.put("number",number); parameterMap.put("secondColumn",secondColumn); String key = createRediskey(parameterMap, "indexArticle"); System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++缓存key值为:"+key); Map ca = (Map) RedisUtil.get(key); if (ca != null){ System.out.println("已读取到缓存数据++++++++++++++++++++++++++++++++++++++++++++++++++++"); return ApiResult.success(ca); } Map map= consultationsService.findList(current,number,secondColumn); redisUtil.set(key,map,18000); //五小时过期 return ApiResult.success(map); }
经过测试,我们的接口调用后就会根据参数信息生成的key进行缓存。再次调用传相同的参数就会从redis中进行读取。