如何给多参数接口添加缓存(根据方法名字+参数名生成对应的key)

Posted 虫链Java Library

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给多参数接口添加缓存(根据方法名字+参数名生成对应的key)相关的知识,希望对你有一定的参考价值。

在我们日常开发过程中经常用到缓存,像一些简单的数据不经常改变,而且数据模型较为单一,我们可以直接调用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 
                    cacheKey = cacheKey +  changeChinesePinyin(map.get(key).toString()).get("fullPinyin") ;
                 catch (BadHanyuPinyinOutputFormatCombination e) 
                    throw new RuntimeException(e);
                
            
        
        return cacheKey;
    

接下来我们直接再方法接口中调用该方法生成对应的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中进行读取。

以上是关于如何给多参数接口添加缓存(根据方法名字+参数名生成对应的key)的主要内容,如果未能解决你的问题,请参考以下文章

如何给多参数接口添加缓存(根据方法名字+参数名生成对应的key)

request_response

ServletRequest接口

如何添加atl工程实现接口实现ipersistfile

SpringBoot笔记

Java——使用多线程从list中不重复地取出数据并进行处理,给多线程任务添加单项任务计时和总耗时