## 緩存擊穿
**查詢緩存中失效的 key**。大量的請求同時查詢一個 key 時,此時這個 key 正好失效了,就會導致大量的請求都落到數據庫。
:-: 
### 解決方案
1. 互斥鎖:(基本不用次方案)
如果從redis中沒有獲取到數據,就讓一個線程去數據庫查詢數據,然后構建緩存,其他的線程就等著,過一段時間后再從redis中去獲取。
這個方案能解決問題,但是一個線程構建緩存的時候,另外的線程都在睡眠或者輪詢。
2. 后臺續命:
后臺開一個定時任務,專門主動更新即將過期的數據。
設置 key 的時候同時設置過期時間為 60 分鐘,后臺程序在 55 分鐘時,會查詢數據庫并重新緩存60分鐘
3. 永不過期
對熱點數據不設置過期時間
## 緩存穿透
要訪問的數據緩存中沒有,再查詢數據庫,還是沒有。短時間,高密度的訪問此數據,給持久層數據庫造成很大的壓力。
:-: 
### 解決方案
1. 緩存空對象
在數據庫即使查到的是空對象,也把空對象緩存起來。
如果在某個時間,緩存為空的記錄,在數據庫里面有值了,怎么辦?
1. 設置緩存的時候,同時設置一個過期時間,這樣過期之后,就會重新去數據庫查詢最新的數據并緩存起來
2. 如果對實時性要求非常高的話,那就寫數據庫的時候,同時寫緩存。這樣可以保障實時性
3. 如果對實時性要求不是那么高,那就寫數據庫的時候給消息隊列發一條數據,讓消息隊列再通知處理緩存的邏輯去數據庫取出最新的數據
> 對于惡意攻擊,請求的時候key往往各不相同,且只請求一次,那你要把這些key都緩存起來的話,因為每個key都只請求一次,那還是每次都會請求數據庫,怎么辦?—— 布隆過濾器
2. 布隆過濾器
當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就肯定不存在。
利用布隆過濾器先進行校驗,不符合則
丟棄
:-: 
## 緩存雪崩
緩存中大多數的數據在**同一時間過期**,而查詢數據量巨大,這時候,又是緩存中沒有,數據庫中有的情況了。請求都打到數據庫上,引起數據庫流量激增,壓力瞬間增大,直接崩潰。
### 解決方案
1. 互斥鎖
2. 錯峰過期
在設置 key 過期時間的時候,加入一個隨機過期時間,可以避免大量緩存同時過期
3. 緩存集群
4. 限流器+本地緩存
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS