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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,倚天版 1GB 1个月
简介: 如何给多参数接口添加缓存(根据方法名字+参数名生成对应的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 {
                    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中进行读取。

b5379452179442bab3b262e3ce7b5fe9.png


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 缓存 安全
第二章 HTTP请求方法、状态码详解与缓存机制解析
第二章 HTTP请求方法、状态码详解与缓存机制解析
|
3月前
|
缓存 C++
计算属性缓存 vs 方法
计算属性缓存 vs 方法
|
3月前
|
存储 缓存 NoSQL
除了`functools.lru_cache`装饰器,还有哪些方法可以缓存函数的结果?
除了`functools.lru_cache`装饰器,还有哪些方法可以缓存函数的结果?
27 1
|
4天前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
1月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
17 0
|
12天前
|
存储 缓存 NoSQL
在 Go 中使用接口进行灵活缓存
在 Go 中使用接口进行灵活缓存
|
29天前
|
监控 Sentinel 缓存
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
高并发架构设计三大利器:缓存、限流和降级问题之RateLimiter的acquire()方法有什么作用
|
2月前
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
47 5
|
2月前
|
缓存 监控 NoSQL
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
158 1
|
1月前
|
缓存 JSON 算法
http【详解】状态码,方法,接口设计 —— RestfuI API,头部 —— headers,缓存
http【详解】状态码,方法,接口设计 —— RestfuI API,头部 —— headers,缓存
35 0