• 缓存


        平时开发程序时,中大型项目都是使用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回收,在接下来的过程中可以再次使用。

  • 相关阅读:
    Codeforces 1372D Omkar and Circle
    一个估算
    CF 1348F Phoenix and Memory
    caterpillar tree
    ABC167F Bracket Sequencing
    【troubleshooting】中文输入法下,CMD 光标消失
    Visual Studio 2019创建并调试vue.js项目(Iview admin)
    Mysql知识点集合篇
    spring boot集成mybatis-plus(注解模式)
    spring boot集成mybatis(注解模式)
  • 原文地址:https://www.cnblogs.com/Currention/p/5549654.html
Copyright © 2020-2023  润新知