zoukankan      html  css  js  c++  java
  • 微软企业库4.1学习笔记(十七)缓存模块5 缓存的典型用法 Virus

      本节介绍开发者在使用缓存的时候,常用的方法。每个方法在实际开发中都可以找到对应的用处,会有代码示例。分两个部分介绍,第一个部分包括下面的一些用法:

    •   向缓存添加数据,Add方法,如何向缓存中添加数据,设置过期,设置优先级。
    •   从缓存中删除数据,Remove方法
    •   从缓存中获取数据,GetData方法
    •   清空缓存,Flush方法

      第二部分介绍缓存的加载。

      1.1向缓存中添加数据

      需要缓存的数据,在创建和传输的时候都是很消耗性能的。例如,一个零售商的应用系统,一些列产品数据需要从数据访问组件传递给用户显示组件,然后才可以显示在用户界面。代表显示世界的实体类Products和Orders,为了提升性能,一些数据会被放在缓存中。

      你需要向缓存中添加数据,同时为过期处理提供过期时间,为清除处理设置缓存的优先级,先清除优先级低的缓存项。

      使用CacheManager的Add方法,如果你没有设置过期时间和优先级,会自动设置默认值,分别是NeverExpired永不过期和Normal正常。如果缓存中已经存在相同key的项,会先移除旧项,然后添加新项。在这个过程中如果失败的话,缓存值会恢复到原始值。

      

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Practices.EnterpriseLibrary.Caching;
    using Microsoft.Practices.EnterpriseLibrary.Common;
    using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;

    namespace BeautyCode.Entlib
    {
        
    public class Product
        {
            
    public string ID { getset; }
            
    public string Name { getset; }
            
    public decimal Price { getset; }
        }
        
    public class CacheTest
        {
            
    public CacheTest()
            {
                ICacheManager manager 
    = CacheFactory.GetCacheManager();
                
    string id = "11";
                
    string name = "土豆";
                
    decimal price = 100;
                Product product 
    = new Product() { ID = id, kName = name, Price = price };

                manager.Add(id, product, CacheItemPriority.Normal,
    null,new SlidingTime (TimeSpan.FromMinutes (5)));
            }
        }
    }

      在上面的代码中,通过Add方法向缓存中添加数据,设置优先级为Normal,过期之后没有激活任何事件,过期时间为最后一次访问之后的5分钟。

      在删除项的时候响应删除事件,更新缓存。

      在Add方法中,我们可以指定一个实现了ICacheItemRefreshAction接口的类方法,当从缓存中删除项的时候,就会更新缓存的数据。

      

    代码
     [Serializable]
        
    public class ProductCacheRefeshAction : ICacheItemRefreshAction
        {
            
    #region ICacheItemRefreshAction Members

            
    public void Refresh(string removedKey, object expiredValue, CacheItemRemovedReason removalReason)
            {
                
    throw new NotImplementedException();
            }

            
    #endregion
        }

      如果要接收移除缓存项的通知的话,需要在Add方法中设置参数

      

      manager.Add(id, product, CacheItemPriority.Normal,new ProductCacheRefeshAction (),new SlidingTime (TimeSpan.FromMinutes (5)));

      要点:

    •   你可以使用整合Unity的方式创建对象实例。
    •   如果向配置了使用数据库作为后端存储的缓存中添加项的话,添加的项必须是可序列化的,添加Serializable特性。
    •   当使用数据库作为后端存储的时候,实现ICacheItemRefreshAction的类必须要可序列化,添加Serializable特性。
        

      1.2从缓存中删除项

      根据添加项的时候设置的扫描策略和过期策略,扫描和过期处理会自动从缓存中删除项。你也可以手动移除某些项。

      

      public void Remove(CacheManager cache, string key)
            {
                cache.Remove(key);
            }

      1.3从缓存中获取数据

      使用CacheManager的GetData方法

      

     public T GetData<T>(CacheManager cache,string key)
            {
                
    return (T)cache.GetData(key);
            }

      1.4清空缓存

      使用CacheManager的Flush方法,将会清空缓存中的全部项,不管有没有过期。

      

     public void Flush(CacheManager cache)
            {
                cache.Flush();
            }

       2、向缓存加载数据

      在你从缓存获取数据之前,需要先向缓存中添加一些数据。你可以通过两种方式加载数据:

    •   一次性加载,一次性将所需的数据加载到缓存中,方便后面的时候
    •   根据请求加载,当发生数据请求的时候才加载数据到缓存

      2.1一次性加载

      当应用启动的时候,一次性加载需要的数据。

      优点:

      因为你可以确保数据已经被加载到缓存中,理论上你不用判断缓存的状态。但是,在获取数据之前需要检查数据是否存在于缓存中,因为有可能缓存被清空了。

      因为你使用缓存,应用的性能会提升,应用的响应也会更快。

      缺点:

      一次性缓存全部数据,没有最大的提升系统的性能,因为花费时间缓存的数据,包括了一些没有必要的数据。如果应用有100个处理请求,登录者登录之后只是处理了1个,那么其他缓存的请求就没有必要了。

      推荐的一次性加载方式

      当你在应用启动或者初始化的时候一次性家在大量数据的话,最好使用后台线程进行异步加载,如果你不正确的使用一次性加载的方式,你的应用在初始化的时候会很慢。在下面的情形, 推荐使用一次性加载。

    •   对加载的数据的生命周期可控
    •   对加载的数据量可控,如果不知道要加载多少数据量的话,你有可能会耗尽系统的资源

      2.2根据请求加载数据

      优点:

      在应用初始化的时候,因为没有加载大量的数据,系统资源没有耗尽。不用加载一些不需要的数据。

      缺点:

      使用的时候,性能会有点下降,因为请求的数据可能没有被缓存,而是从数据源获取然后缓存。在从缓存中获取之前,也需要检查数据是否已经存在于缓存中。这种检查可能会在你的代码中加入过量的条件逻辑。

      推荐的根据请求加载数据的方式

    •   你需要一些数据,但是没有资源加载保存全部的数据
    •   你需要的数据在初始化系统的时候不能加载,例如数据可能和用户输入的项有关系,例如用户的一些信息。

      一次性加载数据到缓存的代码示例

    代码
      public List<Product> GetProductList()
            {
                
    return new List<Product>();
            }
            
    public void LoadAllProducts()
            {
                ICacheManager manager 
    = CacheFactory.GetCacheManager();
                List
    <Product> list = GetProductList();
                
    foreach (Product p in list)
                {
                    manager.Add(p.ID, p);
                }
            }

      下面是一段根据请求加载数据到缓存的代码示例

      

    代码
      public Product GetByID(string productID)
            {
                
    return new Product();
            }
            
    public Product  ReadProductByID(string productID)
            {
                ICacheManager manager 
    = CacheFactory.GetCacheManager();
                Product p 
    = (Product)manager.GetData(productID);
                
    if (p == null)
                {
                    p 
    = GetByID(productID);
                    
    if (p != null)
                        manager.Add(productID, p);
                }
                
    return p;
            }

      首先检查缓存中是否存在相同key的项,如果没有就从数据源获取,然后加入缓存并且返回数据。

      未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/virusswb/p/1719332.html
Copyright © 2011-2022 走看看