自定义PubSub,pubsub

如何评估数据适不适合放入Redis中?

自定义PubSub,pubsub


当项目中引入了 Redis 做分布式缓存 , 那么就会面临这样的问题:哪些数据应该放到缓存中?依据是什么?缓存数据是采用主动刷新还是过期自动失效?如果采用过期自动失效 , 那么失效时间如何制定?正好这两周我们项目做了相关的评估 , 把过程记录下来和大家分享分享;当然过程中用到了很多“笨办法” , 如果你有更好的办法 , 也希望能分享给我 。
【自定义PubSub,pubsub】01. 项目背景我们的项目是一个纯服务平台 , 也就是只提供接口服务 , 并没有操作页面的 , 项目的接口日调用量大约在 200 万次 , 高峰期也就 1000 万出头 , 因为大部分接口是面向内部系统的 , 所以大部分请求集中在工作日的 9 点到 21 点 , 高峰期的时候系统的 QPS 在 300-400 之间 。因为我们项目数据存储使用的是 MongoDB , 理论上支撑这个量级的 QPS应该是绰绰有余 , 但是我有这么几点观察和考虑:MongoDB 中虽然是整合好的数据 , 但是很多场景也不是单条查询 , 夸张的时候一个接口可能会返回上百条数据 , 回参报文就有两万多行(不要问我能不能分页返回......明确告诉你不能);MongoDB 中虽然是整合好的数据 , 但是很多场景也不是单条查询 , 夸张的时候一个接口可能会返回上百条数据 , 回参报文就有两万多行(不要问我能不能分页返回......明确告诉你不能);目前项目 99.95% 的接口响应时间都在几十到几百毫秒 , 基本可以满足业务的需要 , 但是还是有 0.05% 的请求会超过 1s 响应 , 偶尔甚至会达到 5s、10s;观察这些响应时间长的请求 , 大部分时间消耗在查询 MongoDB 上 , 但是当我将请求报文取出 , 再次手动调用接口的时候 , 依然是毫秒级返回;MongoDB 的配置一般 , 时刻都有数据更新 , 而且我观察过 , 响应时间长的这些接口 , 那个时间点请求量特别大;MongoDB 查询偶尔会慢的原因我我还在确认 , 我现在能想到的原因比如:大量写操作影响读操作、锁表、内存小于索引大小等等 , 暂时就认为是当时那一刻 MongoDB 有压力;我观察过 , 响应时间长的这些接口 , 那个时间点请求量特别大 , 这一点就不在这里具体分析了 。
虽然一万次的请求只有四五次响应时间异常 , 但是随着项目接入的请求越来越大 , 保不齐以后量变产生质变 , 所以还是尽量将危机扼杀在摇篮里 , 所以果断上了 Redis 做分布式缓存 。02. 接口梳理下一步就是对生产环境现有接口进行统计和梳理 , 确定哪些接口是可以放到缓存中的 , 所以首先要对每一个接口的调用量有大概的统计 , 因为没有接入日志平台 , 所以我采用了最笨的办法 , 一个一个接口的数嘛 。
把工作日某一天全天的日志拉下来 , 我们四台应用服务器 , 每天的日志大概 1 个G , 还好还好;通过 EditPlus 这个工具的【在文件中查找】的功能 , 查询每个接口当天的调用量 , 已上线 30 个接口 , 有几分钟就统计出来了 , 反正是一次性的工作 , 索性就手动统计了;一天也调不了几次的接口 , 就直接忽略掉了 , 我基本上只把日调用量上万的接口都留下来 , 进行下一步的分析 。

推荐阅读