簡體   English   中英

ASP.net緩存

[英]ASP.net Caching

我已經實現了asp.net緩存。 但是我得到奇怪的結果

與大多數試圖避免對數據庫造成大量訪問的緩存不同。 我試圖避免用戶對數據庫的任何攻擊。 這是第一頁加載所需的時間。 它基本上是一個儀表板,具有很多圖表和長期運行的查詢

我嘗試了幾種技術:1)緩存時間很長,並且調度過程到期並獲得新的緩存。 2)並在RemoveCallback上

在第二個選項中,我讓所有緩存都經過我創建的靜態類。 目的是在過期時刷新數據。 這就是我所說的。

Cache.Insert(dbCacheString, dtNetwork, null, DateTime.Now.AddHours(2),
    System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, 
    new CacheItemRemovedCallback(CacheManager.CacheRemovedCallback));

    public static class CacheManager
    {
        private static Hashtable times = new Hashtable();
        private static bool isRefreshingCache = false;

        public static void CacheRemovedCallback(String key, object value,
            CacheItemRemovedReason removedReason)
        {
            RefreshCache(key);
        }

        public static void StartCache()
        {
            string lcUrl = "http://localhost/ratingspage/";
            // *** Establish the request 

            try
            {

                WebClient client = new WebClient();
                client.Credentials = new NetworkCredential("xxx", "xxx", 
                    "xxx");
                byte[] myDataBuffer = client.DownloadData(lcUrl);


            }
            catch (Exception ex)
            {
                ErrHandler.WriteError(ex.Message + "\n" + 
                    ex.StackTrace.ToString());
                LogUtil.LogDebugMessages(ex.Message + ":" + 
                    ex.StackTrace.ToString());
            }

        }

        public static void RefreshCache(string key)
        {
            string controlname = "";
            if ( key.ToLower().StartsWith("control:") )
            {
                string[] tmp = key.Split(':');
                if (tmp.Length > 1)
                    controlname = tmp[1];
                else
                    return;
            }
            else
                return;

            string lcUrl = "http://localhost/ratingspage/Admin/" + "
                "LoadControl.aspx?CachingSpider=true&Control=" + controlname;
            string lcHtml = isRefreshingCache.ToString();
            // *** Establish the request 

            if (!isRefreshingCache)
            {

                isRefreshingCache = true;
                lcHtml = isRefreshingCache.ToString();
                try
                {

                    WebClient client = new WebClient();
                    client.Credentials = new NetworkCredential("xxx", 
                        "xxx", "xxx");
                    byte[] myDataBuffer = client.DownloadData(lcUrl);
                    lcHtml = Encoding.ASCII.GetString(myDataBuffer);

                }
                catch (Exception ex)
                {
                    lcHtml = ex.Message;
                    isRefreshingCache = false;
                    ErrHandler.WriteError(ex.Message + "\n" + 
                        ex.StackTrace.ToString());
                    LogUtil.LogDebugMessages(ex.Message + ":" + 
                        ex.StackTrace.ToString());
                }
                isRefreshingCache = false;
            }



            MailMessage mail = new MailMessage(
                new MailAddress("jgiblin@univision.net"), 
                new MailAddress("jgiblin@univision.net"));
            mail.Subject = "Cache Expire: " + key;
            mail.Body = string.Format("The Key {0} has expired at {1}", 
                key, DateTime.Now.ToShortDateString() + " " +
                DateTime.Now.ToShortTimeString()) + "\nRefreshing Cache: " + 
                lcHtml;
            SmtpClient smtp = new SmtpClient("mercury.utg.uvn.net");
            mail.IsBodyHtml = false;
            try
            {

                smtp.Send(mail);

            }
            catch (Exception ex)
            {
                ErrHandler.WriteError(ex.Message + "\n" + 
                    ex.StackTrace.ToString());
                LogUtil.LogDebugMessages(ex.Message + ":" + 
                    ex.StackTrace.ToString());
            }

        }
    }

由於某種原因,當我轉到頁面時。 有時數據被緩存,有時則不。 這里有什么問題嗎

我嘗試了應用程序結構,但是由於服務器沒有IIS 7,因此無法使用該結構

您可能會進入緩存的數據量可能是個問題。

如果緩存已滿,則顯然不會緩存數據。

您可以使用進程監視器檢查內存分配,請查看“緩存總條目”。

在我看來,您的RefreshCache調用中可能存在競爭情況。 請查看以下絕佳答案,以獲取有關如何處理同步的建議:

Java同步關鍵字的C#版本?

如果我是你,我會簡化我的代碼。 您只需要:

  1. 當應用程序啟動時,加載緩存
  2. 當緩存過期時,重新加載
  3. 如果用戶試圖訪問緩存的對象和遺漏,睡自己的線程第二,並再次檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM