zoukankan      html  css  js  c++  java
  • 学习和分享一点简单的System.Web.HttpRuntime.Cache的使用经验

    配置文件

    <appSettings>
      
    <add key="EnableCache" value="true"/>
      
    <add key="CacheDurationSeconds" value="300"/>
    </appSettings>

    操作方法

    代码
    using System;
    using System.Web.Configuration;

    public class SiteHelper
    {
        
    static public object GetCache(string CacheId)
        {
            
    object objCache = System.Web.HttpRuntime.Cache.Get(CacheId);

            
    // 判斷 Cache 是否啟用
            if (WebConfigurationManager.AppSettings["EnableCache"== null
                
    || !Convert.ToBoolean(WebConfigurationManager.AppSettings["EnableCache"]))
            {
                objCache 
    = null;
                System.Web.HttpRuntime.Cache.Remove(CacheId);
            }

            
    return objCache;
        }

        
    /// <summary>
        
    /// 寫入 Cache 資料 ( 預設 60 秒 )
        
    /// </summary>
        
    /// <param name="CacheId"></param>
        
    /// <param name="objCache"></param>
        static public void SetCache(string CacheId, object objCache)
        {
            
    if (WebConfigurationManager.AppSettings["CacheDurationSeconds"!= null)
            {
                SetCache(CacheId, objCache, 
                    Convert.ToInt32(WebConfigurationManager.AppSettings[
    "CacheDurationSeconds"]));
            }
            
    else
            {
                SetCache(CacheId, objCache, 
    60);
            }
        }

        
    static public void SetCache(string CacheId, object objCache, int cacheDurationSeconds)
        {
            
    if (objCache != null)
            {
                System.Web.HttpRuntime.Cache.Insert(
                    CacheId,
                    objCache,
                    
    null,
                    System.Web.Caching.Cache.NoAbsoluteExpiration,
                    
    new TimeSpan(00, cacheDurationSeconds),
                    System.Web.Caching.CacheItemPriority.High,
                    
    null);
            }
        }
    }

    使用方法

    代码
    string strCache1 = SiteHelper.GetCache("Cache1"as string;

    if (strCache1 == null)
    {
        Response.Write(
    "<p>Cache is empty</p>");

        strCache1 
    = "OK";
        SiteHelper.SetCache(
    "Cache1", strCache1, 30);
    }

    Response.Write(strCache1);

     常见问题#Cache显示与清空问题

    代码
    List<string> cacheKeys = new List<string>();
    IDictionaryEnumerator cacheEnum 
    = Cache.GetEnumerator();
    while (cacheEnum.MoveNext())
    {
        cacheKeys.Add(cacheEnum.Key.ToString());
    }
    foreach (string cacheKey in cacheKeys)
    {
        Cache.Remove(cacheKey);
    }
    代码
        //清除所有缓存
        protected void RemoveAllCache()
        {
            System.Web.Caching.Cache _cache 
    = HttpRuntime.Cache;
            IDictionaryEnumerator CacheEnum 
    = _cache.GetEnumerator();
            ArrayList al 
    = new ArrayList();
            
    while (CacheEnum.MoveNext())
            {
                al.Add(CacheEnum.Key);
            }
            
    foreach (string key in al)
            {
                _cache.Remove(key);
            }
            show();
        }
        
    //显示所有缓存 
        void show()
        {
            
    string str = "";
            IDictionaryEnumerator CacheEnum 
    = HttpRuntime.Cache.GetEnumerator();

            
    while (CacheEnum.MoveNext())
            {
                str 
    += "缓存名<b>[" + CacheEnum.Key + "]</b><br />";
            }
            
    this.Label1.Text = "当前网站总缓存数:" + HttpRuntime.Cache.Count + "<br />" + str;
        }

    添加到扩展方法

    代码
    using System;
    using System.Web.Caching;
    using System.Collections;
    using System.Collections.Generic;

    /// <summary>
    /// 擴充 System.Web.Caching 命名空間的 Extension Methods
    /// </summary>
    static public class CacheExtensionMethod
    {
        
    public static void Clear(this Cache x)
        {
            List
    <string> cacheKeys = new List<string>();
            IDictionaryEnumerator cacheEnum 
    = x.GetEnumerator();
            
    while (cacheEnum.MoveNext())
            {
                cacheKeys.Add(cacheEnum.Key.ToString());
            }
            
    foreach (string cacheKey in cacheKeys)
            {
                x.Remove(cacheKey);
            }
        }
    }

    MSDN

    C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。因此,建议使用 foreach,而不直接操作枚举数。

    枚举数可用于读取集合中的数据,但不能用于修改基础集合。

    最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。

    在调用 MoveNextReset 之前,Current 返回同一个对象。MoveNextCurrent 设置为下一个元素。

    如果 MoveNext 越过集合的末尾,则枚举数将放置在集合中最后一个元素的后面,而且 MoveNext 返回 false。当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext

    只要该集合保持不变,枚举数也就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNextReset 的调用将引发 InvalidOperationException。如果在 MoveNextCurrent 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。

    枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。即使某个集合已同步,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

    大中型Cache应用推荐:Velocity,memcached等

  • 相关阅读:
    godaddy 亚太机房 更换 美国机房 全过程(图)
    博客园设置访问密码
    GoDaddy Linux主机支持机房的更换
    今天电信宽代终于装上光纤了,升级或安装光纤需购光猫,可以自购。我来扫盲一下
    我来科普一下为毛很多人升级了20M的电信光纤宽带反而感觉速度更卡了
    百度浏览器使用率统计
    hdu 1281
    C#基于SMTP协议和SOCKET通信,实现邮件内容和附件的发送,并可隐藏收件人
    如何处理标注打架
    提高你的Java代码质量吧:谨慎包装类型的比较
  • 原文地址:https://www.cnblogs.com/leeolevis/p/1662283.html
Copyright © 2011-2022 走看看