Cache,MemCache,Application,Cookie等其它緩存彙總

爲了提升網頁運行速度咱們用到了各類緩存技術,今天就來彙總下,相信聰明的你也必定會有所收穫的o(^▽^)ohtml

1.Cache(PS:看見一個博客介紹的不錯,我就直接Copy了)mysql

  Cache 即高速緩存.那麼cache是怎麼樣提升系統性能與運行速度呢?是否是在任何狀況下用cache都能提升性能?是否是cache用的越多就越好呢?我在近 期開發的項目中有所體會,寫下來看成總結也但願能跟你們一塊兒探討探討,有錯誤的地方但願你們批評指正。
  1.Cache 是怎麼樣工做的?
  Cache 是分配在服務器上的一個公共的內存片。
  所謂公共指的cache只要一建立是任何一個客戶端瀏覽器均可以經過後臺代碼訪問到它,它面向的是全部用戶,相對而言session也是服務器上的一 段內存,但他面向的是單個用戶。它是服務器的一段內存塊,也就是說每一個cache一經建立就佔用了服務器資源的。因此從這點來講咱們就能夠說:並非 cache越多越好。  
  cache 是有時間限制的,超過了服務器設定的過時時間,它就會被服務器回收。
  cache 能夠存聽任何對象
  
  2.Cache 怎麼樣建立以及怎麼樣銷燬  
  建立cache  
  在DotNet環境下經過HttpContext.Cache.Insert(string key,object o)方法建立。
      其中key 表明cache的ID,o表明存到cache裏的對象。
  
  銷燬cache 
  經過方法HttpContext.Cache.Remove(string key)
      其中key 表明cache的 ID.
  
  調用cache  
  Cache支持裝箱/拆箱操做。如你能夠把一個DataSet對象ds經過HttpContext.Cache.Insert(「dsCache」,ds)的方式存到Cache中,能夠經過拆箱操做 DataSet ds = (DataSet)Cache[「dsCache」]來訪問它。
  
  3.何時用cache  
  Cache 通常用於數據較固定,用的較頻繁的地方。例如能夠把進銷存系統中能夠把產品信息存入cache,在用戶調用產品信息時經過調用cache便可,這樣從很大 程度上減小了用戶與數據庫的交互,提升了系統的性能。反之,cache不適合用在數據變更快,使用範圍很窄的地方。例如把一個具體採購單存入 cache中。
  
  4.cache 調用注意事項  
  Cache是有時間限制的。超過了服務器設置的過時時間,就會被服務器回收。當cache被回收後對應的內存塊就會被清空,再次經過cache[「cachekey」]訪問對象時返回的就是null值。因此如下這種調用就會出現異常
  
  DataSet ds = (DataSet)Cache[「cacheds」];  
  DataRow dr = ds.Table[0].Row[0]; //出錯,ds爲null值,不存在表0。
  
  正確的寫法應該是:  
  DataSet ds;  
  if(Cache[「cacheds」] != null)  
  {  
      ds = (DataSet)Cache[「cacheds」];  
  }  
  else  
  {  
      ds= GetDsFromDataBase();  
  }  
  DataRow dr = ds.Table[0].Row[0];程序員

源於:http://www.cnblogs.com/akingyao/archive/2013/01/09/2852545.html#undefinedsql

 2.Memcache數據庫

上面談到的是基本的緩存,接下來談談分佈式緩存。聽着名字略叼,分佈式。沒事,今天咱們就搞定它~編程

筆記摘錄:瀏覽器

//注意:使用Memcached的時候別忘了加端口號:11211
   1.以Guid爲key,以登陸用戶爲value放到mm裏面去。
   Guid guid=Guid.NewGuid();
   -----注;CacheHelper是本身定義的類
   CacheHelper.Set(guid.ToString(),userName,DateTime.Now.AddMinutes(20))//通常以20分鐘過時
   2.以mysessionId爲key,guid爲value寫到Cookie裏面去
   Response.Cookies["mysessionId"].Value=guid.ToString();
   3.校驗類:根據Cookie去查詢mm裏面有沒有對應的值
      string guid = Request["mysessionId"];
                if (!String.IsNullOrEmpty(guid))
                {
                    var rec = Common.CacheHelper.Get(guid);
                    if (rec != null)
                    {
                        return;
                    }
                }
                filterContext.HttpContext.Response.Redirect("/Login/Index");
View Code

配置文件摘錄:緩存

  <add key="MemcachedServers" value="127.0.0.1:11211,192.168.0.101:11211" />

MmHelper.cs安全

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using  Memcached.ClientLibrary;

namespace HM13OA.Common
{
    public partial class MmHelper
    {
        private MemcachedClient client;
        public MmHelper()
        {
            string[] ips = System.Configuration.ConfigurationManager.AppSettings["MemcachedServers"].Split(',');

            SockIOPool pool = SockIOPool.GetInstance();
            pool.SetServers(ips);
            pool.Initialize();

            client=new MemcachedClient();
            client.EnableCompression = true;
        }

        public bool Set(string guid,object value,DateTime expiryTime)
        {
            return client.Set(guid, value, expiryTime);
        }

        public object Get(string guid)
        {
            return client.Get(guid);
        }

        public bool Delete(string guid)
        {
            return client.Delete(guid);
        }
    }
}
View Code

 3.Application服務器

須要在整個網站共享同一個數據能夠用Application.

   Application對象是HTTPApplicationState類的實例。 Application是屬於全局性的對象,用於存放應用程序中多個用戶共享的信息。當用戶第一次訪問某虛擬目錄的資源時被建立,退出應用程序或關閉服務器時被撤銷。

 

       Application對象利用「鍵----值」對的字典方法來定義,其中「鍵」爲字符串,表明狀態的「名」,「值」能夠是任何類型的數據。  例如:

 

      Application[「message」]=」mysmg」;  //給名爲「message」的Application對象賦值「mysmg」

 

      String myvar=Application[「message」] . toString() ;

 

                             // 取出名爲「message」的Application的值賦給字符串 myvar

 

爲了和ASP版本兼容,也可使用如下語句:

 

      Application . contents[「message」]=」mysmg」 ;

 

      String  myvar=Application .contents[「message」] . toString() ;

 

能夠利用Application的add方法向Application的集合中添加項,也能夠利用Remove方法刪除不須要的項。例如:

 

      Application . add(「message」 , 「mysmg」) ;

 

      Application . remove(「message」) ;

 

能夠利用clear()或者removeAll()方法清除Application集合中的內容。例如:

 

      Application . clear() ;

 

      Application . removeAll() ;

 

因爲信息共享,有可能出現多個用戶同時訪問application時而引起的競爭。爲了防止競爭帶來的影響,能夠利用Application對象的兩個方法lock()和Unlock() 。其中lock()用於鎖定對象,不容許其餘進程訪問; unlock()用於解鎖,以便容許其餘進程訪問。

 

     例如,將Application[「counter」]用來統計訪問網站的人數時能夠採用如下代碼:

 

     Application . lock() ;   //鎖定application對象,避免多用戶競爭訪問

 

     Application[「counter」]=(int)Application[「counter」]+1 ;

 

     Application . unlock() ;  //解除對application對象的鎖定

 

  應用程序狀態只能在網站運行時存在。 若是WEB服務器關閉或崩潰了,應用程序狀態所保留的信息也會損壞或丟失 。所以,對於那些須要永久保留的狀態應當保存在數據庫或其餘永久性的存儲器中。

參考博文:http://blog.csdn.net/happylee6688/article/details/8618687

4.Cookie


cookie的特色:
1>.保存的數據量大小有限制
2>.cookie能夠設置有效期。當把有效期設置爲已通過期的日期,那麼瀏覽器就會刪除這個cookie
3>.當cookie比較多的時候,瀏覽器能夠自行決定刪除某些cookie
4>.用戶能夠直接經過瀏覽器清除cookie,因此在程序員編程的時候不要太依賴cookie
5>.由於cookie是存在客戶端的,因此有安全性問題(不要存儲密碼)
6>.cookie是與域名相關的。因此在下次訪問相同域名網站的時候,瀏覽器會自動攜帶該網站下的cookie一塊兒訪問。
7>.cookie是與瀏覽器相關的
8>.cookie保存數據的方式也是以鍵值對的方式來保存的
9>.若是寫入了兩個相同的鍵的cookie,那麼後寫入的會覆蓋先寫入的內容。
10>.通常狀況下,設置cookie,都必須設置有效期,若是不設置有效期,那麼這個cookie就是一個瀏覽器進程內的cookie(在內存中的一個cookie),因此當關閉瀏覽器,則cookie則當即失效
11>.能夠經過服務器端使用C#語言來寫cookie,也能夠經過客戶端JavaScript來寫cookie,但不管使用哪一種方式,最終都是經過瀏覽器來操做的cookie

寫入Cookie代碼:
【寫入Cookie】
//首先獲取用戶輸入的數據
string strName = Request.QueryString["txtName"];
//建立一個HttpCookie對象
HttpCookie ck1 = new HttpCookie("user_name", strName);
ck1.Expires = DateTime.Now.AddDays(7);//設置過時時間
ck1.Path = "/";//設置在全部網頁都能使用Cookie
ck1.Secure = false;
Response.Cookies.Add(ck1);//添加Cookie
【讀取Cookie】
HttpCookie ck = Request.Cookies["user_name"];

 Cookie具體應用請參考腳本之家:http://www.jb51.net/article/35986.htm

5.頁面緩存+二級緩存

1.頁面緩存:(這裏主要討論在MVC中的應用)

先說最多見的的一種:[OutputCache(Duration = 100)] ,Duration單位是秒。第一次回到了斷點的地方,100秒內任意刷新都不會再執行控制器裏面的A()了

帶參數緩存 [OutputCache(Duration = 100, VaryByParam = "id")] [OutputCache(Duration = 100, VaryByParam = "id;name")]

上面兩個緩存均寫在要緩存的方法上面

2.二級緩存:(System.Web;System.Web.Caching;)

 

2.1絕對過時緩存

 

 HttpRuntime.Cache.Add(key, list, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 

2.2相對過時緩存(有點Session的感受了)

 HttpRuntime.Cache.Add(key, list, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10), CacheItemPriority.Default, null);

詳情參考逆天博客:http://www.cnblogs.com/dunitian/p/6126820.html

 

 

ZJ。。。

相關文章
相關標籤/搜索