1、 背景

Nresource服务日均4.5亿流量,考虑到未来流量急增场景,我们打算对大流量接口进行缓存化处理;根据服务管理平台数据统计显示getUsableResoureCount接口调用量很大,接近40%,故对此接口进行缓存化处理。

2、 方案调研

getUsableResoureCount接口用途:获取用户的可用资源数,契约为:Map<String, Integer> getUsableResoureCount(long userId, int resourceType, ResourceCountTypeEnum typeEnum, List<Integer> cities, List<Integer> caties) throws Exception;支持传入资源数类型(全国/本地)多城市和多类目按照包含的策略进行资源过滤;

由于资源库存表设计字段:城市和类目写入格式为:1,2,3,即以逗号组合的字符串,所以如果缓存用户对应城市和类目的所有余量,实现难度大且意义不大。

通过对接口返回值的观察,我们发现getUsableResoureCount接口返回值很多都是查询用户所有资源余量,不区分城市和类目,且查询结果都为0,所以我们切换思路:是不是可以把这些无余量的数据缓存起来?

通过2021-07-27 10:00:00数据统计我们发现,单节点一分钟getUsableResoureCount接口调用量为395,其中查询所有资源余量的微287,返回值为0的为183,接近46%的请求是无数据的,所以缓存用户无余量的数据是有意义的,能挡住接近50%的无用请求。

缓存用户无余量的数据,我们需要在所有涉及余量增减的操作,同时维护redis中余量变化,如何维护db与缓存中数据的一致性,也是面临的问题,所以我们想:可不可以不缓存余量,只缓存一个余量标识,这样既能挡住无用请求,又不需要维护db与缓存的数据一致性呢?参考布隆过滤器,我们决定对此接口进行缓存余量标识,只记录有还是没有,即1和0。

3、 方案实施

getUsableResoureCount接口先查询缓存,如果返回值为0,则放入缓存,所有增加余量的操作均需要更新redis标识为1。基本目标就是:保证更新标识为有的操作一定成功。考虑到服务并发,写操作(更新redis标识为1)可能会被读操作(更新redis标识为0)覆盖,所以更新redis标识为0的时候,先增加时间校验即晚一分钟更新,因为redis标识更新为0或null,不会影响最终查询,而是会查询db,晚一分钟又可以避免读写覆盖的问题。最终采用lua脚本实现读操作,而写操作采用同步set异步重试保证最终成功;

lua脚本如下:

4、最终效果

接口响应耗时:

2021.9.2 VS 2021.9.9

2021.9.8 VS 2021.9.9

性能提升(ms):1.4 -> 0.9 提升超过30%

整体服务响应耗时:

2021.9.8 VS 2021.9.9

性能提升(ms):1.8 -> 1.6 提升超过10%

缓存命中率统计:

服务节点:10.***.60.***

命中率接近80%

5、未来考量

1)缓存的扩展性,未来新的写接口需要更新redis标识为1;

2)缓存的接口适配性,考虑更多查询接口应用缓存;

ps: 整体思路,由于业务原因,没有采用传统缓存用redis存有效数据的思路,我们是反其道行之,用redis来挡住无效流量

Nresource服务之接口缓存化的更多相关文章

  1. java接口入参模板化,适用于企业化服务远程调度模板化的场景,接口入参实现高度可配置化

    需求:远程服务接口模板化配置提供接入服务 模板接口分为三个模块:功能路由.参数校验.模板入库 路由:这里的实现方式很简单,就是根据业务标识找到对应的处理方法 参数校验: 参数校验这步涉及模板和校验类两 ...

  2. 唯品会RPC服务框架与容器化演进--转

    原文地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405781868&idx=1&sn=cbb10d37e25 ...

  3. vue服务端渲染缓存应用

    vue缓存分为页面缓存.组建缓存.接口缓存,这里我主要说到了页面缓存和组建缓存 页面缓存: 在server.js中设置 const LRU = require('lru-cache') const m ...

  4. 在 WPF 客户端实现 AOP 和接口缓存

    随着业务越来越复杂,最近决定把一些频繁查询但是数据不会怎么变更的接口做一下缓存,这种功能一般用 AOP 就能实现了,找了一下客户端又没现成的直接可以用,嗐,就只能自己开发了. 代理模式和AOP 理解代 ...

  5. .NET实现微博粉丝服务平台接口

    [文章摘要]Senparc.Weixin.MP虽然是微信公众号的SDK,但由于易信公众号和新浪微博粉丝服务平台也提供了微信兼容接口,所以也可以使用其快速实现相应的服务,当然微博由于与微信存在差异,如果 ...

  6. 戏说WSGI(Python Web服务网关接口)--[转载]

    戏说WSGI(Python Web服务网关接口) 当你在Python的世界中冒险,突然遭遇一只Web怪兽,你会选择什么武器对付它?在兵器谱上,下列兵器可谓名列前茅: Zope,厚重的长枪.较早出现的武 ...

  7. Axis2创建WebService服务端接口+SoupUI以及Client端demo测试调用

    第一步:引入axis2相关jar包,如果是pom项目,直接在pom文件中引入依赖就好 <dependency> <groupId>org.apache.axis2</gr ...

  8. Spring Cloud开发实践 - 02 - Eureka服务和接口定义

    服务注册 EurekaServer Eureka服务模块只有三个文件, 分别是pom.xml, application.yml 和 EurekaServerApplication.java, 内容如下 ...

  9. 接口缓存--把接口放在redis数据库中,减少访问量

    针对访问量大,且数据较固定的接口,建议建立接口缓存,建立了缓存之后,不会再直接去访问接口了. 比如下面的轮播图接口,每刷新一下首页都会访问一下轮播图接口,所以我们用接口缓存来处理,减少访问量. 视图模 ...

随机推荐

  1. NPM使用方法

    什么是npm npm是nodejs的包管理器,在当今工程化前端开发过程中,npm包起着举足轻重的作用. 安装npm 作为nodejs的包管理器,npm随着nodejs一起安装的.通常情况下,当我们安装 ...

  2. 关于c#:如何在不同的命名空间中处理相同的类名?

    How to handle same class name in different namespaces? 我正在尝试创建一个通用的库结构. 我通过为我想要的每个公共库创建单独的项目来做到这一点 我 ...

  3. C#基础知识---获取调用者信息

    一.概述 C#5.0提供了一种新功能,可以利用特性和可选参数获得调用者的信息.这些特性信息包括CallerLineNumber.CallerFilePath和CallerMemberName. 二.D ...

  4. jQuery中的文档操作处理(五):append()、prepend()、after()、before()、wrap()、wrapAll()、wrapInner()、clone()等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. 数据库中sql分类

    -- sql语句分类:--   1)数据定义语句(DDL):--            create/alter/drop--   2)数据操作语句(DML):--            insert ...

  6. Python创建二维列表的正确姿势

    Python创建二维列表的正确姿势 简介 Python中没有数组,使用list结构代替,并且list结构的功能更加强大: 支持动态扩容,无需担心元素过量 对list内的元素类型不做一致性约束 提供丰富 ...

  7. 阿里云服务器上部署java项目(安装mysql)

    安装mysql步骤如下: 1.安装MySQL官方的yum repository: wget -i -c http://dev.mysql.com/get/mysql57-community-relea ...

  8. Git使用教程四

    拉取线上仓库 :git pull 提醒: 在每天工作的第一件事就是先git pull拉取线上最新·的版本: 每天下班前要做的是git push,将本地代码提交到线上仓库. 有兴趣可以关注一下微信公众号

  9. AN INTEGER FORMULA FOR FIBONACCI NUMBERS

    https://blog.paulhankin.net/fibonacci/ This code, somewhat surprisingly, generates Fibonacci numbers ...

  10. OpenCV 之 透视 n 点问题

    透视 n 点问题,源自相机标定,是计算机视觉的经典问题,广泛应用在机器人定位.SLAM.AR/VR.摄影测量等领域 1  PnP 问题 1.1  定义 已知:相机的内参和畸变系数:世界坐标系中,n 个 ...