日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
調(diào)整程序架構(gòu)的思維記改進(jìn)程序緩存的經(jīng)歷

實(shí)際情況:

創(chuàng)新互聯(lián)于2013年開(kāi)始,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元濟(jì)陽(yáng)做網(wǎng)站,已為上家服務(wù),為濟(jì)陽(yáng)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

1:當(dāng)公司的網(wǎng)站訪問(wèn)量達(dá)到每天幾十萬(wàn)IP時(shí),網(wǎng)站服務(wù)器的壓力就非常大,一個(gè)非常簡(jiǎn)單的程序,相鄰的2個(gè)sql語(yǔ)句,在服務(wù)器繁忙時(shí),可能會(huì)過(guò)3-5分鐘才能運(yùn)行完畢,甚至更長(zhǎng)時(shí)間。服務(wù)器的硬件配置也已經(jīng)足夠高了,這時(shí)候幾乎無(wú)法靠平常的數(shù)據(jù)庫(kù)的讀寫(xiě),數(shù)據(jù)庫(kù)的優(yōu)化來(lái)提高程序的性能的。

2:硬盤(pán)的轉(zhuǎn)速是有限的,當(dāng)數(shù)據(jù)庫(kù)量已經(jīng)很大時(shí),數(shù)據(jù)庫(kù)讀取數(shù)據(jù)也耗費(fèi)很多時(shí)間。而且加硬盤(pán)相對(duì)比加內(nèi)存條更復(fù)雜一些。

3:當(dāng)數(shù)據(jù)庫(kù)的索引優(yōu)化,分區(qū)優(yōu)化都已經(jīng)用完了,數(shù)據(jù)庫(kù)的結(jié)構(gòu)也不能隨便修改時(shí),靠數(shù)據(jù)庫(kù)優(yōu)化的就遇到了瓶頸了。

4:現(xiàn)在內(nèi)存都比較便宜,服務(wù)器上把能插內(nèi)存條的地方都可以插滿了,但是系統(tǒng)往往不會(huì)用掉所有的內(nèi)存,內(nèi)存空間還是可以有富足。

5:雖然也可以用很多第3方組件來(lái)達(dá)到優(yōu)化的目的,但是需要有學(xué)習(xí)成本,有采購(gòu)成本,再有后期的維護(hù)成本,服務(wù)器的性能同樣也是增加壓力。

6:目前服務(wù)器的壓力已經(jīng)快崩潰了,也比較難提升性能時(shí),再有比較復(fù)雜的權(quán)限計(jì)算,每刷新一個(gè)頁(yè)面時(shí),還判斷10次8次以上操作權(quán)限項(xiàng)目,需要更多的I/O時(shí),很可能系統(tǒng)就真的徹底崩潰了。

7:當(dāng)然我們可以在另外購(gòu)買(mǎi)服務(wù)器,把程序的壓力進(jìn)行分擔(dān),但是我們假設(shè)不購(gòu)買(mǎi)硬件了,數(shù)據(jù)庫(kù)也必須需要用同一個(gè),從同一個(gè)服務(wù)器上的數(shù)據(jù)庫(kù)需要讀取數(shù)據(jù)。

在上面的程序環(huán)境下,就是老頑固也需要轉(zhuǎn)變思維了。

1:老頑固都比較難轉(zhuǎn)變思想:

因?yàn)槭聦?shí)擺在眼前,就是老頑固也必須接納緩存的做法了,雖然緩存有時(shí)候很折磨人,但是不靠緩存已經(jīng)很難解決問(wèn)題了。雖然以前有很多人給我過(guò)這樣的建議,都沒(méi)放在心上。

2:程序的及時(shí)性思維的轉(zhuǎn)變:

以前寫(xiě)程序都強(qiáng)調(diào),數(shù)據(jù)設(shè)置發(fā)生了變化程序能馬上顯示出來(lái)效果,例如修改了某個(gè)人的權(quán)限設(shè)置后,馬上就生效了。其實(shí)有時(shí)候沒(méi)必要那么馬上生效。有必要時(shí)刷新一下緩存,若沒(méi)必要用戶下次登錄時(shí)就生效了,頂多若有問(wèn)題用戶再登錄一次就可以了,權(quán)限設(shè)置又不是每時(shí)每刻都在設(shè)置的,很多時(shí)候設(shè)置好了,半年一年都不用設(shè)置,沒(méi)必要過(guò)分強(qiáng)調(diào)實(shí)時(shí)性。

其實(shí)程序員都有過(guò)度設(shè)計(jì)的問(wèn)題,用戶權(quán)限方面,我也的確是想的有些過(guò)度了,其實(shí)稍微放寬一下,也能滿足正常的日常使用的,頂多加個(gè)刷新緩存的功能,若有必要馬上見(jiàn)效就馬上刷洗一下緩存就可以了。

3:在不提高,就倍很多年輕人徹底超越了:

奔35了,體力腦力都明顯大幅下降,明顯感覺(jué)到身邊的年輕人又聰明又能干,這時(shí)候自己再不提高,很容易就徹底走下坡路了。雖然難起領(lǐng)頭羊的作用,但是至少不要被大家徹底甩在后面去了。

4:馬上動(dòng)手改進(jìn)程序:

有了想法了就需要馬上動(dòng)手,架構(gòu)良好的程序都經(jīng)得起重構(gòu)才對(duì),所以一直認(rèn)為自己的程序架構(gòu)是非常良好的,那就應(yīng)該能經(jīng)得起修改才對(duì),架構(gòu)好的程序應(yīng)該不是全盤(pán)推倒從來(lái),而是小修改幾個(gè)函數(shù)就應(yīng)該能達(dá)到內(nèi)存緩存的目的。

5:新系統(tǒng)要上線要靠譜的測(cè)試確認(rèn):

程序更新上去后,前后至少要測(cè)試1周,各種功能都穩(wěn)定,數(shù)據(jù)都正確才能正式投入實(shí)際實(shí)用。 

     

接著就是程序修改的部分:

其實(shí)總共就寫(xiě)了300行不到的代碼,系統(tǒng)的本質(zhì)的改造就完成了。

1:用戶能訪問(wèn)的模塊菜單,用戶擁有的操作權(quán)限項(xiàng),改進(jìn)為泛型。

           protected List ModuleList

           protected List PermissionItemList

2:當(dāng)用戶需要判斷權(quán)限時(shí),一次性把權(quán)限讀取到Cache緩存中。

3:權(quán)限判斷函數(shù)改進(jìn)為從內(nèi)存Cache緩存進(jìn)行判斷。

4:用戶退出時(shí),把相應(yīng)的內(nèi)存緩存清除掉,減輕內(nèi)存的壓力。

5:寫(xiě)個(gè)刷新緩存的功能,有需要時(shí),對(duì)所有的緩存進(jìn)行實(shí)時(shí)的刷新。

有時(shí)候代碼也就300行不到還有一大堆是注釋?zhuān)幸淮蠖咽菦](méi)用的,還有一大堆是重復(fù)的,真正有價(jià)值的代碼可能不超過(guò)50行,但是里面有蠻多故事,有故事的代碼更有生命力,有故事的代碼就更有賣(mài)點(diǎn),有故事的代碼經(jīng)常更經(jīng)得起考驗(yàn),歡迎大家拍磚,大家一起學(xué)習(xí)提高,在交流中不斷修正代碼,不斷提高自己,不斷改進(jìn)錯(cuò)誤,一天比一天強(qiáng)大。

 
 
 
 
  1. //----------------------------------------------------------------- 
  2.  // All Rights Reserved , Copyright (C) 2012 , Hairihan TECH, Ltd . 
  3.  //----------------------------------------------------------------- 
  4.   
  5.  using System; 
  6.  using System.Collections.Generic; 
  7.  using System.Linq; 
  8.  using System.Web; 
  9.   
  10.  using DotNet.Business; 
  11.   
  12.  ///  
  13.  /// BasePage 
  14.  /// 基礎(chǔ)網(wǎng)頁(yè)類(lèi) 
  15.  ///  
  16.  /// 修改紀(jì)錄 
  17.  ///  
  18.  ///    版本:1.0 2012.11.10    JiRiGaLa    整理代碼。 
  19.  ///     
  20.  /// 版本:1.0 
  21.  ///    
  22.  ///        JiRiGaLa 
  23.  ///        2012.11.10 
  24.  ///   
  25.  ///  
  26.  public partial class BasePage : System.Web.UI.Page 
  27.  { 
  28.      ///  
  29.      /// 用戶鎖 
  30.      ///  
  31.      public static readonly object UserLock = new object(); 
  32.   
  33.      #region 常用操作權(quán)限項(xiàng)定義 
  34.   
  35.      ///  
  36.      /// 訪問(wèn)權(quán)限 
  37.      ///  
  38.      protected bool permissionAccess = true; 
  39.   
  40.      ///  
  41.      /// 新增權(quán)限 
  42.      ///  
  43.      protected bool permissionAdd = true; 
  44.   
  45.      ///  
  46.      /// 編輯權(quán)限 
  47.      ///  
  48.      protected bool permissionEdit = true; 
  49.   
  50.      ///  
  51.      /// 刪除權(quán)限 
  52.      ///  
  53.      protected bool permissionDelete = true; 
  54.   
  55.      ///  
  56.      /// 查詢(xún)權(quán)限 
  57.      ///  
  58.      protected bool permissionSearch = true; 
  59.   
  60.      ///  
  61.      /// 管理權(quán)限 
  62.      ///  
  63.      protected bool permissionAdmin = false; 
  64.   
  65.      ///  
  66.      /// 導(dǎo)出權(quán)限 
  67.      ///  
  68.      protected bool permissionExport = true; 
  69.   
  70.      ///  
  71.      /// 導(dǎo)入權(quán)限 
  72.      ///  
  73.      protected bool permissionImport = true; 
  74.   
  75.      ///  
  76.      /// 打印權(quán)限 
  77.      ///  
  78.      protected bool permissionPrint = true; 
  79.   
  80.      #endregion 
  81.       
  82.      // 用戶是否在某個(gè)角色里(按編號(hào),按名稱(chēng)的) 
  83.   
  84.      #region public bool UserIsInRole(string roleCode) 
  85.      ///  
  86.      /// 用戶是否在某個(gè)角色里 
  87.      ///  
  88.      /// 角色編號(hào) 
  89.      /// 是否在某個(gè)角色里 
  90.      public bool UserIsInRole(string roleCode) 
  91.      { 
  92.          BaseUserManager userManager = new BaseUserManager(this.UserCenterDbHelper, userInfo); 
  93.          return userManager.IsInRoleByCode(this.UserInfo.Id, roleCode); 
  94.      } 
  95.      #endregion 
  96.       
  97.      // 用戶操作權(quán)限常用判斷函數(shù) 
  98.   
  99.      #region public void Authorized(string permissionItemCode, string accessDenyUrl = null) 是否有相應(yīng)權(quán)限,同時(shí)若沒(méi)權(quán)限會(huì)重新定位到某個(gè)頁(yè)面 
  100.      ///  
  101.      /// 是否有相應(yīng)權(quán)限,同時(shí)若沒(méi)權(quán)限會(huì)重新定位到某個(gè)頁(yè)面 
  102.      ///  
  103.      /// 權(quán)限編號(hào) 
  104.      /// 訪問(wèn)被阻止的url 
  105.      public void Authorized(string permissionItemCode, string accessDenyUrl = null) 
  106.      { 
  107.          // 若沒(méi)有相應(yīng)的權(quán)限,那就跳轉(zhuǎn)到?jīng)]有權(quán)限的頁(yè)面里 
  108.          if (!Utilities.UserIsLogOn() || !IsAuthorized(permissionItemCode)) 
  109.          { 
  110.              if (!string.IsNullOrEmpty(accessDenyUrl)) 
  111.              { 
  112.                  HttpContext.Current.Response.Redirect(accessDenyUrl); 
  113.              } 
  114.              else 
  115.              { 
  116.                  HttpContext.Current.Response.Redirect(Utilities.AccessDenyPage + "?PermissionItemCode=" + permissionItemCode); 
  117.              } 
  118.          } 
  119.      } 
  120.      #endregion 
  121.   
  122.      #region public bool IsAuthorized(string permissionItemCode, string permissionItemName = null) 是否有相應(yīng)的權(quán)限 
  123.      ///  
  124.      /// 是否有相應(yīng)的權(quán)限 
  125.      ///  
  126.      /// 權(quán)限編號(hào) 
  127.      /// 是否有權(quán)限 
  128.      public bool IsAuthorized(string permissionItemCode, string permissionItemName = null) 
  129.      { 
  130.          return IsAuthorized(this.UserInfo.Id, permissionItemCode, permissionItemName); 
  131.      } 
  132.   
  133.      public bool IsAuthorized(string userId, string permissionItemCode, string permissionItemName = null) 
  134.      { 
  135.          // 是否從服務(wù)器緩存讀取用戶權(quán)限 
  136.          bool fromCache = true; 
  137.          if (fromCache) 
  138.          { 
  139.              // 這里也可以?xún)?yōu)化一下,沒(méi)必要遍歷所有的操作權(quán)限列表 
  140.              int count = this.PermissionItemList.Count(entity => !string.IsNullOrEmpty(entity.Code) && entity.Code.Equals(permissionItemCode, StringComparison.OrdinalIgnoreCase)); 
  141.              return count > 0; 
  142.          } 
  143.          // 實(shí)時(shí)從數(shù)據(jù)庫(kù)讀取操作權(quán)限的設(shè)置方法 
  144.          DotNetService dotNetService = new DotNetService(); 
  145.          return dotNetService.PermissionService.IsAuthorizedByUser(this.UserInfo, userId, permissionItemCode, permissionItemName); 
  146.      } 
  147.      #endregion 
  148.   
  149.      #region protected void GetPermissionItemList() 獲用戶擁有的操作權(quán)限列表 
  150.      ///  
  151.      /// 獲用戶擁有的操作權(quán)限列表 
  152.      ///  
  153.      protected void GetPermissionItemList() 
  154.      { 
  155.          // 這里是控制用戶并發(fā)的,減少框架等重復(fù)讀取數(shù)據(jù)庫(kù)的效率問(wèn)題 
  156.          lock (BasePage.UserLock) 
  157.          { 
  158.              string cacheKey = "P" + this.UserInfo.Id; 
  159.              if (HttpContext.Current.Session == null || Cache[cacheKey] == null) 
  160.              { 
  161.                  // 這個(gè)是默認(rèn)的系統(tǒng)表名稱(chēng) 
  162.                  DotNetService dotNetService = new DotNetService(); 
  163.                  PermissionItemList = dotNetService.PermissionService.GetPermissionItemListByUser(this.UserInfo, this.UserInfo.Id); 
  164.              } 
  165.          } 
  166.      } 
  167.      #endregion 
  168.   
  169.      #region protected List PermissionItemList 獲用戶擁有的操作權(quán)限列表 
  170.      ///  
  171.      /// 獲用戶擁有的操作權(quán)限列表 
  172.      ///  
  173.      protected List PermissionItemList 
  174.      { 
  175.          get 
  176.          { 
  177.              lock (BasePage.UserLock) 
  178.              { 
  179.                  // 這里進(jìn)行了操作權(quán)限優(yōu)化,出錯(cuò)問(wèn)題 
  180.                  this.GetPermissionItemList(); 
  181.              } 
  182.              string cacheKey = "P" + this.UserInfo.Id; 
  183.              return Cache[cacheKey] as List
  184.          } 
  185.          set 
  186.          { 
  187.              string cacheKey = "P" + this.UserInfo.Id; 
  188.              Cache[cacheKey] = value; 
  189.          } 
  190.      } 
  191.      #endregion 
  192.       
  193.      // 用戶模塊菜單權(quán)限判斷常用函數(shù) 
  194.   
  195.      #region public void ModuleAuthorized(string moduleCode, string accessDenyUrl = null) 是否有相應(yīng)的模塊權(quán)限,同時(shí)若沒(méi)權(quán)限會(huì)重新定位到某個(gè)頁(yè)面 
  196.      ///  
  197.      /// 是否有相應(yīng)的模塊權(quán)限,同時(shí)若沒(méi)權(quán)限會(huì)重新定位到某個(gè)頁(yè)面 
  198.      ///  
  199.      /// 模塊編號(hào) 
  200.      /// 訪問(wèn)被阻止的url 
  201.      public void ModuleAuthorized(string moduleCode, string accessDenyUrl = null) 
  202.      { 
  203.          // 若沒(méi)有相應(yīng)的權(quán)限,那就跳轉(zhuǎn)到?jīng)]有權(quán)限的頁(yè)面里 
  204.          if (!Utilities.UserIsLogOn() || !IsModuleAuthorized(moduleCode)) 
  205.          { 
  206.              if (!string.IsNullOrEmpty(accessDenyUrl)) 
  207.              { 
  208.                  HttpContext.Current.Response.Redirect(accessDenyUrl); 
  209.              } 
  210.              else 
  211.              { 
  212.                  HttpContext.Current.Response.Redirect(Utilities.AccessDenyPage + "?ModuleCode=" + moduleCode); 
  213.              } 
  214.          } 
  215.      } 
  216.      #endregion 
  217.   
  218.      #region public bool IsModuleAuthorized(string moduleCode) 是否有相應(yīng)的模塊權(quán)限 
  219.      ///  
  220.      /// 是否有相應(yīng)的模塊權(quán)限 
  221.      ///  
  222.      /// 模塊編號(hào) 
  223.      /// 是否有權(quán)限 
  224.      public bool IsModuleAuthorized(string moduleCode) 
  225.      { 
  226.          if (this.UserInfo.IsAdministrator) 
  227.          { 
  228.              return true; 
  229.          } 
  230.          // 這里也可以?xún)?yōu)化一下,沒(méi)必要遍歷所有的模塊列表 
  231.          int count = this.ModuleList.Count(entity => !string.IsNullOrEmpty(entity.Code) && entity.Code.Equals(moduleCode, StringComparison.OrdinalIgnoreCase)); 
  232.          return count > 0; 
  233.      } 
  234.      #endregion 
  235.   
  236.      #region protected void GetModuleList() 獲用戶有訪問(wèn)權(quán)限的模塊列表 
  237.      ///  
  238.      /// 獲用戶有訪問(wèn)權(quán)限的模塊列表 
  239.      ///  
  240.      protected void GetModuleList() 
  241.      { 
  242.          // 這里是控制用戶并發(fā)的,減少框架等重復(fù)讀取數(shù)據(jù)庫(kù)的效率問(wèn)題 
  243.          lock (BasePage.UserLock) 
  244.          { 
  245.              string cacheKey = "M" + this.UserInfo.Id;  
  246.              if (HttpContext.Current.Session == null || Cache[cacheKey] == null) 
  247.              { 
  248.                  // 這個(gè)是默認(rèn)的系統(tǒng)表名稱(chēng) 
  249.                  DotNetService dotNetService = new DotNetService(); 
  250.                  ModuleList = dotNetService.PermissionService.GetModuleListByUser(this.UserInfo, this.UserInfo.Id); 
  251.              } 
  252.          } 
  253.      } 
  254.      #endregion 
  255.   
  256.      #region protected List ModuleList 獲用戶有訪問(wèn)權(quán)限的模塊列表 
  257.      ///  
  258.      /// 獲用戶有訪問(wèn)權(quán)限的模塊列表 
  259.      ///  
  260.      protected List ModuleList 
  261.      { 
  262.          get 
  263.          { 
  264.              lock (BasePage.UserLock) 
  265.              { 
  266.                  // 這里進(jìn)行了菜單優(yōu)化,出錯(cuò)問(wèn)題 
  267.                  this.GetModuleList(); 
  268.              } 
  269.              string cacheKey = "M" + this.UserInfo.Id;  
  270.              // return Utilities.GetFromSession("UserModuleList") as List
  271.              return Cache[cacheKey] as List
  272.          } 
  273.          set 
  274.          { 
  275.              string cacheKey = "M" + this.UserInfo.Id; 
  276.              Cache[cacheKey] = value; 
  277.              // Utilities.AddSession("UserModuleList", value); 
  278.          } 
  279.      } 
  280.      #endregion 
  281.  } 

新聞標(biāo)題:調(diào)整程序架構(gòu)的思維記改進(jìn)程序緩存的經(jīng)歷
分享地址:http://www.dlmjj.cn/article/dhepeho.html