成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

緩存常見問題及解決方案

開發(fā) 前端 數(shù)據(jù)庫
使用緩存可以緩解大流量壓力,顯著提高程序的性能。我們在使用緩存系統(tǒng)時,尤其是大并發(fā)情況下,經(jīng)常會遇到一些“疑難雜癥”。本文總結(jié)了一些使用緩存時常見的問題及解決方案,以后在遇到這類問題時可以作為參考,在設(shè)計緩存系統(tǒng)的時候也應(yīng)該考慮這些常見的情況。

 使用緩存可以緩解大流量壓力,顯著提高程序的性能。我們在使用緩存系統(tǒng)時,尤其是大并發(fā)情況下,經(jīng)常會遇到一些“疑難雜癥”。本文總結(jié)了一些使用緩存時常見的問題及解決方案,以后在遇到這類問題時可以作為參考,在設(shè)計緩存系統(tǒng)的時候也應(yīng)該考慮這些常見的情況。

[[278465]]

為了表述方便,本文以數(shù)據(jù)庫查詢緩存為例,使用緩存可以減小對數(shù)據(jù)庫的壓力。

緩存穿透

我們在使用緩存時,往往先嘗試去緩存中取值,如果沒有,再去數(shù)據(jù)庫取值,如果數(shù)據(jù)庫也沒有值,則根據(jù)業(yè)務(wù)需求,返回空或者拋異常。

如果用戶一直訪問一個數(shù)據(jù)庫不存在的數(shù)據(jù),比如id為-1的數(shù)據(jù),就會導(dǎo)致每次請求都會先去緩存查一次,然后再去數(shù)據(jù)庫查一次,造成嚴(yán)重的性能問題。這種情況就叫緩存穿透。

解決方案

以下幾種解決方案:

  • 對請求參數(shù)做校驗,比如用戶鑒權(quán)校驗,id做基礎(chǔ)校驗,id <= 0的直接攔截。
  • 如果查詢到數(shù)據(jù)庫沒有值,也將對應(yīng)的key存進(jìn)緩存中,value為null。這樣下次查詢就直接從緩存返回了。但這里的key的緩存時間應(yīng)該比較短,比如30s。防止后面在數(shù)據(jù)庫插入了這條數(shù)據(jù),而用戶獲取不到。
  • 使用布隆過濾器,判斷一個key是否已經(jīng)查過了,如果已經(jīng)查過了,就不去數(shù)據(jù)庫查詢。

緩存擊穿

緩存擊穿指的是,一個key的訪問量非常大,比如某秒殺活動,有1w/s的并發(fā)量。這個key在某一時刻過期,那這些大量的請求就會一瞬間到數(shù)據(jù)庫,數(shù)據(jù)庫可能會直接崩潰。

解決方案

緩存擊穿的解決方案也有幾種,可以配合使用:

  • 對于熱點數(shù)據(jù),慎重考慮過期時間,確保熱點期間key不會過期,甚至有些可以設(shè)置永不過期。
  • 使用互斥鎖(比如Java的多線程鎖機(jī)制),第一個線程訪問key的時候就鎖住,等查詢數(shù)據(jù)庫返回后,把值插入到緩存后再釋放鎖,這樣后面的請求就可以直接取緩存里面的數(shù)據(jù)了。

緩存雪崩

緩存雪崩指的是,在某一時刻,多個key失效。這樣就會有大量的請求從緩存中獲取不到值,全部到數(shù)據(jù)庫。還有另一種情況,就是緩存服務(wù)器宕機(jī),也算做緩存雪崩。

解決方案

針對上述兩種情況,緩存雪崩有兩種解決方案:

  • 對每個key的過期時間設(shè)置一個隨機(jī)值,而不是所有key都相同。
  • 使用高可用的分布式緩存集群,確保緩存的高可用性,比如redis-cluster。

雙寫不一致

在使用數(shù)據(jù)庫緩存的時候,讀和寫的流程往往是這樣的:

  • 讀取的時候,先讀取緩存,如果緩存中沒有,就直接從數(shù)據(jù)庫中讀取,然后取出數(shù)據(jù)后放入緩存
  • 更新的時候,先刪除緩存,再更新數(shù)據(jù)庫

所謂雙寫不一致,就是在發(fā)生寫操作(更新)的時候或?qū)懖僮髦螅赡軙嬖跀?shù)據(jù)庫里面的值和緩存中的值不同的情況。

為什么更新的時候要先刪除緩存,再更新數(shù)據(jù)庫?因為如果先更新數(shù)據(jù)庫,然后在刪除緩存的時候失敗了,就會造成緩存里面的值和數(shù)據(jù)庫的值不一致。

然而這樣并不能完全避免雙寫不一致問題。假設(shè)在大并發(fā)情景下,一個線程先刪除緩存,然后取更新數(shù)據(jù)庫,這個時候另一個線程去取緩存,發(fā)現(xiàn)沒有值,于是去讀數(shù)據(jù)庫,然后把數(shù)據(jù)庫舊的值設(shè)置進(jìn)緩存。等第一個線程更新完數(shù)據(jù)庫后,數(shù)據(jù)庫里面就是新的值,而緩存里面是舊的值,所以就存在了數(shù)據(jù)不一致的問題。

一個比較簡單的解決辦法是把過期時間設(shè)置得比較低,這樣就只有在緩存沒過期之前存在數(shù)據(jù)不一致問題,在一些業(yè)務(wù)場景下也還能接受。

另一種解決方案是使用隊列輔助。先更新數(shù)據(jù)庫,再刪除緩存。如果刪除失敗,就放進(jìn)隊列。然后另一個任務(wù)從隊列中取出消息,不斷去重試刪除相應(yīng)的key。

還有一種解決方案是使用對一個數(shù)據(jù)使用一個隊列,使讀寫操作串行化。比如對id為n的數(shù)據(jù)建立一個隊列。對這條數(shù)據(jù)的寫操作,刪除緩存后,放進(jìn)一個隊列;然后另一個線程過來了,發(fā)現(xiàn)沒有緩存,則把這個讀操作也放進(jìn)這個隊列里面。

不過這樣會增加程序的復(fù)雜性,串行化也會降低程序的吞吐量,可能得不償失。一般主流的解決方案還是先刪除緩存,再更新數(shù)據(jù)庫。可以滿足絕大部分需求。

責(zé)任編輯:華軒 來源: xy的技術(shù)圈
相關(guān)推薦

2010-08-31 16:09:04

DIV+CSS

2024-07-08 08:45:41

2016-09-27 21:14:53

JavaURL

2011-07-26 16:05:19

Oracle數(shù)據(jù)庫服務(wù)器

2014-01-07 13:54:02

HadoopYARN

2010-09-01 14:51:12

CSSIEFirefox

2021-05-18 08:21:38

React HooksReact前端

2024-10-30 11:00:00

Python列表索引

2024-05-24 10:56:24

PythonURL代碼

2024-06-24 00:30:00

2010-08-04 10:20:30

Flex組件開發(fā)

2023-04-12 11:32:33

網(wǎng)絡(luò)

2019-04-04 13:11:37

React內(nèi)存泄露memory leak

2010-08-26 12:59:29

marginCSS

2025-01-09 15:28:30

2025-02-19 08:00:00

移動端移動設(shè)備移動開發(fā)

2024-05-09 15:00:38

Python編碼開發(fā)

2021-08-20 15:49:13

電腦主板維修

2010-10-08 16:31:08

AjaxIE6

2009-12-24 11:13:41

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品视频免费观看 | 91精品国产日韩91久久久久久 | 在线视频中文字幕 | 国产精品亚洲成在人线 | 一区二区三区四区电影视频在线观看 | av网站在线播放 | 国产天堂 | 三级av在线 | 国产主播第一页 | 亚洲视频在线观看 | av在线播放不卡 | 日本一区二区高清不卡 | 久久久久国产 | 国产精品久久久久久久午夜 | 亚洲视频不卡 | 在线免费激情视频 | 99久久久久久久 | 国产精品视频一区二区三区四蜜臂 | 久草电影网 | 精品日韩一区二区 | 中文字幕久久精品 | 亚洲欧美在线视频 | 国产欧美精品一区二区三区 | 日日干夜夜草 | 国产午夜精品久久久久免费视高清 | 国内自拍视频在线观看 | 日本成人二区 | 午夜精品一区二区三区在线观看 | 日本a视频 | 自拍视频国产 | 国产乱xxav | 午夜精品久久久久久久99黑人 | 免费在线观看黄网站 | 午夜天堂精品久久久久 | 亚洲精品电影网在线观看 | 天天操操 | 亚洲一区二区久久 | 成人欧美一区二区三区 | 国产日韩欧美在线 | 4h影视| 99精品一区二区三区 |