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 ...