• 缓存处理类(MemoryCache结合文件缓存)


    想提升站点的性能,于是增加了缓存,但是站点不会太大,于是不会到分布式memcached的缓存和redis这个nosql库,于是自己封装了.NET内置的缓存组件

    原先使用System.Web.Caching.Cache,但是asp.net会在System.Web.Caching.Cache缓存页面等数据,于是替换了System.Web.Caching.Cache为MemoryCache。

    而在使用MemoryCache的时候,重新启动网站会丢失缓存,于是加了自己的扩展,将缓存序列化存放在文件内,在缓存丢的时候从文件内获取缓存,做了简易的扩展。(现在应用在我的Cactus里面)

    using System;
    using System.Collections;
    using System.Web;
    using System.Text;
    using System.IO;
    using System.Runtime.Caching;
    using System.Diagnostics;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Configuration;
    using System.Collections.Generic;
    
    namespace Cactus.Common
    {
        /// <summary>
        /// 缓存对象数据结构
        /// </summary>
        [Serializable()]
        public class CacheData{
            public object Value { get;set;}
            public DateTime CreateTime { get; set; }
            public DateTimeOffset AbsoluteExpiration { get; set; }
            public DateTime FailureTime { get 
            { if (AbsoluteExpiration == System.Runtime.Caching.ObjectCache.InfiniteAbsoluteExpiration) 
                {
                    return AbsoluteExpiration.DateTime;
                } 
                else { return CreateTime.AddTicks(AbsoluteExpiration.Ticks); } } 
            }
            public CacheItemPriority Priority { get; set; }
        }
        
        /// <summary>
        /// 缓存处理类(MemoryCache)
        /// </summary>
        public class CacheHelper
        {
            //在应用程序的同级目录(主要防止外部访问)
            public static string filePath = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.ConnectionStrings["filecache"].ConnectionString);
            //文件扩展名
            public static string fileExt = ".cache";
            /// <summary>
            /// 获取数据缓存
            /// </summary>
            /// <param name="cacheKey"></param>
            public static object GetCache(string cacheKey)
            {
                //System.Web.Caching.Cache objCache = HttpRuntime.Cache;
                //return objCache[cacheKey];
                long i=System.Runtime.Caching.MemoryCache.Default.GetCount();
                CacheItem objCache=System.Runtime.Caching.MemoryCache.Default.GetCacheItem(cacheKey);
                if (objCache == null)
                {
                    string _filepath = filePath + cacheKey + fileExt;
                    if (File.Exists(_filepath))
                    {
                        FileStream _file = File.OpenRead(_filepath);
                        if (_file.CanRead)
                        {
                            Debug.WriteLine("缓存反序列化获取数据:" + cacheKey);
                            object obj = CacheHelper.BinaryDeSerialize(_file);
                            CacheData _data = (CacheData)obj;
                            if (_data != null)
                            {
                                //判断是否过期
                                if (_data.FailureTime >= DateTime.Now)
                                {
                                    //将数据添加到内存
                                    CacheHelper.SetCacheToMemory(cacheKey, _data);
                                    return _data.Value;
                                }
                                else
                                {
                                    Debug.WriteLine("数据过期:" + cacheKey);
                                    File.Delete(_filepath);
                                    //数据过期
                                    return null;
                                }
                            }
                            else { return null; }
                        }
                        else { return null; }
                    }
                    else { return null; }
                }
                else {
                    CacheData _data = (CacheData)objCache.Value;
                    return _data.Value;
                }
            }
            /// <summary>
            /// 内存缓存数
            /// </summary>
            /// <returns></returns>
            public static object GetCacheCount()
            {
                return System.Runtime.Caching.MemoryCache.Default.GetCount();
            }
            /// <summary>
            /// 文件缓存数
            /// </summary>
            /// <returns></returns>
            public static object GetFileCacheCount()
            {
                DirectoryInfo di = new DirectoryInfo(filePath);
                return di.GetFiles().Length;
            }
                    
            /// <summary>
            /// 设置数据缓存
            /// </summary>
            public static bool SetCache(string cacheKey, object objObject, CacheItemPolicy policy)
            {
                //System.Web.Caching.Cache objCache = HttpRuntime.Cache;            
                //objCache.Insert(cacheKey, objObject);
                string _filepath = filePath + cacheKey + fileExt;
                if (Directory.Exists(filePath)==false) {
                    Directory.CreateDirectory(filePath);
                }
                //设置缓存数据的相关参数
                CacheData data = new CacheData() { Value = objObject, CreateTime = DateTime.Now, AbsoluteExpiration = policy.AbsoluteExpiration, Priority = policy.Priority };
                CacheItem objCache = new CacheItem(cacheKey, data);
                FileStream stream = null;
                if (File.Exists(_filepath) == false)
                {
                    stream = new FileStream(_filepath, FileMode.CreateNew, FileAccess.Write, FileShare.Write);
                }
                else {
                    stream = new FileStream(_filepath, FileMode.Create, FileAccess.Write, FileShare.Write);
                }
                Debug.WriteLine("缓存序列化设置数据:" + cacheKey);
                CacheHelper.BinarySerialize(stream, data);
                return System.Runtime.Caching.MemoryCache.Default.Add(objCache, policy);
            }
            public static bool SetCacheToMemory(string cacheKey, CacheData data)
            {
                CacheItemPolicy policy = new CacheItemPolicy();
                CacheItem objCache = new CacheItem(cacheKey, data);
                policy.AbsoluteExpiration = data.AbsoluteExpiration;
                policy.Priority = CacheItemPriority.NotRemovable;
                return System.Runtime.Caching.MemoryCache.Default.Add(objCache, policy);
            }
    
            public static bool SetCache(string cacheKey, object objObject, DateTimeOffset AbsoluteExpiration)
            {
                //System.Web.Caching.Cache objCache = HttpRuntime.Cache;            
                //objCache.Insert(cacheKey, objObject);
                CacheItemPolicy _priority = new CacheItemPolicy();
                _priority.Priority = CacheItemPriority.NotRemovable;
                _priority.AbsoluteExpiration = AbsoluteExpiration;
                return SetCache(cacheKey, objObject, _priority);
            }
    
            public static bool SetCache(string cacheKey, object objObject, CacheItemPriority priority)
            {
                //System.Web.Caching.Cache objCache = HttpRuntime.Cache;            
                //objCache.Insert(cacheKey, objObject);
                CacheItemPolicy _priority = new CacheItemPolicy();
                _priority.Priority = priority;
                _priority.AbsoluteExpiration = System.Runtime.Caching.ObjectCache.InfiniteAbsoluteExpiration;
                return SetCache(cacheKey, objObject, _priority);
            }
            /// <summary>
            /// 设置数据缓存
            /// </summary>
            public static bool SetCache(string cacheKey, object objObject)
            {
                //System.Web.Caching.Cache objCache = HttpRuntime.Cache;
                //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
                return CacheHelper.SetCache(cacheKey, objObject, System.Runtime.Caching.CacheItemPriority.NotRemovable);
            }
    
            /// <summary>
            /// 移除指定数据缓存
            /// </summary>
            public static void RemoveCache(string cacheKey)
            {
                //System.Web.Caching.Cache cache = HttpRuntime.Cache;
                //cache.Remove(cacheKey);
                System.Runtime.Caching.MemoryCache.Default.Remove(cacheKey);
                string _filepath = filePath + cacheKey + fileExt;
                File.Delete(_filepath);
            }
    
            /// <summary>
            /// 移除全部缓存
            /// </summary>
            public static void RemoveAllCache()
            {
                //System.Web.Caching.Cache cache = HttpRuntime.Cache;
                //IDictionaryEnumerator cacheEnum = cache.GetEnumerator();
                //while (cacheEnum.MoveNext())
                //{
                //    cache.Remove(cacheEnum.Key.ToString());
                //}
                MemoryCache _cache = System.Runtime.Caching.MemoryCache.Default;
                foreach (var _c in _cache.GetValues(null))
                {
                    _cache.Remove(_c.Key);
                }
                DirectoryInfo di = new DirectoryInfo(filePath);
                di.Delete(true);
            }
            /// <summary>
            /// 清除指定缓存
            /// </summary>
            /// <param name="type">1:内存 2:文件</param>
            public static void RemoveAllCache(int type)
            {
                if (type == 1) 
                {
                    MemoryCache _cache = System.Runtime.Caching.MemoryCache.Default;
                    foreach (var _c in _cache.GetValues(null))
                    {
                        _cache.Remove(_c.Key);
                    }
                } 
                else if (type == 2)
                {
                    DirectoryInfo di = new DirectoryInfo(filePath);
                    di.Delete(true);
                } 
            }
    
            #region 流序列化
            public static void BinarySerialize(Stream stream, object obj)
            {
                try
                {
                    stream.Seek(0, SeekOrigin.Begin);
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(stream, obj);
                }
                catch (Exception e)
                {
                    IOHelper.WriteDebug(e);
                }
                finally
                {
                    //stream.Close();
                    stream.Dispose();
                }
            }
    
            public static object BinaryDeSerialize(Stream stream)
            {
                object obj = null;
                stream.Seek(0, SeekOrigin.Begin);
                try
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    obj = formatter.Deserialize(stream);
                }
                catch (Exception e)
                {
                    IOHelper.WriteDebug(e);
                }
                finally
                {
                    //stream.Close();
                    stream.Dispose();
                }
                return obj;
            }
            #endregion
        }
    }
  • 相关阅读:
    nodejs访问mysql数据库工具ali-mysql-client
    谈谈数据监听observable的实现
    【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi
    我的微型工作流引擎-办公应用实战
    我的微型工作流引擎-功能解析及API设计
    我的微型工作流引擎设计
    给Asp.Net MVC及WebApi添加路由优先级
    通用的业务编码规则设计实现
    快速开发之代码生成器(asp.net mvc4 + easyui + knockoutjs)
    利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)
  • 原文地址:https://www.cnblogs.com/RainbowInTheSky/p/5557936.html
Copyright © 2020-2023  润新知