首先我們介紹一下MySQL的快取機制
【MySQL快取機制】簡單的說就是快取sql文字及查詢結果,如果執行完全相同的SQL,伺服器直接從快取中取到結果,而不需要再去解析和執行SQL。
但如果表中任何資料或是結構發生改變,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,最簡單的就是我們在SQL語句中多了空格啥的,註釋,或者是大小寫,那麼hashmap中的key和value對應都是不一樣的,那麼使用這個表的所有快取查詢將不再有效。。
快取是對系統效能優化的重要手段。。。
主要是因為
1.MySQL快取是基於Hashmap的:查詢語句的字元大小寫、空格或者註釋的不同,快取查詢都會認為是不同的查詢(因為他們的hash值會不同)
2.MySQL會對每條接收到的SELECT型別的查詢進行hash計算,然後查詢這個查詢的快取結果是否存在。雖然hash計算和查詢的效率已經足夠高了,一條查詢語句所帶來的開銷可以忽略,但一旦涉及到高並行,有成千上萬條查詢語句時,hash計算和查詢所帶來的開銷就必須重視了。。。
3.也就是修改某個表的內容時,之前快取的內容對於現在的資料來說就是錯誤的資料,所以我們要將之前的快取資料刪除,來保證資料的正確性。當向某個表寫入資料的時候,必須將和這個表相關的所有快取設定為失效,如果快取內容很多,則消耗也會很大,可能使系統僵死,因為這個操作是靠全域性鎖操作來保護的。。
總結:
所以綜合上述的內容,我們知道原因就是如果資料都要快取起來,一旦這些資料都發生改變時,需要更改,我們又需要把這些快取刪除,資料量大時,就會很慢,效率低。
解決思路是:把一些容易變動的資料還是存在磁碟上,而不是在快取中,這樣就是省去了快取改來改去的問題。。
解決方案:運用了新的資料庫Redis
介紹一下redis ----Redis是當前比較熱門的NoSQL系統之一---,Redis資料都是快取在計算機記憶體中。。
NoSQL,泛指非關係型的資料庫區別於關聯式資料庫,它們不保證關係資料的ACID特性。。。。
這裡我們又要引入事務的概念,如下:
事務定義
事務是一系列操作組成的工作單元,該工作單元內的操作是不可分割的,即要麼所有操作都做,要麼所有操作都不做,這就是事務。
理解一:
事務可以看做是一次大的活動,它由不同的小活動組成,這些活動要麼全部成功,要麼全部失敗。
理解二:
事務可以看做是一個大的操作,它由一系列操作組成,這些操作要麼全部成功,要麼全部失敗。
ACID---事務的四大特性 ---原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)
A:事務是一個不可分割的整體,事務中的操作要麼全部成功,要麼全部失敗。。
舉一個SQL事務的例子:
begin transaction; update account set money = money-100 where name = '張三'; update account set money = money+100 where name = '李四'; commit transaction;
這裡面的兩個操作必須都成功或者都失敗。。。。。
B:我們來看一段狗屁話:事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態,能理解?????
個人認為就是執行這操作能夠達到你的目的,然後不出錯,在編寫中體現在語法和實現是否可行,在功能上就是可以保證最後的結果和你的想法是一致的。。。
I:隔離性體現在:多個使用者並行存取資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的運算元據所幹擾,多個並行事務之間要相互隔離。
D:永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。
也就是說,給你造成了影響,你一旦告訴我你操作成功了,是不可以不執行的。。。。
本地事務的實現: begin transaction; //1.本地資料庫操作:張三減少100元。 //2.本地資料庫操作:李四增加100元。 commit transaction; 分散式事務的實現: begin transaction; //1.本地資料庫操作:張三減少100元。 //2.遠端呼叫:讓李四增加100元。 commit transaction;