Web開發來一發(七)快取

2021-09-07 18:35:33 字數 1496 閱讀 2458

1、快取雪崩

可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。

解決思路:

1)加鎖計數(即限制併發的數量,可以用semphore)或者起一定數量的佇列來避免快取失效時大量請求併發到資料庫。但這種方式會降低吞吐量。

2)分析使用者行為,然後失效時間均勻分布。或者在失效時間的基礎上再加1~5分鐘的隨機數。

3)如果是某台快取伺服器宕機,則考慮做主備。

2、快取穿透

指使用者查詢資料,在資料庫沒有,自然在快取中也不會有。這樣就導致使用者查詢的時候,在快取中找不到,每次都要去資料庫中查詢。

解決思路: 

1)如果查詢資料庫也為空,直接設定乙個預設值存放到快取,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問資料庫。設定乙個過期時間或者當有值的時候將快取中的值替換掉即可。

2)可以給key設定一些格式規則,然後查詢之前先過濾掉不符合規則的key。

3、快取併發

如果**併發訪問高,乙個快取如果失效,可能出現多個程序同時查詢db,同時設定快取的情況,如果併發確實很大,這也可能造成db壓力過大,還有快取頻繁更新的問題。解決思路: 

對快取查詢加鎖,如果key不存在,就加鎖,然後查db入快取,然後解鎖;其他程序如果發現有鎖就等待,然後等解鎖後返回資料或者進入db查詢。

4、快取預熱

目的就是在系統上線前,將資料載入到快取中。

解決思路: 

1)資料量不大的話,在系統啟動的時候直接載入。

2)自己寫個簡單的快取預熱程式。

1、redis

2、memcached

memcached是乙個高效能的分布式記憶體物件快取系統。

memcached只支援簡單的key/value資料結構,不像redis可以支援豐富的資料型別。

memcached無法進行持久化,資料不能備份,只能用於快取使用,且重啟後資料全部丟失。

memcached可以利用多核優勢,單例項吞吐量極高,可以達到幾十萬qps。

3、mongodb

mongodb是乙個介於關聯式資料庫和非關聯式資料庫之間的nosql資料庫,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的產品。mongodb支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。

mongodb支援的查詢語言非常強大,其語法有點類似於物件導向的查詢語言,幾乎可以實現類似關聯式資料庫單錶查詢的絕大部分功能,而且還支援對資料建立索引。

mongodb適合大資料量的儲存,依賴作業系統vm做記憶體管理,很佔記憶體。

mongodb不支援事務。

4、應用場景

redis適用於對讀寫效率要求都很高,資料處理業務複雜和對安全性要求較高的系統。

mongodb主要解決海量資料的訪問效率問題。

memcached用於在動態系統中減少資料庫負載,適合多讀少寫的場景。

開博第一發

終於鼓起勇氣來開了個人部落格,之前也知道有這個東西,一直不想弄它,個人有些懶散,估計以當時的個想法跟狀態開了部落格只能是寫些文學性質的文章。不會有關於技術的東西出現。現在面臨找工作了,再不專心學學技術說不過去。大學看了不少雜書,個人想法蠻多的,技術卻基本沒有怎麼學過,寫下這篇部落格乙個是給以後的部落...

字典樹入門爽一發

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的...

資料結構 第一發

有改進和優化的地方,希望大家幫助指出。1.1 兩個集合的並 include include using namespace std vector union1 vector a,vector b int main cin.clear while cin a c union1 a,b for int ...