ASP.NET Redis 開發
Redis簡介
Redis是一個開源的,使用C語言編寫,面向“鍵/值”對型別資料的分散式NoSQL資料庫系統,特點是高效能,持久儲存,適應高併發的應用場景。Redis純粹為應用而產生,它是一個高效能的key-value資料庫,並且提供了多種語言的API
效能測試結果表示SET操作每秒鐘可達110000次,GET操作每秒81000次(當然不同的伺服器配置效能不同)。
Redis目前提供五種資料型別:string(字串),list(連結串列), Hash(雜湊),set(集合)及zset(sorted set) (有序集合)
Redis開發維護很活躍,雖然它是一個Key-Value資料庫儲存系統,但它本身支援MQ功能,所以完全可以當做一個輕量級的佇列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試資料分為128Bytes、512Bytes、1K和10K四個不同大小的資料。實驗表明:入隊時,當資料比較小時Redis的效能要高於RabbitMQ,而如果資料大小超過了10K,Redis則慢的無法忍受;出隊時,無論資料大小,Redis都表現出非常好的效能,而RabbitMQ的出隊效能則遠低於Redis。
Redis與Memcached的比較.
1.Memcached是多執行緒,而Redis使用單執行緒.
2.Memcached使用預分配的記憶體池的方式,Redis使用現場申請記憶體的方式來儲存資料,並且可以配置虛擬記憶體。
3.Redis可以實現持久化,主從複製,實現故障恢復。
4.Memcached只是簡單的key與value,但是Redis支援資料型別比較多。
Redis的儲存分為記憶體儲存、磁碟儲存 .從這一點,也說明了Redis與Memcached是有區別的。Redis 與Memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改 操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
Redis有兩種儲存方式,預設是snapshot方式,實現方法是定時將記憶體的快照(snapshot)持久化到硬碟,這種方法缺點是持久化之後如果出現crash則會丟失一段資料。因此在完美主義者的推動下作者增加了aof方式。aof即append only mode,在寫入記憶體資料的同時將操作命令儲存到日誌檔案,在一個併發更改上萬的系統中,命令日誌是一個非常龐大的資料,管理維護成本非常高,恢復重建時間會非常長,這樣導致失去aof高可用性本意。另外更重要的是Redis是一個記憶體資料結構模型,所有的優勢都是建立在對記憶體複雜資料結構高效的原子操作上,這樣就看出aof是一個非常不協調的部分。
其實aof目的主要是資料可靠性及高可用性.
Redis安裝
將服務程式拷貝到一個磁碟上的目錄,如下圖:
檔案說明:
redis-server.exe:服務程式
redis-check-dump.exe:本地資料庫檢查
redis-check-aof.exe:更新日誌檢查
redis-benchmark.exe:效能測試,用以模擬同時由N個客戶端傳送M個 SETs/GETs 查詢.
redis-cli.exe: 服務端開啟後,我們的客戶端就可以輸入各種命令測試了
1、開啟一個cmd視窗,使用cd命令切換到指定目錄(F:\Redis)執行 redis-server.exe redis.conf
2、重新開啟一個cmd視窗,使用cd命令切換到指定目錄(F:\Redis)執行 redis-cli.exe -h 127.0.0.1 -p 6379,其中 127.0.0.1是本地ip,6379是redis服務端的預設埠 (這樣可以開啟一個客戶端程式進行特殊指令的測試).
可以將此服務設定為windows系統服務,下載Redis服務安裝軟體,安裝即可。(https://github.com/rgl/redis/downloads )
安裝完成Redis服務後,我們會在計算機的服務裡面看到
然後啟動此服務。
接下來在使用Redis時,還需要下載C#驅動(也就是C#開發庫),如下圖:
綠色版安裝
redis-server --service-install redis.windows.conf --loglevel verbose --service-name redis --port 6379
Redis常用資料型別
使用Redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用Redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。
Redis最為常用的資料型別主要有以下五種:
- String
- Hash
- List
- Set
- Sorted set
String型別
String是最常用的一種資料型別,普通的key/value儲存都可以歸為此類 。一個Key對應一個Value,string型別是二進位制安全的。Redis的string可以包含任何資料,比如jpg圖片(生成二進位制)或者序列化的物件。基本操作如下:
- var client = new RedisClient("127.0.0.1", 6379);
- client.Set<int>("pwd", 1111);
- int pwd=client.Get<int>("pwd");
- Console.WriteLine(pwd);
- UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };//</span>(底層使用json序列化 )
- client.Set<UserInfo>("userInfo", userInfo);
- UserInfo user=client.Get<UserInfo>("userInfo");
- Console.WriteLine(user.UserName);
- List<UserInfo> list = new List<UserInfo>() { new UserInfo(){UserName="lisi",UserPwd="111"},new UserInfo(){UserName="wangwu",UserPwd="123"} };
- client.Set<List<UserInfo>>("list",list);
- List<UserInfo>userInfoList=client.Get<List<UserInfo>>("list");
- foreach (UserInfo userInfo in userInfoList)
- {
- Console.WriteLine(userInfo.UserName);
- }
Hash型別
Hash是一個string 型別的field和value的對映表。hash特別適合儲存物件。相對於將物件的每個欄位存成單個string 型別。一個物件儲存在hash型別中會佔用更少的記憶體,並且可以更方便的存取整個物件。
作為一個key value存在,很多開發者自然的使用set/get方式來使用Redis,實際上這並不是最優化的使用方法。尤其在未啟用VM情況下,Redis全部資料需要放入記憶體,節約記憶體尤其重要.
增加了序列化/反序列化的開銷,並且在需要修改其中一項資訊時,需要把整個物件取回
Redis為單程序單執行緒模式,採用佇列模式將併發訪問變為序列訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連線並不存在競爭 .. redis是個單執行緒的程式,為什麼會這麼快呢 ?
1、大量執行緒導致的執行緒切換開銷
2、鎖、
3、非必要的記憶體拷貝。
4. Redis多樣的資料結構,每種結構只做自己愛做的事.
Hash對應的Value內部實際就是一個HashMap,實際這裡會有2種不同實現,這個HashMap的成員比較少時,Redis為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的HashMap結構,當成員量增大時會自動轉成真正的HashMap.
Key仍然是使用者ID, value是一個Map,這個Map的key是成員的屬性名,value是屬性值,這樣對資料的修改和存取都可以直接通過其內部Map的Key(Redis裡稱內部Map的key為field), 也就是通過 key(使用者ID) + field(屬性標籤) 就可以操作對應屬性資料了,既不需要重複儲存資料,也不會帶來序列化和反序列化
- client.SetEntryInHash("user", "userInfo", "aaaaaaaaaa");
- List<string> list = client.GetHashKeys("user");
- List<string> list = client.GetHashValues("userInfo");//獲取值
- List<string> list = client.GetAllKeys();//獲取所有的key。
Redis為不同資料型別分別提供了一組引數來控制記憶體使用,我們在前面提到過的Redis Hash的value內部是一個
HashMap,如果該Map的成員比較少,則會採用一維陣列的方式來緊湊儲存該MAP,省去了大量指標的記憶體開銷,這個引數在redis,conf配置檔案中下面2項。
Hash-max-zipmap-entries 64
Hash-max-zipmap-value 512.
含義是當value這個Map內部不超過多少個成員時會採用線性緊湊格式儲存,預設是64,即value內部有64個以下的成員就是使用線性緊湊儲存,超過該值自動轉成真正的HashMap.
Hash-max-zipmap-value含義是當value這個MAP內部的每個成員值長度不超過多少位元組就會採用線性緊湊儲存來節省空間。以上兩個條件任意一個條件超過設定值都會轉成真正的HashMap,也就不會再節省記憶體了,這個值設定多少需要權衡,HashMap的優勢就是查詢和操作時間短。
一個key可對應多個field,一個field對應一個value
這裡同時需要注意,Redis提供了介面(hgetall)可以直接取到全部的屬性資料,但是如果內部Map的成員很多,那麼涉及到遍歷整個內部Map的操作,由於Redis單執行緒模型的緣故,這個遍歷操作可能會比較耗時,而另其它客戶端的請求完全不響應,這點需要格外注意
建議使用物件類別和ID構成鍵名,使用欄位表示物件屬性,字
段值儲存屬性值,例如:car:2 price 500
List型別
list是一個連結串列結構,主要功能是push,pop,獲取一個範圍的所有的值等,操作中key理解為連結串列名字。 Redis的list型別其實就是一個每個子元素都是string型別的雙向連結串列。我們可以通過push,pop操作從連結串列的頭部或者尾部新增刪除元素,這樣list既可以作為棧,又可以作為佇列。Redis list的實現為一個雙向連結串列,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝佇列等也都是用的這個資料結構
- //佇列使用
- client.EnqueueItemOnList("name", "zhangsan");
- client.EnqueueItemOnList("name", "lisi");
- int count= client.GetListCount("name");
- for (int i = 0; i < count; i++)
- {
- Console.WriteLine(client.DequeueItemFromList("name"));
- }
- //棧使用
- client.PushItemToList("name2", "wangwu");
- client.PushItemToList("name2", "maliu");
- int count = client.GetListCount("name2");
- for (int i = 0; i < count; i++)
- {
- Console.WriteLine(client.PopItemFromList("name2"));
- }
Set型別
它是string型別的無序集合。set是通過hash table實現的,新增,刪除和查詢,對集合我們可以取並集,交集,差集.
- //對Set型別進行操作
- client.AddItemToSet("a3", "ddd");
- client.AddItemToSet("a3", "ccc");
- client.AddItemToSet("a3", "tttt");
- client.AddItemToSet("a3", "sssh");
- client.AddItemToSet("a3", "hhhh");
- System.Collections.Generic.HashSet<string>hashset=client.GetAllItemsFromSet("a3");
- foreach (string str in hashset)
- {
- Console.WriteLine(str);
- }
- //求並集
- client.AddItemToSet("a3", "ddd");
- client.AddItemToSet("a3", "ccc");
- client.AddItemToSet("a3", "tttt");
- client.AddItemToSet("a3", "sssh");
- client.AddItemToSet("a3", "hhhh");
- client.AddItemToSet("a4", "hhhh");
- client.AddItemToSet("a4", "h777");
- System.Collections.Generic.HashSet<string>hashset= client.GetUnionFromSets(new string[] { "a3","a4"});
- foreach (string str in hashset)
- {
- Console.WriteLine(str);
- }
- //求交集
- System.Collections.Generic.HashSet<string> hashset = client.GetIntersectFromSets(new string[] { “a3”, “a4” });
- //求差集.
- System.Collections.Generic.HashSet<string> hashset = client.GetDifferencesFromSet("a3",new string[] { "a4"});
返回存在於第一個集合,但是不存在於其他集合的資料。差集
Sorted Set型別
sorted set 是set的一個升級版本,它在set的基礎上增加了一個順序的屬性,這一屬性在新增修改 .元素的時候可以指定,每次指定後,zset(表示有序集合)會自動重新按新的值調整順序。可以理解為有列的表,一列存 value,一列存順序。操作中key理解為zset的名字.
Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過使用者額外提供一個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。當你需要一個有序的並且不重複的集合列表,那麼可以選擇sorted set資料結構,
- client.AddItemToSortedSet("a5", "ffff");
- client.AddItemToSortedSet("a5","bbbb");
- client.AddItemToSortedSet("a5", "gggg");
- client.AddItemToSortedSet("a5", "cccc");
- client.AddItemToSortedSet("a5", "waaa");
- System.Collections.Generic.List<string> list =client.GetAllItemsFromSortedSet("a5");
- foreach (string str in list)
- {
- Console.WriteLine(str);
- }
給Redis設定密碼
安裝redis伺服器後,不能讓其在外網環境下面裸奔啊,我們可以為其設定一個複雜的訪問密碼,最好20位以上,這樣可以有效防止別人暴力破解。
找到redis的配置檔案,預設在這個地方:C:\Program Files\Redis\conf\redis.conf,查詢requirepass選項配置
把這個選項前面的#註釋幹掉,然後在後面新增一個複雜的密碼
# use a very strong password otherwise it will be very easy to break.
#
requirepass [email protected]_yujie
# Command renaming.
帶密碼的訪問
var client = new RedisClient("192.168.2.154", 6379); //ip和埠 client.Password = "[email protected]_yujie"; //redis訪問密碼
ServiceStack.Redis原始碼:https://github.com/ServiceStack/ServiceStack.Redis
注:此文使用的redis C#驅動是1.0版本,目前最新版本為4.0,而且已經開源。
4.0版操作Demo如下:
/* ============================================================================== * 功能描述:ReidsDemo * 創 建 者:Zouqj * 建立日期:2016/4/14/11:40 * 更多redis相關技術請參考我的博文:http://www.cnblogs.com/jiekzou/p/4487356.html ==============================================================================*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //新增如下引用 using ServiceStack.Redis; using ServiceStack.Redis.Generic; using System.Web.Script.Serialization; namespace RedisConsoleApplication1 { // 更多redis相關技術請參考我的博文:http://www.cnblogs.com/jiekzou/p/4487356.html class Program { #region static field static string host = "192.168.2.154";/*訪問host地址*/ static string password = "[email protected]_kjy";/*例項id:密碼*/ static readonly RedisClient client = new RedisClient(host, 6379, password); //static readonly RedisClient client = new RedisClient("xxxxx.m.cnsza.kvstore.aliyuncs.com", 6379, "dacb71347ad0409c:xxxx"); //49正式環境 static IRedisTypedClient<InStoreReceipt> redis = client.As<InStoreReceipt>(); #endregion static void Main(string[] args) { try { RedisTestApp(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } #region redis Test public static void RedisTestApp() { StringTest(); //字串測試 HashTest(); //Hash測試 ObjectTest(); //實體物件測試 SingleObjEnqueueTest(); //單個物件佇列測試 ListObjTest(); //物件列表測試 QueueTest(); //佇列和棧測試 Console.ReadKey(); } #region static method /// <summary> /// 佇列和棧測試 /// </summary> private static void QueueTest() { Console.WriteLine("*******************佇列 先進先出********************"); client.EnqueueItemOnList("test", "饒成龍");//入隊。 client.EnqueueItemOnList("test", "周文傑"); long length = client.GetListCount("test"); for (int i = 0; i < length; i++) { Console.WriteLine(client.DequeueItemFromList("test"));//出隊. } Console.WriteLine("*********************棧 先進後出*****************"); client.PushItemToList("name1", "鄒瓊俊");//入棧 client.PushItemToList("name1", "周文傑"); long length1 = client.GetListCount("name1"); for (int i = 0; i < length1; i++) { Console.WriteLine(client.PopItemFromList("name1"));//出棧. } Console.ReadKey(); } /// <summary> /// 單個物件佇列測試 /// </summary> private static void SingleObjEnqueueTest() { Console.WriteLine("******************實體物件佇列操作********************"); Student _stu = new Student { Name = "張三", Age = 21 }; JavaScriptSerializer json = new JavaScriptSerializer(); client.EnqueueItemOnList("stu", json.Serialize(_stu)); _stu = json.Deserialize<Student>(client.DequeueItemFromList("stu")); Console.WriteLine(string.Format("姓名:{0},年齡{1}", _stu.Name, _stu.Age)); Console.ReadKey(); } /// <summary> /// List物件測試 /// </summary> public static void ListObjTest() { List<InStoreReceipt> list = new List<InStoreReceipt>() { new InStoreReceipt() { IdentityID = 1, ReceiptStatus = 1, ReceiptTime = DateTime.Now, ReceiptMessage = "test1" }, new InStoreReceipt() { IdentityID = 2, ReceiptStatus = 1, ReceiptTime = DateTime.Now, ReceiptMessage = "test2" },new InStoreReceipt() { IdentityID = 3, ReceiptStatus = 1, ReceiptTime = DateTime.Now, ReceiptMessage = "test3" }}; AddInStoreInfo(list); var rList = redis.GetAllItemsFromList(redis.Lists["InStoreReceiptInfoList"]); rList.ForEach(v => Console.WriteLine(v.IdentityID + "," + v.ReceiptTime + "," + v.ReceiptMessage)); redis.RemoveAllFromList(redis.Lists["InStoreReceiptInfoList"]); Console.ReadKey(); } /// <summary> /// 實體物件測試 /// </summary> private static void ObjectTest() { Console.WriteLine("**************實體物件,單個,列表操作*****************"); UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };//</span>(底層使用json序列化 ) client.Set<UserInfo>("userInfo", userInfo); UserInfo user = client.Get<UserInfo>("userInfo"); Console.WriteLine(user.UserName); //List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "222" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } }; //client.Set<List<UserInfo>>("list", list); List<UserInfo> userInfoList = client.Get<List<UserInfo>>("list"); userInfoList.ForEach(u => Console.WriteLine(u.UserName)); client.Remove("list"); Console.ReadKey(); } /// <summary> /// Hash測試 /// </summary> private static void HashTest() { Console.WriteLine("********************Hash*********************"); client.SetEntryInHash("userInfoId", "name", "zhangsan"); var lstKeys= client.GetHashKeys("userInfoId"); lstKeys.ForEach(k => Console.WriteLine(k)); var lstValues=client.GetHashValues("userInfoId"); lstValues.ForEach(v => Console.WriteLine(v)); client.Remove("userInfoId"); Console.ReadKey(); } /// <summary> /// 字串測試 /// </summary> private static void StringTest() { #region 字串型別 Console.WriteLine("*******************字串型別*********************"); client.Set<string>("name", "zouqj"); string userName = client.Get<string>("name"); Console.WriteLine(userName); Console.ReadKey(); #endregion } /// <summary> /// 新增需要回執的進倉單資訊到Redis /// </summary> /// <param name="lstRInStore">進倉單回執資訊列表</param> private static void AddInStoreInfo(List<InStoreReceipt> inStoreReceipt) { IRedisList<InStoreReceipt> rlstRInStore = redis.Lists["InStoreReceiptInfoList"]; rlstRInStore.AddRange(inStoreReceipt); } #endregion #endregion } /// <summary> /// 進倉單回執資訊(對應清關係統) /// </summary> public class InStoreReceipt { /// <summary> /// 主鍵ID /// </summary> public int IdentityID { get; set; } /// <summary> /// 回執狀態 /// </summary> public int ReceiptStatus { get; set; } /// <summary> /// 回執時間 /// </summary> public DateTime ReceiptTime { get; set; } /// <summary> /// 回執資訊 /// </summary>相關推薦
ASP.NET Redis 開發
Redis簡介 Redis是一個開源的,使用C語言編寫,面向“鍵/值”對型別資料的分散式NoSQL資料庫系統,特點是高效能,持久儲存,適應高併發的應用場景。Redis純粹為應用而產生,它是一個高效能的key-value資料庫,並且提供了多種語言的API 效能測試結果表示SET操作每秒鐘可達110000
ASP.NET Zero--開發指南
.html bsp title com 開發 host log class ref ASP.NET Zero--開發指南(Lyhcee 譯) 01. 前期介紹 02. 前期要求 03. 解決方案結構(層) 04. 前端應用程序 05. 後端應用程序 06.WEB
ASP.NET-FineUI開發實踐-18
通過 ner abi loaddata cor 測試 listeners clas asp Grid編輯下垃級聯 看了看專業版的例子,分為以前幾步,都是前端的 1.編輯父下拉框後,重置子下拉框 2.編輯子下垃框前,通過父下垃框數據得到下垃項,然後綁定數據 所以這裏要截
asp.net 網站開發常用方法
.sh sql 進行 構造 file rep ria output sender 生成驗證碼: using System; using System.Data; using System.Configuration; using System.Collections
ASP.NET Core開發Docker部署
以及 及其 tcp ima clas save url lba 最終 ASP.NET Core開發Docker部署,.NET Core支持Docker 部署運行。我們將ASP.NET Core 部署在Docker 上運行。 大家可能都見識過Docker ,今天我們就詳細了
分享一個全開源的ASP.NET快速開發平臺,能快速開發OA CRM ERP 等系統
web 更多 ora 支持 環境 get class don 搭建 bingo炸了 2017/3/30 16:28:14 閱讀(870) 評論(0) 公司業務量比較大,接了很多項目,為了縮短開發周期老板讓我牽頭搭建了一個快速開發平臺。 我們主要的業務是做OA
asp.net core 開發的https證書服務-agilelabs.net
機構 cor line cnblogs .net 中轉 lin .cn csr 創建證書-生成CSR(Certificate Sign Request):填寫證書基本信息接下來我們就可以看到創建的證書簽名請求信息(CSR):為我們剛才創建的CSR簽名:簽名的意思是說通過證書
asp.net -mvc框架復習(1)-ASP.NET網站開發概述
頁面設計 對象 ado 數據庫開發 sqlserve 網站 rip ado.net 面向對象 1.網站開發的基本步驟: 2.網站開發的需要的知識結構 (1)網站開發前臺頁面技術 頁面設計:HTML 、CSS+DIV 頁面特效:JavaScript、jQery (2)
【轉】ASP.NET Core開發之HttpContext
tde ont req build tro use 如何使用 ram web ASP.NET Core中的HttpContext開發,在ASP.NET開發中我們總是會經常用到HttpContext。 那麽在ASP.NET Core中要如何使用HttpContext呢,下面
記:ASP.NET Core開發時部署到IIS上出現HTTP Error 502.5 - Process Failure的解決方案
HTTP Error 502.5 - Process Failure Common causes of this issue: The application process failed to start The application
asp.net通用開發框架,learun v7.0權限管理及工作流配置
app 公司業務量比較大,接了很多項目,為了縮短開發周期老板讓我牽頭搭建了一個敏捷開發框架。 我們主要的業務是做OA、CRM、ERP一類的管理系統,一個通用的後臺搭出來,再配合一些快速開發的組件開發效率能提高很多。 另外老板一再強調要支持APP開發,一次開發能部署到
使用ASP.NET Core開發GraphQL伺服器 -- 預備知識(上)
為了介紹使用ASP.NET Core構建GraphQL伺服器,本文需要介紹一下GraphQL,其實看官網的文件就行。 什麼是GraphQL? GraphQL 既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL 對你的 API 中的資料提供了一套易於理解的完整描述,使得客戶
使用ASP.NET Core開發GraphQL伺服器 -- 預備知識(下)
處理資料 巢狀欄位 看例子: 我想檢視viewer下的repositories。注意裡面的edges,一旦看到這個詞,通常就表示有連線到某個陣列的資料。在這裡就是一個集合的repository。 edges裡面的node代表viewer列表裡不同的repository。 查詢報錯了,因為這裡
【視訊】使用ASP.NET Core開發GraphQL服務
GraphQL 既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL來自Facebook,它於2012年開始開發,2015年開源。 GraphQL與程式語言無關,可以使用很多種語言/框架來構建Graph 伺服器,包括.NET Core。 像Github,Pinterest
Asp.Net Core 開發並部署到Ubuntu
涉及:Asp.Net Core Webapi Ubuntu伺服器 Nginx代理 Asp.Net Core WebApi 開發 建立Asp.Net Core WebApi程式 建立一個簡單的測試案例就可以了, using System; using System.Collection
ASP.Net: EshineASPNet-基於ASP.Net敏捷開發開源框架
筆者從事asp.NET開發多年,這裡把一套基於asp.Net的比較完善的網站開源分享給大家,主要是幫助新人學習。本框架包含了諸多功能,在實際專案中使用了超過4年時間,相關的工具和核心程式碼可靠性相對比較完善,三層架構也是源於網路回饋網路。部分頁面是由刪除原業務邏輯得到,
解析ASP.NET Mvc開發之查詢資料例項
目錄: -------------------------------------------------------------------------------------------
Asp.net Mvc開發體會點滴 一
大家中秋快樂,^^,近幾日較忙抽點時間把寫了快一個星期的日誌發出來下,下面有一些是實驗驗證,有一些的直觀感覺,所以難免有錯,希望眾兄弟指正 以下是這些日子來使用Asp.net Mvc的部分心得與體會 何時使用Helper 其實使用Helper效能不是太高,能免即免,不過可以在以下場合使用 1.存在Ur
開源:ASP.NET Aries 開發框架(已支援.NET Core)
前言: 隨著歲月的推進,不知不覺已在.NET這領域上戰鬥了十年了。 青春還沒來得急好好感受,卻已是步入健忘之秋的老人一枚了。 趁著還有點記憶,得趕緊把硬盤裡那私藏的80G除外的東西,和大夥分享分享。 畢竟,人生,本就是一個傳承的過程:開源,是一種的方式。 好吧,人生嘆個三兩句囉嗦完,得回正題了:
ASP.NET Core 開發:中介軟體
ASP.NET Core開發,開發並使用中介軟體(Middleware)。中介軟體是被組裝成一個應用程式管道來處理請求和響應的軟體元件。每個元件選擇是否傳遞給管道中的下一個元件的請求,並能之前和下一組分在管道中呼叫之後執行特定操作。 具體如圖: 開發中間件(Mid