異步跟多線程並非一回事,異步就是與硬盤讀寫有關,性能比多線程稍微高一點、css
多線程的調用方法是BeginInvoke();且只能是隻有一個委託目標。非多播html
異步多線程的三大特性:算法
1.同步卡界面,主線程好比ui線程被佔用,多線程UI線程空閒,只是起到一個通知的做用, 數據庫
具體計算任務交給子線程執行。編程
2.同步慢,由於只有一個線程幹活,異步快是由於多個線程併發計算,這裏也會消耗更多資 緩存
源,不是線程越多越好,(1.資源有限、2.線程調度耗資源、3.不穩定)安全
3.多線程是無序的,不可預測,啓動順訊不肯定,消耗時間不肯定,結束順序不肯定。不要服務器
試圖控制執行的順序數據結構
Thread是前臺線程,啓動後必須執行完纔會退出。 線程啓動的要比委託BeginInvock()要快多線程
一點。委託多線程:是後臺線程,程序進程關了,線程所有強制關閉。通常都用後臺線程
中止線程:靠的不是外部力量,好比線程的註銷方法。而是靠自身,外部設置個信號量。內
部判斷是否true仍是false而是否繼續執行
委託事件:觀察者模式。反射:工廠模式。aop:裝飾模式,代理模式,
多線程的使用方法有哪幾種:
委託同步Invock():
異步beginInvock():
Async:
Thread:
ThreadPool線程池:控制建立和銷燬、控制數量。
Task:方便帶返回值、等待、回調。簡單
Parallal:Task再次封裝,並行計算,優化主線程邏輯,主線程也能夠參與計算,能控制數
量,缺點就是隻能等着。
ThreadCore:
加密算法:
des:對稱可逆加密(也就是解密跟加密的密鑰是同樣的。缺點:密鑰是共享的保存通常信
息)速度稍快
RSA:非對稱加密(一組一堆,兩個密鑰,一個加密鑰,解密鑰。優勢:保證安全性!)速
度稍慢
加密鑰、解密鑰 鑰匙的功能劃分
公鑰 私鑰 公開程度劃分
加密鑰公開,解密鑰揣兜裏。特色:保證內容只有我看的到,防止外傳。就算傳給別人了別
人沒有解密鑰也解不了密解密鑰公開,加密鑰揣兜裏。特色:保證數據不能篡改,必定來自於我。就算你改了我數據那麼,別人拿到解密鑰就解不了密了。
AOP面向切面編程與OOP是互補的,更好的去面向對象:利用Attribute特性:能夠在不破壞類型封裝的前提下,爲對象增長額外的信息,執行額外的操做。每一個類只要考慮好自身的業務,其餘的公共邏輯就放到特性中去處理,好比LoginFilter AOP利用裝飾者模式靜態的方式,給須要執行的類方法塊先後都切入公共邏輯代碼好比驗證
、日誌,異常。方法執行前、後。也可使用.NET Remoting/RemlProry實現動態代理 代理模式 Proxy UnityAOP
EF查詢的時候儘可能用延遲查詢。不要着急ToList();延遲查詢返回的就是IQueryList接口,即時查詢獲得的是IEnumberList接口。
特別是注意要分頁的必定要作‘延遲查詢’,包括排序什麼的,不要先Tolist()後再篩選Skip分頁!
ToList()必定是要放到最後!!
若是是聯表查詢,你不去操做主表的外鍵屬性,ef也不會去主動查外鍵的表內容。除非在查
詢的時候調用dbContext.SD_SYSLOG.Include("SD_USER")就會一次性所有把針對sd_user的
外鍵內容model查出來
0.默認-延遲加載機制
1.主動加載:
在查詢前 dbcontext.Configuration.LazyLoadingEnabled=false;//不延遲加載,不會再次
查詢了,不ToList()仍是會查詢出來。包括多表查詢的子表,關聯字表屬性都是爲null的
2.顯示加載:
在查詢的時候調用dbContext.SD_SYSLOG.Include("SD_USER")就會一次性所有把針對
sd_user的外鍵內容model查出來
3.指定加載:
指定加載的某個實體。循環加載出來的集合後,調用dbcontet.Entry<SD_SYSLOG>
(t_sd_syslog).Collection(c=>c.SD_USER).Load();//集合顯示加載
若是是一對一的話就是Reference(c=>c.SD_USER).Load()//單個屬性用
多表查詢:若是沒有設置外鍵關係也能夠用Linq語句 join方式來查,
若是要作屢次請求的事務就用using(TransactionScope trans=new TransactionScope)
{trans.Complete();//最後須要提交事務}
需求:新增
CodeFirst:以代碼爲中心,若是代碼裏有的鏈接字符串、模型,數據庫沒有,那麼就自動
建立數據庫和表。
dbContext是什麼?:
1.數據庫的映射,包含所有的表
2.管理數據庫鏈接,一個實例一個鏈接
3.SaveChange()是以事務形式來操做的。 本地緩存屬性,查詢數據後。是先放入本地數據
庫,修改、刪除本地屬性,savechange的時候是一次性保存本地屬性的所有變化。
好比在using方法體裏的dbContext操做了數據後,在另外一個using裏全新的dbContext後是操
做不了之前操做的對象的,可是能夠sdContext.SD_USER.Attach(t_sd_user)用Attach方法
把之前操做緩存過的對象附加到當前全新的dbContext上
若是在Attach附加以前把對象的屬性值改了。以後再附加的話再用新的dbContext來
SaveChange保存是沒用的。要想保存成功就得把對象設置爲修改狀態!
dbContext.Entry<SD_USERS>(u).State = EntityState.Modified;
------------------------------------------------------------------------
表名利用特性 [Table(「反射數據庫表名」)]
屬性利用[Column("新字段名")]
IOC:控制反轉(本來上端直接指定使用的對象換成由第三方裝配。)
IOC是目標,實現方式有兩種:1.依賴查找,2.依賴注入
DI:依賴注入 是實現控制反轉的一種手段! 都是利用特性,又分三種都是接口(1.屬性注
入[Dependency],2.構造函數注入[InjectionConstructor],默認找參數最多的構造函數!
3.方法注入[InjectionMethond])
容器單例,線程單例(可用在定時調度裏),
DIP:依賴倒置原則(上層模塊不該該依賴於下層模塊,兩者應該經過抽象來依賴。好比UI
層不該該直接聲明建立其餘層的具體業務細節類對象)
多層架構,BLL層Service類應該按照業務邏輯對應,不該該跟表對應!!
var 不是類型,var聲明的變量在賦值的那一刻,就已經決定了它是什麼類型。
dynamic在運行的時候纔會去肯定具體的類型,能夠簡化反射調用方法什麼的
MVC框架裏的View文件夾裏的Web.config裏配置的是頁面默認引用的命名空間!
Global.asax文件是//網站啓動第一時間執行,並且只執行一次 /// 能夠作單例 變量,比
如註冊IOC
註冊區域,過濾器,路由,組件,組件則是App_Start/BundleConfig.cs 配置映射,Script
名字和,具體有哪些js、css文件。在cshtml頁面可直接使用@Styles.Render
("~/Content/css") 獲取引用配置好的全部js、css文件。
mvc與ioc的整合:利用MVC的初始化,在Global.asax初始化文件設置控制器初始化工廠,重
寫DefaultController建立控制器方法,利用Unity方式來建立控制器,經過讀取配置文件自
動選擇參數最多的構造函數依賴注入。想用哪一個服務就寫在控制器的構造函數賦值!!
return view的時候也會自動釋放,因此也不用using
Request.QueryString["xx"];獲取的是url地址上的參數,
Request.Form["xx"];,Request["xx"];,Request.Params["xx"]獲取的是表單Form提交的
name參數。
App_Start文件夾下的FiterConfig類裏添加的特性屬於整個項目默認添加此特性,好比添加
異常處理特性、登陸權限處理。
特性須要繼承相應的抽象類
mvc 檢測特性流程, 做用(能夠在action先後寫上時間監控性能再存日誌。)
1.OnAuthorization //可檢查用戶登陸
2.OnActionExecuting //執行階段
3.Action //執行Action方法體,不算特性
4.OnActionExecuted//已執行 http緩存就在這裏,緩存後客戶端下次就不會調服務器了
5.OnResultExecuting//render前
6.Render //渲染體吧,不算特性 過程就是把執行好了的html信息寫到Response裏面去輸出
7.OnresultExecuted//render後
OnException異常特性,
通常的過濾器執行順序
IAuthorizationFilter->OnAuthorization(受權)
IActionFilter ->OnActionExecuting(行爲)
Action
IActionFilter ->OnActionExecuted(行爲)
IResultFilter ->OnResultExecuting(結果)
View
IResultFilter ->OnResultExecuted(結果)
*IExceptionFilter ->OnException(異常)
數據庫設計、案例分析、讀寫分離
三大範式:
讀寫分離:把80%讀的業務放在一個數據庫,20%的寫的業務放在某一個數據庫裏。
查詢壓力就分散了。主數據庫就只承載20%壓力。
從數據庫能夠有多個,經過發佈/訂閱 。快照、日誌的方式同步到從數據庫,單會有點延遲,尤爲是大數據量
分庫分表:
1.垂直分庫(按業務劃分成不同的數據庫,好比用戶庫、遊戲前臺庫、後臺庫、金幣庫、物流、倉庫。多臺服務器承載。只有業務關聯不強的時候才能拆分)
2.水平分庫:(按數據分紅不同的庫,多臺服務器承載:好比鏈家網按地區來,華南區、華東區、西南區。)
垂直分表:好比url、imgurl數據多、多個字段穩定,不做爲查詢條件的字段些分出新一張表,給一個外鍵關聯
水平分表:數據多,根據業務特色拆分 訂單表:按照
Type拆分
時間拆分(Histor/多個表,按月來,一個月一張表,若是要查統計總數據就只有定時統計,能夠彙總一個表來統計,下降體驗)
表分區(不經常使用效率不是很好):一個表設計的時候就制定規則,ID在1萬之內存在某個硬盤物理位置,1萬-2萬存其餘物理位置
Radis五大數據結構:
1:String也就是簡單的鍵值對。
2:HashTable散列結構,(「key」,「變量」,」value」),若是要修改的話就用這種
3:Sets集合應該也跟鍵值對差很少,但有去重、,查詢交集,並集,差集。對於一個KEY多個Value的,好比一個好友和多個好友,共同好友,推薦好友。
4:ZSet 有序集合(sorted sets)排序的Set,指定一個數字進去排序,好比統計排行榜之類的能夠用。
5:List 就是隊列!!先進先出,也能夠進程通訊,一個往裏面寫,一個往裏面讀。
Radis的異步隊列:主程序接收輸入任務(例:購買)把數據存入隊列,在另外的多開線程或應用裏循環檢查隊列是否有新數據而後做處理。
SOA微服務分佈式服務,也能夠用隊列來作,
HTTP協議:
協議頭,主機名,請求路徑,組成URL
貓是頁面裏的下拉下滑章節鏈接