`

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

阅读更多

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

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

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

  1.1向缓存中添加数据

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

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

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

  

 

 

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->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接口的类方法,当从缓存中删除项的时候,就会更新缓存的数据。

  

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> [Serializable]
    
public class ProductCacheRefeshAction : ICacheItemRefreshAction
    {
        
#region ICacheItemRefreshAction Members

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

        
#endregion
    }

 

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

  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->  manager.Add(id, product, CacheItemPriority.Normal,new ProductCacheRefeshAction (),new SlidingTime (TimeSpan.FromMinutes (5)));

 

  要点:

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

  1.2从缓存中删除项

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

  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->  public void Remove(CacheManager cache, string key)
        {
            cache.Remove(key);
        }

 

  1.3从缓存中获取数据

  使用CacheManager的GetData方法

  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public T GetData<T>(CacheManager cache,string key)
        {
            
return (T)cache.GetData(key);
        }

 

  1.4清空缓存

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

  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public void Flush(CacheManager cache)
        {
            cache.Flush();
        }

   2、向缓存加载数据

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

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

  2.1一次性加载

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

  优点:

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

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

  缺点:

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

  推荐的一次性加载方式

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

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

  2.2根据请求加载数据

  优点:

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

  缺点:

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

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

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

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

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->  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);
            }
        }

 

 

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

  

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->  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相关课程系列笔记之十四Hibernate学习笔记

    【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...

    redis学习笔记Redis.md

    ### Redis 学习笔记知识点概览 #### 一、Redis 概述与应用场景 ##### 1.1 NoSQL 数据库简介 - **定义**: NoSQL(Not Only SQL)泛指非关系型数据库,它们通常不使用传统的表格关系来存储数据。 - **特性**: NoSQL ...

    计算机网络-甘晴void学习笔记

    ### 计算机网络-甘晴void学习笔记 #### 一、甘晴void概念解析 在探讨计算机网络之前,我们先来理解一下“甘晴void”这一独特概念。甘晴void是一个融合了清新与深邃的编程理念,旨在引导程序员在编程过程中保持一种...

    ibatis学习笔记.txt

    ### iBatis 学习笔记知识点总结 #### 一、iBatis 概念与特点 **1.1 iBatis 定义** - **iBatis** 是一个基于 Java 的开源持久层框架,它专注于 SQL 映射,提供了一种将对象与数据库交互过程中的 SQL 语句进行分离的...

    2023年Java相关课程系列笔记之十四Hibernate学习笔记.doc

    在本篇“2023年Java相关课程系列笔记之十四Hibernate学习笔记”中,我们将深入探讨Java开发中常用的持久化框架——Hibernate。这个框架由梁建全老师主讲,旨在帮助开发者更高效、便捷地进行数据库操作,弥补JDBC在...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    nginx学习笔记.docx

    ### Nginx 学习笔记知识点总结 #### 一、Nginx 简介及安装 **Nginx** 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,...

    Java相关课程系列笔记之十四Hibernate学习笔记.doc

    ### Java相关课程系列笔记之十四:Hibernate学习笔记 #### 一、Hibernate的概述 ##### 1.1 Hibernate框架的作用 Hibernate是一个开源的对象关系映射(Object Relational Mapping, ORM)框架,它允许开发者以面向...

    javaNIO学习笔记

    ### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...

    MySQL学习笔记

    ### MySQL学习笔记知识点详解 #### 一、MySQL安装与配置 **1.1 安装失败解决方案** 在MySQL安装过程中可能会遇到启动失败的情况,解决这一问题通常需要检查以下几个方面: - **确认系统环境变量是否正确配置**:...

    大数据学习笔记

    ### 大数据学习笔记知识点概览 #### 第一部分:Spark学习 ##### 第1章:Spark介绍 - **1.1 Spark简介与发展** - **背景**:随着大数据处理需求的增长,传统的Hadoop MapReduce框架虽然提供了强大的计算能力,但...

    springMVC学习笔记

    ### SpringMVC学习笔记 #### 一、SpringMVC配置详解 **1.1 配置SpringMVC分派器及映射** SpringMVC框架的核心组件之一是`DispatcherServlet`,它作为前端控制器,负责接收请求并将请求分发到合适的处理器上。为了...

    Java学习笔记-个人整理的

    {4.1}\ttfamily java.util.ArrayList}{80}{section.4.1} {4.2}\ttfamily java.util.LinkedList}{81}{section.4.2} {4.3}贪吃蛇案例}{82}{section.4.3} {4.4}散列表与HashMap}{83}{section.4.4} {4.4.1}java....

    oracle 学习笔记

    ### Oracle学习笔记知识点详解 #### 一、数据库结构 **1.1 物理结构概述** Oracle数据库的物理结构主要包括三类文件:数据文件、重做日志文件和控制文件。这些文件共同构成了数据库的物理存储结构。 **1.2 表...

    redis学习笔记

    ### Redis学习笔记知识点详解 #### 一、Redis环境搭建 **1.1 Redis简介** Redis是一种高性能的键值存储系统,常被用作数据库、缓存以及消息中间件。其最大的特点是支持多种数据结构,如字符串(String)、列表...

    spring5mvc第一天【大纲笔记】.zip

    本大纲笔记将带你逐步深入理解SpringMVC的核心概念和使用方法。 一、SpringMVC 入门 1.1 引入SpringMVC 首先,我们需要在项目中引入SpringMVC的依赖,这通常通过在Maven或Gradle的配置文件中添加相应的依赖项来完成...

Global site tag (gtag.js) - Google Analytics