文章出處

緩存存儲在文件中,根據過期時間過期,也可以手動刪除。IIS回收進程時緩存不丟失。

代碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;

namespace Common.Utils
{
    /// <summary>
    /// 緩存工具類
    /// </summary>
    public static class CacheUtil
    {
        #region 變量
        /// <summary>
        /// 緩存路徑
        /// </summary>
        private static string folderPath = Application.StartupPath + "\\cache";
        /// <summary>
        ////// </summary>
        private static object _lock = new object();
        private static BinaryFormatter formatter = new BinaryFormatter();
        #endregion

        #region 構造函數
        static CacheUtil()
        {
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }
        }
        #endregion

        #region SetValue 保存鍵值對
        /// <summary>
        /// 保存鍵值對
        /// </summary>
        public static void SetValue(string key, object value, int expirationMinutes = 0)
        {
            CacheData data = new CacheData(key, value);
            data.updateTime = DateTime.Now;
            data.expirationMinutes = expirationMinutes;

            string keyMd5 = GetMD5(key);
            string path = folderPath + "\\" + keyMd5 + ".txt";
            lock (_lock)
            {
                using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    fs.SetLength(0);
                    formatter.Serialize(fs, data);
                    fs.Close();
                }
            }
        }
        #endregion

        #region GetValue 獲取鍵值對
        /// <summary>
        /// 獲取鍵值對
        /// </summary>
        public static object GetValue(string key)
        {
            string keyMd5 = GetMD5(key);
            string path = folderPath + "\\" + keyMd5 + ".txt";
            if (File.Exists(path))
            {
                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    CacheData data = (CacheData)formatter.Deserialize(fs);
                    fs.Close();
                    if (data.expirationMinutes > 0 && DateTime.Now.Subtract(data.updateTime).TotalMinutes > data.expirationMinutes)
                    {
                        File.Delete(path);
                        return null;
                    }
                    return data.value;
                }
            }
            return null;
        }
        #endregion

        #region Delete 刪除
        /// <summary>
        /// 刪除
        /// </summary>
        public static void Delete(string key)
        {
            string keyMd5 = GetMD5(key);
            string path = folderPath + "\\" + keyMd5 + ".txt";
            if (File.Exists(path))
            {
                lock (_lock)
                {
                    File.Delete(path);
                }
            }
        }
        #endregion

        #region DeleteAll 全部刪除
        /// <summary>
        /// 全部刪除
        /// </summary>
        public static void DeleteAll()
        {
            string[] files = Directory.GetFiles(folderPath);
            foreach (string file in files)
            {
                File.Delete(file);
            }
        }
        #endregion

        #region 計算MD5值
        /// <summary>
        /// 計算MD5值
        /// </summary>
        private static string GetMD5(string value)
        {
            string base64 = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(value)).Replace("/", "-");
            if (base64.Length > 200)
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] bArr = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(value));
                StringBuilder sb = new StringBuilder();
                foreach (byte b in bArr)
                {
                    sb.Append(b.ToString("x2"));
                }
                return sb.ToString();
            }
            return base64;
        }
        #endregion
    }

    #region CacheData 緩存數據
    /// <summary>
    /// 緩存數據
    /// </summary>
    [Serializable]
    public class CacheData
    {
        /// <summary>
        ////// </summary>
        public string key { get; set; }
        /// <summary>
        ////// </summary>
        public object value { get; set; }
        /// <summary>
        /// 緩存更新時間
        /// </summary>
        public DateTime updateTime { get; set; }
        /// <summary>
        /// 過期時間(分鐘),0表示永不過期
        /// </summary>
        public int expirationMinutes { get; set; }

        public CacheData(string key, object value)
        {
            this.key = key;
            this.value = value;
        }
    }
    #endregion

}
View Code

帶文件依賴版:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Web;

namespace Common.Utils
{
    /// <summary>
    /// 緩存工具類
    /// 緩存數據存儲在文件中
    /// </summary>
    public static class CacheUtil
    {
        #region 變量
        /// <summary>
        ////// </summary>
        private static object _lock = new object();
        private static BinaryFormatter formatter = new BinaryFormatter();
        #endregion

        #region SetValue 保存鍵值對
        /// <summary>
        /// 保存鍵值對
        /// </summary>
        public static void SetValue(HttpServerUtilityBase server, string key, object value, string dependentFilePath, int expirationMinutes = 0)
        {
            CacheData data = new CacheData(key, value);
            data.updateTime = DateTime.Now;
            data.expirationMinutes = expirationMinutes;
            data.dependentFilePath = dependentFilePath;

            string folderPath = server.MapPath("~/bin/cache");
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }

            string keyMd5 = GetMD5(key);
            string path = folderPath + "\\" + keyMd5 + ".txt";
            lock (_lock)
            {
                using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    fs.SetLength(0);
                    formatter.Serialize(fs, data);
                    fs.Close();
                }
            }
        }
        #endregion

        #region GetValue 獲取鍵值對
        /// <summary>
        /// 獲取鍵值對
        /// </summary>
        public static object GetValue(HttpServerUtilityBase server, string key)
        {
            string keyMd5 = GetMD5(key);
            string folderPath = server.MapPath("~/bin/cache");
            string path = folderPath + "\\" + keyMd5 + ".txt";
            if (File.Exists(path))
            {
                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    CacheData data = (CacheData)formatter.Deserialize(fs);
                    fs.Close();
                    FileInfo fileInfo = new FileInfo(data.dependentFilePath);
                    if (fileInfo.LastWriteTime > data.updateTime)
                    {
                        File.Delete(path);
                        return null;
                    }
                    if (data.expirationMinutes > 0 && DateTime.Now.Subtract(data.updateTime).TotalMinutes > data.expirationMinutes)
                    {
                        File.Delete(path);
                        return null;
                    }
                    return data.value;
                }
            }
            return null;
        }
        #endregion

        #region Delete 刪除
        /// <summary>
        /// 刪除
        /// </summary>
        public static void Delete(HttpServerUtilityBase server, string key)
        {
            string keyMd5 = GetMD5(key);
            string folderPath = server.MapPath("~/bin/cache");
            string path = folderPath + "\\" + keyMd5 + ".txt";
            File.Delete(path);
        }
        #endregion

        #region DeleteAll 全部刪除
        /// <summary>
        /// 全部刪除
        /// </summary>
        public static void DeleteAll(HttpServerUtilityBase server)
        {
            string folderPath = server.MapPath("~/bin/cache");
            string[] files = Directory.GetFiles(folderPath);
            foreach (string file in files)
            {
                File.Delete(file);
            }
        }
        #endregion

        #region 計算MD5值
        /// <summary>
        /// 計算MD5值
        /// </summary>
        private static string GetMD5(string value)
        {
            string base64 = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(value)).Replace("/", "-");
            if (base64.Length > 200)
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] bArr = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(value));
                StringBuilder sb = new StringBuilder();
                foreach (byte b in bArr)
                {
                    sb.Append(b.ToString("x2"));
                }
                return sb.ToString();
            }
            return base64;
        }
        #endregion
    }

    #region CacheData 緩存數據
    /// <summary>
    /// 緩存數據
    /// </summary>
    [Serializable]
    public class CacheData
    {
        /// <summary>
        ////// </summary>
        public string key { get; set; }
        /// <summary>
        ////// </summary>
        public object value { get; set; }
        /// <summary>
        /// 緩存更新時間
        /// </summary>
        public DateTime updateTime { get; set; }
        /// <summary>
        /// 過期時間(分鐘),0表示永不過期
        /// </summary>
        public int expirationMinutes { get; set; }
        /// <summary>
        /// 緩存依賴文件路徑
        /// </summary>
        public string dependentFilePath { get; set; }

        public CacheData(string key, object value)
        {
            this.key = key;
            this.value = value;
        }
    }
    #endregion

}
View Code

帶文件依賴版使用示例:

public class ProductController : Controller
{
    #region details頁面
    public ActionResult details(string name)
    {
        ViewBag.menu = "product";

        string headKey = "NetCMS.Web.Controllers.ProductController.details.head." + name;
        string bodyKey = "NetCMS.Web.Controllers.ProductController.details.body." + name;
        string dependentFilePath = Server.MapPath("~/Theme/pages/product/" + name + ".html");

        List<string> fileList = Directory.GetFiles(Server.MapPath("~/") + "Theme\\pages\\product").ToList();
        string file = fileList.Find(a =>
        {
            string fileName = Path.GetFileNameWithoutExtension(a);
            if (name == fileName)
            {
                return true;
            }
            return false;
        });

        string html = string.Empty;
        if (CacheUtil.GetValue(Server, headKey) == null || CacheUtil.GetValue(Server, bodyKey) == null)
        {
            using (StreamReader sr = new StreamReader(file))
            {
                html = sr.ReadToEnd();
                sr.Close();
            }
        }

        string body = string.Empty;
        string pre = "\"" + Url.Content("~/");
        body = (string)CacheUtil.GetValue(Server, bodyKey);
        if (body == null)
        {
            Regex reg = new Regex(@"<!--\s*頭部結束\s*-->((?:[\s\S])*)<!--\s*公共底部\s*-->", RegexOptions.IgnoreCase);
            Match m = reg.Match(html);
            if (m.Success)
            {
                body = m.Groups[1].Value;
            }
            else
            {
                body = string.Empty;
            }

            body = body.Replace("\"js/", pre + "Theme/js/");
            body = body.Replace("\"css/", pre + "Theme/css/");
            body = body.Replace("\"images/", pre + "Theme/images/");
            body = body.Replace("(images/", "(" + Url.Content("~/") + "Theme/images/");
            body = body.Replace("('images/", "('" + Url.Content("~/") + "Theme/images/");
            body = body.Replace("\"uploads/", pre + "Theme/uploads/");
            body = body.Replace("('uploads/", "('" + Url.Content("~/") + "Theme/images/");
            body = HtmlUtil.RemoveBlank(body);
            CacheUtil.SetValue(Server, bodyKey, body, dependentFilePath);
        }

        ViewBag.body = body;

        string head = string.Empty;
        head = (string)CacheUtil.GetValue(Server, headKey);
        if (head == null)
        {
            Regex regHead = new Regex(@"<head>((?:[\s\S])*)</head>", RegexOptions.IgnoreCase);
            Match mHead = regHead.Match(html);
            if (mHead.Success)
            {
                head = mHead.Groups[1].Value;
            }
            else
            {
                head = string.Empty;
            }

            head = head.Replace("\"js/", pre + "Theme/js/");
            head = head.Replace("\"css/", pre + "Theme/css/");
            head = head.Replace("\"images/", pre + "Theme/images/");
            head = head.Replace("(images/", "(" + Url.Content("~/") + "Theme/images/");
            head = head.Replace("('images/", "('" + Url.Content("~/") + "Theme/images/");
            head = head.Replace("\"uploads/", pre + "Theme/uploads/");
            head = head.Replace("('uploads/", "('" + Url.Content("~/") + "Theme/images/");
            CacheUtil.SetValue(Server, headKey, head, dependentFilePath);
        }

        ViewBag.head = head;

        return View();
    }
    #endregion

}
View Code

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()