程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 緩存,浏覽器緩存

緩存,浏覽器緩存

編輯:C#入門知識

緩存,浏覽器緩存


 

    平時開發程序時,中大型項目都是使用Redis緩存,但在一些較小的項目中,則使用運行時緩存,由.NET FRAMEWORK 提供,命名空間System.Runtime.Caching。

    在下基礎不太好,對緩存這塊從未深究,只認為可以達到預想中的目標就夠了,所以平時基本都是逐漸摸索。

    近來,開發一個交警內部使用的管理系統,要求減少讀取數據庫,並且每個用戶的數據必須是隔離的。這需要用到緩存。使用過程中有個疑問,運行時緩存是將對象拷貝一份保存起來,還是修改對象的內存策略。

   

    平時比較忙,今天恰好有點時間,寫了一個測試來驗證我的猜想,從來沒人說過或是哪裡講過這塊知識,現在分享給其他可能同樣有疑問的同學。

 

先貼下我寫的測試類,如果有哪個地方會導致結果不太准確,請指出:

// 用於緩存的類
        public class CacheEntity
        {
            public Guid Guid { get; set; }
            public int State { get; set; }
            public DateTime CachedOn { get; set; }
            public string Desc { get; set; }

            public override string ToString()
            {
                return $"Object[{this.Guid}] State: [{State}] CachedOn:[{CachedOn}] Desc:[{Desc}].";
            }
        }

 

// 獲得即將緩存的對象
       protected virtual CacheEntity GetTestCacheEntity()
        {
            return new CacheEntity
            {
                Guid =  Guid.NewGuid(),
                CachedOn = DateTime.Now,
                Desc = "初始化",
                State = 1
            };
        }
       
       // 獲得測試使用的緩存策略
        protected virtual ICacheManager GetTestCacheManager()
        {
            return new MemoryCacheManager();
        }

 

接下來就是測試方法。

/// <summary>
        /// 驗證猜想, 緩存數據, 是重新定義對象在內存中的保存策略.
        /// 並不是拷貝一份副本進行緩存, 而是將內存中的對象延遲銷毀.
        /// </summary>
        [Test]
        public void Valid_mind()
        {
            var originalEntity = GetTestCacheEntity();

            var cacheManager = GetTestCacheManager();

            var cacheKey = "CacheEntity";
            cacheManager.Set(cacheKey, originalEntity, 5);

            cacheManager.IsSet(cacheKey).ShouldBeTrue();

            Console.WriteLine($"{DateTime.Now}: Get cache...");
            var cacheEntity = cacheManager.Get<CacheEntity>(cacheKey);
            cacheEntity.Guid.ShouldEqual(originalEntity.Guid);
            cacheEntity.State.ShouldEqual(originalEntity.State);
            cacheEntity.CachedOn.ShouldEqual(originalEntity.CachedOn);
            cacheEntity.Desc.ShouldEqual(originalEntity.Desc);
            Console.WriteLine(cacheEntity);
            Console.WriteLine($"{DateTime.Now}: Entity has been cache.");

            Console.WriteLine();
            Console.WriteLine($"-------------------------------------");
            Console.WriteLine();
            Console.WriteLine($"{DateTime.Now}: Change Entity's data, and valid again.");
            cacheEntity.Guid = Guid.NewGuid();
            cacheEntity.State = 2;
            cacheEntity.CachedOn = DateTime.Now;
            cacheEntity.Desc = "數據已更改";

            Console.WriteLine($"{DateTime.Now}: Get cache again...");
            cacheEntity = cacheManager.Get<CacheEntity>(cacheKey);
            Console.WriteLine(cacheEntity);
            Console.WriteLine($"{DateTime.Now}: Test ends.");
        }

在測試方法中,僅設置一次緩存,其他都是讀取該緩存。

下面是測試結果:

image

結論是:

    運行時緩存更改了對象的內存存儲策略,這使得對象不被GC回收,在接下來的過程中可以再次使用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved