rsa非對(duì)稱加密:
利用了單向函數(shù)正向求解很簡(jiǎn)單,反向求解很復(fù)雜的特性。
- 隨機(jī)選取兩個(gè)質(zhì)數(shù)p1,p2, n = p1*p2
- 隨機(jī)選一個(gè)整數(shù)e,與φ(n) = (p1-1)*(p2-1)互為質(zhì)數(shù)
- 加密過(guò)程(m^e) mod n = c,m是原信息,c為加密后的信息,n,e為公鑰
- 解密過(guò)程(c^d) mod n = m,d為解密密鑰
- d的求解很復(fù)雜,求解結(jié)果是d = (k*φ(n) + 1)/e
多線程充分利用多核 CPU
一個(gè)cpu只能處理一個(gè)線程,多核心技術(shù)是將多個(gè)一樣的CPU放置于一個(gè)封裝內(nèi)(或直接將兩個(gè)CPU做成一個(gè)芯片),而英特爾的HT技術(shù)是在CPU內(nèi)部?jī)H復(fù)制必要的資源、讓CPU模擬成兩個(gè)線程;也就是一個(gè)實(shí)體核心,兩個(gè)邏輯線程,在一單位時(shí)間內(nèi)處理兩個(gè)線程的工作,模擬實(shí)體雙核心、雙線程運(yùn)作。
相關(guān)參考鏈接:https://blog.csdn.net/huayushuangfei/article/details/79921638
mysql
-
事務(wù)的隔離級(jí)別
innodb
- 行級(jí)鎖
- 支持外鍵(保持?jǐn)?shù)據(jù)一致性)
- 默認(rèn)隔離級(jí)別:可重復(fù)讀RR
3.1 快照讀模式(select)
可以解決臟讀、不可重復(fù)讀和幻讀問(wèn)題,快照讀模式下通過(guò)MVCC來(lái)解決
3.2 當(dāng)前讀模式(update、insert寫(xiě)等操作)
當(dāng)前讀情況下解決幻讀需要加鎖(記錄鎖+間隙鎖 或者 臨鍵鎖(Next-Key Locks))
3.3 MVCC(多版本并發(fā)控制)
InnoDB的MVCC,是通過(guò)在每行記錄后面保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn):系統(tǒng)版本號(hào)和刪除時(shí)的版本號(hào)
解決快照讀模式下,幻讀問(wèn)題;
快照讀:執(zhí)行select操作;其余是當(dāng)前讀,所以,mvvc不能根本上解決幻讀的情況
3.4 臟讀
事務(wù)A讀取了事務(wù)B修改了但是未提交的數(shù)據(jù),但是B事務(wù)由于某種原因?qū)е率聞?wù)回滾,但是A讀取的仍然是事務(wù)B回滾之前的數(shù)據(jù)
3.5 不可重復(fù)讀:
事務(wù)A讀取了一條數(shù)據(jù),這時(shí)事務(wù)B將該條數(shù)據(jù)修改,事務(wù)A再次讀取該條數(shù)據(jù)時(shí),和最開(kāi)始讀取的數(shù)據(jù)不一致
3.3 幻讀:
事物A讀取了一批數(shù)據(jù),這時(shí)事務(wù)B再向表單中insert了一些數(shù)據(jù),事務(wù)A再次讀取時(shí),會(huì)發(fā)現(xiàn)多了數(shù)據(jù),出現(xiàn)幻讀
3.4 記錄鎖
對(duì)行加鎖:select * from user where userid = 1 for update;
3.5 間隙鎖(gap鎖)
對(duì)區(qū)間加鎖:select * from user where userid between 1 and 3 for update;
3.6 臨鍵鎖 next-key locks
結(jié)合記錄鎖+間隙鎖,它的封鎖范圍,既包含索引記錄,又包含索引區(qū)間。
- innodb也會(huì)鎖表
當(dāng)執(zhí)行update等操作時(shí),會(huì)對(duì)操作影響的記錄加上行鎖和間隙鎖。而業(yè)務(wù)的SQL語(yǔ)句update條件沒(méi)有索引,所以就導(dǎo)致了全表被鎖了
ElasticSearch
基于lucene的搜索引擎,在復(fù)雜過(guò)濾查詢時(shí)效率更高。
1.涉及到多條件過(guò)濾、模糊查詢時(shí),mysql查詢很慢;
2.涉及到count條目計(jì)算時(shí),InnoDB不保存表的具體行數(shù),需要全表掃描(MyISAM保存了行數(shù))。es只需去查字段對(duì)應(yīng)posting list的大小就行
- 全文檢索(可以將關(guān)鍵字進(jìn)行拆分):
select * from employee where emp_name like '張大三%';
在mysql中模糊查詢時(shí),查詢時(shí)不支持拆分(沒(méi)法查詢'大三'),每次掃描都需要匹配那個(gè)文本的所有的字符,確認(rèn)是否包含搜索的關(guān)鍵字;
倒排索引
建立term index 字典樹(shù)結(jié)構(gòu)(存放在內(nèi)存)
聯(lián)合索引查找時(shí),合并采用跳表,并使用Roaring Bitmap(改進(jìn)bitset)做緩存進(jìn)一步加速合并
分片
索引可以分片,每個(gè)分片存儲(chǔ)部分?jǐn)?shù)據(jù)。
分片的好處:
- 支持橫向擴(kuò)展;比如數(shù)據(jù)量為3t,每個(gè)分片就存儲(chǔ)1個(gè)t的數(shù)據(jù)
- 提高性能;數(shù)據(jù)分布在多臺(tái)機(jī)器上,所有的操作會(huì)在多臺(tái)機(jī)器上并行分布式執(zhí)行,提高了吞吐量和性能
- es腦裂問(wèn)題
即集群中不同的節(jié)點(diǎn)對(duì)于master的選擇出現(xiàn)了分歧,出現(xiàn)了多個(gè)master競(jìng)爭(zhēng),導(dǎo)致主分片和副本的識(shí)別也發(fā)生了分歧,對(duì)一些分歧中的分片標(biāo)識(shí)為了壞片
原因:
- 網(wǎng)絡(luò)問(wèn)題:網(wǎng)絡(luò)延遲大,誤以為master節(jié)點(diǎn)無(wú)響應(yīng)
- 節(jié)點(diǎn)負(fù)載:主節(jié)點(diǎn)的角色既為master又為data
解決方法:
- 增加節(jié)點(diǎn)狀態(tài)的響應(yīng)時(shí)間
- 控制候選節(jié)點(diǎn)數(shù)在一般以上
- master節(jié)點(diǎn)和data節(jié)點(diǎn)做到角色分離,減少節(jié)點(diǎn)附在壓力
每個(gè)分片的數(shù)據(jù)是有多個(gè)備份的;每個(gè)分片有一個(gè)primary shard,負(fù)責(zé)寫(xiě)入,數(shù)據(jù)同步到多個(gè)replica shard,負(fù)責(zé)讀;讀寫(xiě)分離。
- 集群部署
es集群通過(guò)選舉,選舉一個(gè)節(jié)點(diǎn)為master節(jié)點(diǎn)。
多個(gè)候選主節(jié)點(diǎn),數(shù)量維持在一半以上。
master節(jié)點(diǎn):維護(hù)索引元數(shù)據(jù)、負(fù)責(zé)切換 primary shard 和 replica shard 身份。
如果master節(jié)點(diǎn)掛掉了,會(huì)在候選主節(jié)點(diǎn)內(nèi)選舉出一個(gè)新的master節(jié)點(diǎn)。
primary shard掛了之后,其所屬的replica shard會(huì)稱為新的primary shard,primary shard修復(fù)之后,會(huì)成為replica shard。
celery分布式隊(duì)列服務(wù)
任務(wù)發(fā)布者:后端代碼編寫(xiě)任務(wù)函數(shù)
任務(wù)調(diào)度器:讀取配置文件,周期性的將配置中到期的任務(wù)發(fā)送到任務(wù)隊(duì)列
消息中間件(Broker):redis做消息隊(duì)列
任務(wù)執(zhí)行單元:worker
- 支持異步任務(wù)、定時(shí)任務(wù)
- 任務(wù)執(zhí)行單元:多進(jìn)程事件驅(qū)動(dòng)模型;配置進(jìn)程池,主進(jìn)程從消息隊(duì)列取任務(wù),分發(fā)給進(jìn)程中中的子進(jìn)程,工作進(jìn)程采用事件驅(qū)動(dòng)模型,使用epoll實(shí)現(xiàn)io多路復(fù)用,監(jiān)聽(tīng)內(nèi)核的讀寫(xiě)就緒,并執(zhí)行相應(yīng)回調(diào)。
