目录
架构
1.缓存雪崩
状况
缓存雪崩是指大量缓存失效 直接走数据库
缓存在同一时间内大量key过期(失效),接着无数的请求瞬间都落在了数据库中导致连接异常。
数据库无限被请求导致超负载挂掉 不走缓存,重启数据库之后又无限的请求
解决
- 事前:redis高可用,主从+哨兵,redis cluster,避免全盘崩溃
- 事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL挂掉
- 事后:redis持久化RDB+AOF,快速恢复缓存数据
- 缓存的失效时间设置为随机值,避免同时失效
2.缓存穿透
状况
黑客频繁请求不在缓存内的数据 导致不走缓存
恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常,甚至瞬间宕机。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决
- 对请求参数进行校验,不合理直接返回
- 查询不到的数据也放到缓存,value为空,如 set -999 “”
- 使用布隆过滤器,快速判断key是否在数据库中存在,不存在直接返回
第一种是最基本的策略,第二种其实并不常用,第三种比较常用。
为什么第二种并不常用呢?
因为如果黑客构造的请求id是随机数,第二种并不能起作用,反而由于缓存的清空策略,(例如清除最近没有被访问的缓存)导致有用的缓存被清除了。
3.缓存击穿
状况
缓存击穿是指热点数据的缓存失效
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
热点数据 就是 经常使用的数据,当经常使用的缓存失效之后,大量的请求直接打到数据库 导致数据库挂掉
解决
- 设置key永远不过期,或者快过期时,通过另一个异步线程重新设置key
- 当从缓存拿到的数据为null,重新从数据库加载数据的过程上锁,下面写个分布式锁实现的demo
参考:https://blog.csdn.net/zzti_erlie/article/details/104655455
需要学习的内容
- NIO
- Netty
- HTTP
基础
- 分布式技术
- 数据库技术
- 应用开发
- 互联网开源框架
工作技术
- Java并发编程
- 消息中间件
- 源码分析能力
- 微服务技术
提升技术
- JVM调优
- 设计模式
- 数据结构与算法
- 数据库调优
消息中间件
RocketMQ(阿里出品)推荐
RabbitMQ
ActiveMQ(不推荐)
中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;
大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。
分布式
微服务
Apollo 分布式配置中心 动态修改配置信息
Nacos注册和配置中心
SSO
接口幂等性
介绍
防止重复下单等...
接口可重复调用 在调用方多次调用的情况下, 接口最终得到的结果是一致的
解决方案
全局唯一ID Redis
去重表 Mysql
状态机 类似于 乐观锁
通过数据库状态字段限制
风控系统
分布式job
xxl-job
分布式配置中心
- 配置的增删改查;
- 不同环境配置隔离(开发、测试、预发布、灰度/线上);
- 高性能、高可用性;
- 请求量多、高并发;
- 读多写少;
现有的配置中心组件有:Spring Cloud Config、Apollo、Disconf、Diamond 等等
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
https://github.com/ctripcorp/apollo