• 微软企业库4.1学习笔记(十七)缓存模块5 缓存的典型用法


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

    •   向缓存添加数据,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 { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    }
    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的项,如果没有就从数据源获取,然后加入缓存并且返回数据。

  • 相关阅读:
    POJ3977 Subset 折半枚举
    Ubuntu和Win7双系统,ubuntu被删,重新启动之后显示,no such partition
    hdu 4296 贪心
    Python标准库:内置函数tuple([iterable])
    【python自制】让大白成为你的个人助手!
    Flex设置LinkButton的背景色
    VB6基本数据库应用(五):数据的查找与筛选
    正态分布(normal distribution)与偏态分布(skewed distribution)
    windows 系统文件 —— 特殊文件及文件类型
    windows 系统文件 —— 特殊文件及文件类型
  • 原文地址:https://www.cnblogs.com/DoNetCShap/p/2287842.html
Copyright © 2020-2023  润新知