[TOC]
## 緩存穿透
>緩存穿透,是指查詢一個數據庫一定不存在的數據。
解決辦法
(1)采用布隆過濾器BloomFilter
將所有可能存在的數據哈 希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個 bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力
(2)緩存空值
如果一個查詢返回的數據為空(不管是數據不 存在,還是系統故障)我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鐘。 通過這個直接設置的默認值存放到緩存,這樣第二次到緩沖中獲取就有值了,而不會繼續訪問數據庫
(3)接口限流與熔斷、降級
重要的接口一定要做好限流策略,防止用戶惡意刷接口,同時要降級準備,當接口中的某些服務不可用時候,進行熔斷,失敗快速返回機制。
## 緩存雪崩
>緩存雪崩,是指在某一個時間段,緩存集中過期失效。
(1)加鎖排隊
key: whiltList value:1000w個uid 指定setNx whiltList value nullValue mutex互斥鎖解決,Redis的SETNX去set一個mutex key, 當操作返回成功時,再進行load db的操作并回設緩存; 否則,就重試整個get緩存的方法
(2) 數據預熱
緩存預熱就是系統上線后,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在用戶請求的時候,先查詢數據庫,然后再將數據緩存的問題!用戶直接查詢事先被預熱的緩存數據!可以通過緩存reload機制,預先去更新緩存,再即將發生大并發訪問前手動觸發加載緩存不同的key
(3) 雙層緩存策略
C1為原始緩存,C2為拷貝緩存,C1失效時,可以訪問C2,C1緩存失效時間設置為短期,C2設置為長期。
(4) 定時更新緩存策略
失效性要求不高的緩存,容器啟動初始化加載,采用定時任務更新或移除緩存,
(5)不同過期時間
設置不同的過期時間,讓緩存失效的時間點盡量均勻
(6)熱點數據永不過期
部分用戶訪問特別頻繁的熱點數據,設置永不過期
## 緩存擊穿
緩存擊穿是指一個 Key 非常熱點,在不停地扛著大量的請求,大并發集中對這一個點進行訪問,當這個 Key 在失效的瞬間,持續的大并發直接落到了數據庫上,就在這個 Key 的點上擊穿了緩存。
解決辦法
1. 互斥鎖,并行請求改為串行
2. 熱點數據永不過期
- 消息隊列
- 為什么要用消息隊列
- 各種消息隊列產品的對比
- 消息隊列的優缺點
- 如何保證消息隊列的高可用
- 如何保證消息不丟失
- 如何保證消息不會重復消費?如何保證消息的冪等性?
- 如何保證消息消費的順序性?
- 基于MQ的分布式事務實現
- Beanstalk
- PHP
- 函數
- 基礎
- 基礎函數題
- OOP思想及原則
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收機制
- php-fpm相關
- 高級
- 設計模式
- 排序算法
- 正則
- OOP代碼基礎
- PHP運行原理
- zavl
- 網絡協議new
- 一面
- TCP和UDP
- 常見狀態碼和代表的意義以及解決方式
- 網絡分層和各層有啥協議
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 鎖
- 索引
- 事務
- 高可用?高并發?集群?
- 其他
- 主從復制
- 主從復制數據延遲
- SQL的語?分類
- mysqlQuestions
- Redis
- redis-question
- redis為什么那么快
- redis的優缺點
- redis的數據類型和使用場景
- redis的數據持久化
- 過期策略和淘汰機制
- 緩存穿透、緩存擊穿、緩存雪崩
- redis的事務
- redis的主從復制
- redis集群架構的理解
- redis的事件模型
- redis的數據類型、編碼、數據結構
- Redis連接時的connect與pconnect的區別是什么?
- redis的分布式鎖
- 緩存一致性問題
- redis變慢的原因
- 集群情況下,節點較少時數據分布不均勻怎么辦?
- redis 和 memcached 的區別?
- 基本算法
- MysqlNew
- 索引new
- 事務new
- 鎖new
- 日志new
- 主從復制new
- 樹結構
- mysql其他問題
- 刪除
- 主從配置
- 五種IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何實現手機掃碼登錄功能
- laravel框架的生命周期