asp.net中缓存类DataCache(依赖文件缓存和时间缓存,或两者)

简介: 更新:2013-12-29 经过不断的修改和运行测试,在实际项目中使用得很好的了。。 using System;using System.


更新:2013-12-29

经过不断的修改和运行测试,在实际项目中使用得很好的了。。



using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.IO;

namespace Tools.Web
{
    /// <summary>
    /// 网页中的缓存类,使用示例:
    /// object obj = DataCache.GetCache("file1",depfile);
    ///if (obj == null)
    ///{
    ///   string txt = "缓存内容";//从数据库或文件读取到的内容
    ///   DataCache.SetCacheDepFile("file1", txt, depfile);
    /// }
    /// else
    /// {
    ///     string txt=obj.ToString();
    /// }
    /// </summary>
    public partial class DataCache
    {
        #region 文件路径web.config
        private static string _webconfigfile = string.Empty;
        /// <summary>
        /// 文件路径web.config
        /// </summary>
        public static string webconfigfile
        {
            get
            {
                if (string.IsNullOrEmpty(_webconfigfile)) _webconfigfile = HttpContext.Current.Server.MapPath("/web.config");
                return _webconfigfile;
            }
        }
        #endregion

        #region 文件路径App_Data/ShopConfig.config
        private static string _shopconfigfile = string.Empty;
        /// <summary>
        /// 文件路径App_Data/ShopConfig.config
        /// </summary>
        public static string shopconfigfile
        {
            get
            {
                if (string.IsNullOrEmpty(_shopconfigfile)) _shopconfigfile = HttpContext.Current.Server.MapPath("/App_Data/ShopConfig.config");
                return _shopconfigfile;
            }
        }
        #endregion

        #region 文件路径App_Data/SiteConfig.config
        private static string _siteconfigfile = string.Empty;
        /// <summary>
        /// 文件路径App_Data/SiteConfig.config
        /// </summary>
        public static string siteconfigfile
        {
            get
            {
                if (string.IsNullOrEmpty(_siteconfigfile)) _siteconfigfile = HttpContext.Current.Server.MapPath("/App_Data/SiteConfig.config");
                return _siteconfigfile;
            }
        }
        #endregion

        #region 文件路径App_Data/Template.config
        private static string _templateconfigfile = string.Empty;
        /// <summary>
        /// 文件路径App_Data/Template.config
        /// </summary>
        public static string templateconfigfile
        {
            get
            {
                if (string.IsNullOrEmpty(_templateconfigfile)) _templateconfigfile = HttpContext.Current.Server.MapPath("/App_Data/Template.config");
                return _templateconfigfile;
            }
        }
        #endregion

        #region 删除缓存
        /// <summary>
        /// 删除缓存
        /// </summary>
        /// <param name="CacheKey">键</param>
        public static void DeleteCache(string CacheKey)
        {
            HttpRuntime.Cache.Remove(CacheKey);
        }
        #endregion

        #region 获取缓存,依赖时间
        /// <summary>
        /// 获取缓存,依赖时间
        /// </summary>
        /// <param name="CacheKey">键</param>
        /// <returns></returns>
        public static object GetCache(string CacheKey)
        {
            object obj_time=HttpRuntime.Cache[CacheKey + "_time"];
            object obj_cache=HttpRuntime.Cache[CacheKey];
            if (obj_time != null && obj_cache!=null)
            {
                if (Convert.ToDateTime(obj_time) < DateTime.Now)
                {
                    DeleteCache(CacheKey);
                    DeleteCache(CacheKey + "_time");
                    return null;
                }
                else return obj_cache;
            }
            else
            {
                DeleteCache(CacheKey);
                DeleteCache(CacheKey+"_time");
                return null;
            }
        }
        #endregion

        #region 获取缓存,依赖文件
        /// <summary>
        /// 获取缓存,依赖文件
        /// </summary>
        /// <param name="CacheKey">键</param>
        /// <param name="depFile">依赖的文件</param>
        /// <returns></returns>
        public static object GetCache(string CacheKey, string depFile)
        {
            object obj_time = HttpRuntime.Cache[CacheKey + "_time"];
            object obj_cache = HttpRuntime.Cache[CacheKey];
            if (File.Exists(depFile))
            {
                FileInfo fi = new FileInfo(depFile);

                if (obj_time != null && obj_cache != null)
                {
                    if (Convert.ToDateTime(obj_time) != fi.LastWriteTime)
                    {
                        DeleteCache(CacheKey);
                        DeleteCache(CacheKey + "_time");
                        return null;
                    }
                    else return obj_cache;
                }
                else
                {
                    DeleteCache(CacheKey);
                    DeleteCache(CacheKey + "_time");
                    return null;
                }
            }
            else
            {
                throw new Exception("文件(" + depFile + ")不存在!");
            }
        } 
        #endregion

        #region 简单的插入缓存
        /// <summary>
        /// 简单的插入缓存
        /// </summary>
        /// <param name="CacheKey">键</param>
        /// <param name="objObject">数据</param>
        public static void SetCache(string CacheKey, object objObject)
        {
            HttpRuntime.Cache.Insert(CacheKey, objObject);
        }
        #endregion

        #region 有过期时间的插入缓存数据
        /// <summary>
        /// 有过期时间的插入缓存数据
        /// </summary>
        /// <param name="CacheKey">键</param>
        /// <param name="objObject">数据</param>
        /// <param name="absoluteExpiration">过期时间</param>
        /// <param name="slidingExpiration">可调度参数,传null就是禁用可调度</param>
        public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
        {
            if (slidingExpiration == null) slidingExpiration = Cache.NoSlidingExpiration;
            HttpRuntime.Cache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
            HttpRuntime.Cache.Insert(CacheKey + "_time", absoluteExpiration, null, absoluteExpiration, slidingExpiration);//存储过期时间
        }
        #endregion

        #region 插入缓存数据,指定缓存多少秒
        /// <summary>
        /// 插入缓存数据,指定缓存多少秒
        /// </summary>
        /// <param name="CacheKey">缓存的键</param>
        /// <param name="objObject">缓存的数据</param>
        /// <param name="seconds">缓存秒数</param>
        /// <param name="slidingExpiration">传null就是禁用可调度过期</param>
        public static void SetCacheSecond(string CacheKey, object objObject, int seconds, TimeSpan slidingExpiration)
        {
            DateTime absoluteExpiration = DateTime.Now.AddSeconds(seconds);
            if (slidingExpiration == null) slidingExpiration = Cache.NoSlidingExpiration;
            HttpRuntime.Cache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
            HttpRuntime.Cache.Insert(CacheKey + "_time", absoluteExpiration, null, absoluteExpiration, slidingExpiration);//存储过期时间
        }
        #endregion

        #region 依赖文件的缓存,文件没改不会过期
        /// <summary>
        /// 依赖文件的缓存,文件没改不会过期
        /// </summary>
        /// <param name="CacheKey">键</param>
        /// <param name="objObject">数据</param>
        /// <param name="depfilename">依赖文件,可调用 DataCache 里的变量</param>
        public static void SetCacheDepFile(string CacheKey, object objObject, string depfilename)
        {
            //缓存依赖对象
            System.Web.Caching.CacheDependency dep = new System.Web.Caching.CacheDependency(depfilename);
            DateTime absoluteExpiration = System.Web.Caching.Cache.NoAbsoluteExpiration;
            TimeSpan slidingExpiration=System.Web.Caching.Cache.NoSlidingExpiration;
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(
                CacheKey,
                objObject,
                dep,
                System.Web.Caching.Cache.NoAbsoluteExpiration, //从不过期
                slidingExpiration, //禁用可调过期
                System.Web.Caching.CacheItemPriority.Default,
                null);
            if (File.Exists(depfilename))
            {
                FileInfo fi = new FileInfo(depfilename);
                DateTime lastWriteTime = fi.LastWriteTime;
                HttpRuntime.Cache.Insert(CacheKey + "_time", lastWriteTime, null, absoluteExpiration, slidingExpiration);//存储文件最后修改时间
            }

        }
        #endregion
    }
}


相关文章
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
3月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
24天前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
1月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
25 0
|
3月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
|
3月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
|
3月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
3月前
|
缓存 开发框架 .NET
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
|
3月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
68 0
|
3月前
|
存储 缓存 开发框架
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存