什么是缓存穿透?如上图所表述, 简单来说:一个 key 在所有缓存中都不存在,并且在 mysql 中也不存在,叫做缓存穿透
根源就在于不存在的 key,考虑一个场景,如果大量不存在的 key 穿透到 mysql,恐怖的事情就来了,很有可能 mysql 被压死
缓存穿透解决方案
我们的缓存穿透解决方案,其实非常简单:每次从源服务(商品服务)查询到的数据为空,就说明这个数据根本就不存在,需要往 redis 和 ehcache 等缓存中写入一条空数据。
另外再配合缓存变更监听推送事件,能让缓存中的空商品信息及时的被变更
代码中解决
GetProductInfoOfMysqlCommand
@Override
protected ProductInfo run() throws Exception {
// 假设 100 的 id 是数据库中不存在的
// 这里返回一个空的
// 这里只是模拟从 mysql 查询
if (productId == 100) {
ProductInfo productInfo = new ProductInfo();
productInfo.setId(productId);
return productInfo;
}
String productInfoJSON = "{\"id\": 1, \"name\": \"\", \"price\": , \"pictureList\":\"a.jpg,b.jpg\", \"specification\": \"iphone7的规格\", \"service\": \"iphone7的售后服务\", \"color\": \"红色,白色,黑色\", \"size\": \"5.5\", \"shopId\": 1," +
"\"modifyTime\":\"2019-05-13 22:00:00\"}";
ProductInfo productInfo = JSONObject.parseObject(productInfoJSON, ProductInfo.class);
return productInfo;
}
在页面上展示时全是 null
高并发场景下的 nginx 缓存失效导致 redis 压力倍增问题以及解决方案
什么是缓存失效?
我们在 nginx 中设置本地缓存时,给了一个过期时间,比如是 10 分钟, 10 分钟后会自动过期,这个就叫做缓存失效
缓存失效的问题
比如同时来了 1000 个请求,10 分钟后会失效(同时来,也是同时失效), 这就会导致大量的请求高并发到 redis 上去了,同时网络负载也会加重
缓存失效解决方案
解决的核心思路就是:让所有缓存的过期时间尽量保证不在同一时间失效,可以使用一个过期区间, 在这个区间内随机过期时间
缓存架构课程总结
-
亿级流量电商网站的商品详情页系统架构
-
面临难题:对于每天上亿流量,拥有上亿页面的大型电商网站来说,能够支撑高并发访问, 同时能够秒级让最新模板生效的商品详情页系统的架构是如何设计的?
-
解决方案:异步多级缓存架构 + nginx 本地化缓存 + 动态模板渲染的架构
-
-
redis 企业级集群架构
-
面临难题:如何让 redis 集群支撑几十万 QPS 高并发 + 99.99% 高可用 + TB 级海量数据 + 企业级数据备份与恢复?
-
解决方案:redis 的企业级备份恢复方案 + 复制架构 + 读写分离 + 哨兵架构 + redis cluster 集群部署
-
-
多级缓存架构设计
-
面临难题:如何将缓存架构设计的能够支撑高性能以及高并发到极致?同时还要给缓存架构最后的一个安全保护层?
-
解决方案:nginx 抗热点数据 + redis 抗大规模离散请求 + ehcache 抗 redis 崩溃的三级缓存架构
-
-
数据库 + 缓存双写一致性解决方案
-
面临难题:高并发场景下,如何解决数据库与缓存双写的时候数据不一致的情况?
-
解决方案:异步队列串行化的数据库 + 缓存双写一致性解决方案
-
-
缓存维度化拆分解决方案
-
面临难题:如何解决大 value 缓存的全量更新效率低下问题?
-
解决方案:商品缓存数据的维度化拆分解决方案
-
-
缓存命中率提升解决方案
-
面临难题:如何将缓存命中率提升到极致?
-
解决方案:双层 nginx 部署架构 + lua 脚本实现一致性 hash 流量分发策略
-
-
缓存并发重建冲突解决方案
-
面临难题:如何解决高并发场景下,缓存重建时的分布式并发重建的冲突问题?
-
解决方案:基于 zookeeper 分布式锁的缓存并发重建冲突解决方案
-
-
缓存预热解决方案
-
面临难题:如何解决高并发场景下,缓存冷启动导致 MySQL 负载过高,甚至瞬间被打死的问题?
-
解决方案:基于 storm 实时统计热数据的分布式快速缓存预热解决方案
-
-
热点缓存自动降级方案
-
面临难题:如何解决热点缓存导致单机器负载瞬间超高?
-
解决方案:基于 storm 的实时热点发现+毫秒级的实时热点缓存负载均衡降级
-
-
高可用分布式系统架构设计
-
面临难题:如何解决分布式系统中的服务高可用问题?避免多层服务依赖因为少量故障导致系统崩溃?
-
解决方案:基于 hystrix 的高可用缓存服务,资源隔离 + 限流 + 降级 + 熔断 + 超时控制
-
-
复杂的高可用分布式系统架构设计
-
面临难题:如何针对复杂的分布式系统将其中的服务设计为高可用架构?
-
解决方案:基于 hystrix 的容错 + 多级降级 + 手动降级 + 生产环境参数优化经验 + 可视化运维与监控
-
-
缓存雪崩解决方案
-
面临难题:如何解决恐怖的缓存雪崩问题?避免给公司带来巨大的经济损失?
-
解决方案:全网独家的事前 + 事中 + 事后三层次完美缓存雪崩解决方案
-
-
缓存穿透解决方案
-
面临难题:如何解决高并发场景下的缓存穿透问题?避免给 MySQL 带来过大的压力?
-
解决方案:缓存穿透解决方案
-
-
缓存失效解决方案
-
面临难题:如何解决高并发场景下的缓存失效问题?避免给 redis 集群带来过大的压力?
-
解决方案:基于随机过期时间的缓存失效解决方案
-
硬件规划:这里以每日上亿流量,高峰 QPS 过 1万 来大概估计下
-
nginx 部署,因为抗了大量(百分之八九十)请求,所以负载很重,使用 16 核 32G,建议给 3~5 台以上就非常充裕了,每台抗个几千 QPS
-
缓存服务部署,4 核 8G,按照每台 QPS 支撑 500,部署个 10~20 台
-
redis 部署,每台给 8 核 16G(原因是 redis 快照机制不能给太多内存),根据数据量以及并发读写能力来看,部署 5~10 个 master,每个 master 挂一个 slave,主要是为了支撑更多数据量,1万 并发读写肯定没问题了