Java、數據庫,前端基礎

前端:

java:


數據庫sql:

數據庫的主從複製,利用mycat做分庫分表。

索引:

索引:用來快速地尋找那些具有特定值的記錄,如果沒有索引,執行查詢時Mysql必須從第一個記錄開始掃描整個表的所有記錄,如果作爲搜索條件的列上已經創建了索引,mysql無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有一千個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。

MySQL索引類型:

mysql提供多種索引類型供選擇:普通索引,唯一索引,主鍵,全文索引,單列索引,與多列索引

知識點:

1.索引可以不唯一。對於唯一索引,很多時候設置唯一索引時是爲了防止插入相同的數據。

2.索引會根據數據庫的變化而更新。


redis:

數據類型:

字符串類型(string),散列類型(hash),列表類型(list),集合類型(set),有序集合類型(zset)。

註釋:鍵值對型式的結構。單線程運行。

Redis集羣:

採用官方提供了 redis-trib.rb工具。

緩存穿透:

指查詢一個一定不存在的數據,由於緩存是不命中時需要從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,造成緩存穿透。

解決辦法:

對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄。還有最常見的則是採用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的bitmap中,一個一定不存在的數據會被這個bitmap攔截掉,從而避免了對底層存儲系統的查詢壓力。
也可以採用一個更爲簡單粗暴的方法,如果一個查詢返回的數據爲空(不管是數 據不存在,還是系統故障),我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鐘。

緩存雪崩:

如果緩存集中在一段時間內失效,發生大量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。

這個沒有完美解決辦法,但可以分析用戶行爲,儘量讓失效時間點均勻分佈。大多數系統設計者考慮用加鎖或者隊列的方式保證緩存的單線程(進程)寫,從而避免失效時大量的併發請求落到底層存儲系統上。

解決方法

1,在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
2,可以通過緩存reload機制,預先去更新緩存,再即將發生大併發訪問前手動觸發加載緩存
3,不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻
4,做二級緩存,或者雙緩存策略。A1爲原始緩存,A2爲拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置爲短期,A2設置爲長期。

mycat:

使用其做分庫分表。

架構:

1、分佈式、集羣、微服務區別:

分佈式:將一個大的系統劃分爲多個業務模塊,業務模塊分別部署到不同的機器上,各個業務模塊之間通過接口進行數據交互。區別分佈式的方式是根據不同機器不同業務。

集羣模式:是不同服務器部署同一套服務對外訪問,實現服務的負載均衡。區別集羣的方式是根據部署多臺服務器業務是否相同。

注:集羣模式需要做好session共享,確保在不同服務器切換的過程中不會因爲沒有獲取到session而中止退出服務。

微服務:爲了不因爲某個模塊的升級和BUG影響現有的系統業務,將模塊拆分成一個獨立的服務單元通過接口來實現數據的交互。微服務與分佈式的細微差別是,微服務的應用不一定是分散在多個服務器上,他也可以是同一個服務器。將模塊拆分成一個獨立的服務單元通過接口來實現數據的交互。分佈式也屬於微服務。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章