在發現這個小技巧以前,我常常被某些問題困擾,咱們以博客園爲例html
1:是分類名稱web
2:是分類url數據庫
3:點擊分類,進入的頁面,要顯示分類的名稱緩存
4:點擊分類,進入的頁面,要用分類相關參數併發
在平常web的開發中,常常遇到要在頁面上顯示一個分類,而後這個分類的連接要包含這個分類的id等參數(例如爲搜索引擎友好要包含名稱的漢語拼音),而後點擊這個分類的頁面要顯示這個分類的各類信息例如分類名稱,分類讀取搜索接口的地址和參數等。asp.net
尤爲是某些變態的分類,一個條目和一個條目讀取相關信息的方式還不同,還可能很耗時分佈式
這個時候爲了提高系統性能,常常用緩存辦法,尤爲是總體高併發站點(不是某些熱數據形成的併發,而是網站總體的併發比較大),更是頭疼高併發
咱們按照web開發無限細分來看這個問題性能
1 直接讀取數據 ==》 數據庫鏈接數被佔用網站
2 緩存到asp.net自帶的cache ==》我常常偷懶用這個,數據庫鏈接數被佔用的次數減小但不明顯,由於緩存的時間短(緩存長了貌似沒用)
3緩存到分佈式緩存例如Memcache ==》序列化和反序列化形成cpu上升和內網流量上升
3緩存到分佈式緩存例如Memcache+本地cache緩存等 ==》方案較爲複雜
直到最近寫route ,手抖了一下,覺得本身寫錯了
假設 博客園的分類是這麼定義的
public class CnblogsCate { public int id { get;set; } public string name { get; set; } public string search { get; set; } /* 其餘相關的屬性 * */ public List<CnblogsCate> getALL() { List<CnblogsCate> result = new List<CnblogsCate>(); CnblogsCate item = new CnblogsCate(); item.id = 1; item.name = "test"; item.search = "pra=1"; result.Add(item); item = new CnblogsCate(); item.id = 2; item.name = "test2"; item.search = "pra=2"; result.Add(item); return result; //return new List<CnblogsCate> } }
註冊route
CnblogsCate Cate=new CnblogsCate(); var allCate= Cate.getALL(); foreach (CnblogsCate item in allCate) { routes.MapRoute( "Default_" + item.id, // 路由名稱 "Cnblog/"+item.name+"/", // 帶有參數的 URL new { controller = "Cnblogs", action = "Index", Cate = item } // 這裏直接對參數賦值 ); }
這樣在控制器裏面就能夠直接取到想要的數據了
public class CnblogsController : Controller { // // GET: /Cnblogs/ public ActionResult Index(CnblogsCate Cate) { return View(); } }
例如
請求:http://localhost:34197/Cnblog/test/
這樣就能夠和各類複雜的方案說拜拜了,即便是動態添加和刪除分類對應的rout也很簡單,和複雜方案說886